Сеть «работает, но медленно» — худший класс инцидентов: приложение жалуется на задержки, а коммутатор и графики молчат. В большинстве случаев ответ даёт ethtool: он показывает, на какой скорости реально поднялся линк, какие ошибки считает карта и не отключены ли аппаратные ускорения. Разберём диагностику от кабеля до настроек драйвера.
Базовая проверка линка
Первая команда выводит согласованную скорость, дуплекс, состояние автосогласования и поддерживаемые режимы. Если вместо 10000 видно 100, дальше искать нечего: проблема на физическом уровне.
ethtool eth0
ethtool -i eth0
ip -s link show eth0
dmesg | grep -i eth0 | tail -20
Блок Speed и Duplex показывает текущее согласование, Link detected — наличие несущей. В разделе Supported link modes перечислено, что умеет карта, в Advertised — что она предлагает партнёру. Расхождение этих списков часто объясняет, почему линк поднялся на низкой скорости.
Драйвер и железо
Флаг -i отдаёт имя драйвера, версию, прошивку и PCI-адрес. По нему находят карту в lspci и проверяют, не перешла ли она на слот с меньшим числом линий.
ethtool -i eth0
lspci -vv -s 0000:03:00.0 | grep -E 'LnkCap|LnkSta'
cat /sys/class/net/eth0/device/numa_node
Строка LnkSta показывает фактическую ширину PCIe. Если карта рассчитана на x8, а работает на x1, пропускной способности не хватит даже при честных 10G на порту. Проверьте также numa_node: карта на дальнем NUMA-узле добавит задержку обработки прерываний.
Счётчики ошибок
Флаг -S выводит статистику драйвера. Набор полей зависит от модели, поэтому смотрите на смысл, а не на точные имена. Счётчики обнуляются при перезапуске драйвера или линка, поэтому снимайте дельту за интервал, а не абсолютное значение с момента загрузки.
ethtool -S eth0 | grep -Ei 'err|drop|miss|discard|timeout'
watch -n 2 'ethtool -S eth0 | grep -E "rx_crc|rx_missed|tx_errors"'
- rx_crc_errors растут — кабель, патч-панель или модуль SFP; данные бьются в пути.
- rx_missed_errors и rx_no_buffer — карта не успевает отдавать пакеты, нужен больший ring buffer.
- tx_errors и late collisions — почти всегда несовпадение дуплекса или скорости.
- rx_length_errors и rx_over_errors — проблемы на стороне партнёра или согласования кадра.
- Единичные drop при всплеске нагрузки нормальны, постоянный рост — нет.
Оффлоады
Флаг -k показывает состояние ускорений: контрольные суммы, сегментацию, GRO и LRO. Обычно они полезны, но при отладке и в виртуализации мешают.
ethtool -k eth0 | grep -E 'on|off'
sudo ethtool -K eth0 gro off
sudo ethtool -K eth0 tso off gso off
Если tcpdump показывает гигантские кадры или странные контрольные суммы, отключите GRO и TSO на время съёмки. В виртуальных машинах с пробросом карт отключение offload иногда лечит потерю пакетов. Не оставляйте такие настройки навсегда без замеров: они повышают нагрузку на процессор.
Кольца и коалесинг
Ring buffer — очередь дескрипторов между картой и ядром. Маленькое кольцо при всплеске трафика даёт дропы, большое добавляет задержку.
ethtool -g eth0
sudo ethtool -G eth0 rx 4096 tx 4096
ethtool -c eth0
sudo ethtool -C eth0 adaptive-rx on adaptive-tx on
Значения из блока Pre-set maximums — верхняя граница, которую примет драйвер. Настройка adaptive coalescing сама подбирает паузы между прерываниями: это разумный компромисс для смешанной нагрузки. Для биржевых и игровых задач, наоборот, коалесинг уменьшают до минимума.
Каналы и распределение прерываний
Многопоточная карта раскладывает очереди по ядрам. Если очередей меньше, чем ядер, часть ядер не участвует в обработке, и нагрузка ложится на меньшее число очередей.
ethtool -l eth0
sudo ethtool -L eth0 combined 8
ethtool -x eth0
grep eth0 /proc/interrupts | head
Число каналов не может превышать предел драйвера из блока Pre-set maximums. После изменения проверьте /proc/interrupts: прерывания должны распределиться по разным CPU, иначе включите irqbalance.
Модуль SFP и оптика
Для оптических трансиверов доступна диагностика DDM: температура, напряжение, ток смещения и мощность приёма-передачи. Это позволяет отличить умирающий модуль от грязного разъёма.
sudo ethtool -m eth0
sudo ethtool -p eth0 10
ethtool --show-fec eth0
ethtool -T eth0
Флаг -p мигает индикатором порта десять секунд — незаменимо в серверной, где кабели подписаны не вами. FEC показывает коррекцию ошибок: на 25G и выше она обязательна, а её отключение на одной стороне ломает линк. Rx power заметно ниже нормы обычно означает загрязнённый или пережатый патч-корд. Для медных портов модульная диагностика недоступна, зато пригодится ethtool —show-priv-flags: приватные флаги драйвера показывают энергосбережение и прочие особенности.
Скорость и дуплекс вручную
Автосогласование почти всегда лучше ручной настройки. Принудительное значение оправдано только на старом оборудовании, которое не умеет договариваться.
sudo ethtool -s eth0 speed 1000 duplex full autoneg off
sudo ethtool -r eth0
sudo ethtool -s eth0 autoneg on
Флаг -r перезапускает согласование без перезагрузки. Если после ручной настройки появились late collisions, значит, вторая сторона осталась на autoneg: такой режим работает нестабильно. Верните автосогласование на обоих концах.
Закрепление настроек
Изменения через ethtool живут до перезагрузки или перезапуска службы сети. В NetworkManager их задают свойствами подключения, а не скриптом.
nmcli -g ethtool.feature-gro con show eth0
sudo nmcli con mod eth0 ethtool.feature-gro off
sudo nmcli con mod eth0 ethtool.ring-rx 4096
sudo nmcli con up eth0
В systemd-networkd аналогичные параметры задаются в файле .link: секция Link поддерживает BitsPerSecond, Duplex и AutoNegotiation в свежих версиях systemd. После правки выполните networkctl reload и проверьте ethtool снова — настройка должна пережить перезагрузку.
Порядок диагностики
- Проверьте Link detected и согласованную скорость.
- Снимите -i и сверьте драйвер с прошивкой из документации вендора.
- Посмотрите рост ошибок за две минуты, а не общий счётчик с момента загрузки.
- Сравните счётчики на обоих концах линка и на коммутаторе.
- Отключите GRO только для теста и верните обратно.
- Замените кабель или модуль, если растут CRC-ошибки.
- Сверьте настройки скорости и дуплекса с обеих сторон линка.
Итог
ethtool превращает «сеть тормозит» в конкретную гипотезу: низкая скорость согласования, битый кабель, переполненное кольцо или отключённый offload. Держите под рукой четыре команды — ethtool, -i, -S и -k, — и фиксируйте настройки через NetworkManager, чтобы они не исчезли после перезагрузки. Остальное решается заменой железа и сверкой с документацией драйвера.