ethtool: диагностика и тюнинг сетевого интерфейса
Проблемы с сетевой картой редко видны снаружи — интерфейс поднят, IP назначен, iptables молчит, а потери пакетов или микрофризы проявляются только под нагрузкой. ethtool даёт прямой доступ к состоянию железа, драйвера и offload-механизмов, которые не показывает ни ip, ни netstat.
Базовый вывод: состояние линка
Установка элементарна:
Без флагов ethtool выводит сводку по интерфейсу:
Первое, что проверяю при жалобах на сетевые проблемы — поле Link detected. Если no, кабель или трансивер мёртв. Speed и Duplex подскажут, не сбросился ли линк до 100Mb/s или half-duplex.
Драйвер и оборудование: -i и -a
-i показывает информацию о драйвере:
Версия firmware критична для Intel и Broadcom — старые версии грешат известными багами. Если не видишь счётчики ошибок, которые ожидаешь, обнови прошивку, а не драйвер.
-a показывает настройки автопереговоров (auto-negotiation) и паузы:
Отключение flow control на одном конце линка без согласования на другом вызывает проблемы с потерями при突发ном трафике. Если на свиче PAUSE выключен — выключай и на хосте.
Скорость и дуплекс: -s и autoneg
-s меняет параметры интерфейса. Для изменения скорости и дуплекса автопереговоры сначала отключаются, потом задаются параметры:
После изменения параметров проверь линк повторно — не все карты корректно пересогласуются без переподнятия интерфейса.
| Флаг ethtool | Назначение |
|---|---|
speed N | Скорость в Mb/s (100, 1000, 10000, …) |
duplex full|half | Дуплекс |
autoneg on|off | Автопереговоры |
port tp|fiber|aui|bnc|mii | Тип порта (не на всех картах) |
advertise N | Битовая маска режимов для автопереговоров |
Все флаги комбинируются в одном вызове. Запись в /etc/sysconfig/network-scripts/ifcfg-eth0 (RHEL) или через systemd-override гарантирует сохранение после перезагрузки:
Offload-флаги: -k, -K и типичные подводные камни
-k показывает текущие offload-флаги, -K изменяет их:
Метка [fixed] означает, что флаг аппаратный и не изменяется.
Отключение offload-флага — частая причина проблем с VPN, мониторингом и виртуализацией:
GRO (generic-receive-offload) и TSO (tcp-segment-offload) работают в паре. Отключение одного без другого вызывает фрагментацию на уровне ядра — CPU на ровном месте подскакивает.
Статистика: -S и поиск потерь пакетов
-S выводит статистику драйвера. Формат и набор счётчиков зависят от драйвера:
Для Intel (ixgbe, i40e) релевантные счётчики:
Счётчики rx_fifo_errors и tx_fifo_errors — индикатор перегрузки. Если растут при нормальной утилизации CPU, проблема в памяти или в шине.
Для поиска проблем в скрипте:
Запускай периодически через cron — пиковые скачки потерь потом не найдёшь.
Сравнение с ip link: что покрывает ethtool
| Задача | ip link | ethtool |
|---|---|---|
| Поднять/опустить интерфейс | ip link set eth0 up/down | нет |
| MAC-адрес | ip link show eth0 | нет |
| MTU | ip link set eth0 mtu 9000 | нет |
| Скорость/дуплекс | нет | ethtool -s eth0 speed 1000 duplex full |
| Auto-negotiation | нет | ethtool -s eth0 autoneg off |
| Offload-флаги | частично через ethtool -k | ethtool -K eth0 tso off |
| Статистика ошибок | ip -s link show eth0 | ethtool -S eth0 (детальнее) |
| Информация о драйвере | нет | ethtool -i eth0 |
| Wake-on-LAN | нет | ethtool eth0 (вывод в конце) |
ethtool не заменяет ip, а дополняет. Стек сетевой конфигурации: ip link → ip addr → ethtool → tc.
Troubleshooting: link/duplex mismatch
Классический сценарий: сервер и свитч не договорились о параметрах. Проявления — линк есть, пинги идут, но под нагрузкой резкие потери.
Алгоритм диагностики:
Всегда согласуй оба конца. Если на свиче фиксированный режим без autoneg, а на хосте autoneg включен — cтандарт 802.3 обязывает хост использовать fallback-логику, но вендоры реализуют её криво.
Если после согласования параметров интерфейс всё ещё теряет пакеты — смотри в сторону:
- Драйвер и firmware: обнови прошивку сетевой карты
- Кабель или трансивер: SFP-модуль на 10G, подключённый в 1G-порт без автопереговоров — гарантированные потери
- Проблемы с RSS и прерываниями:
cat /proc/interrupts | grep eth0, проверь балансировку IRQ