Перейти к содержимому

ethtool: диагностика и тюнинг сетевого интерфейса

Проблемы с сетевой картой редко видны снаружи — интерфейс поднят, IP назначен, iptables молчит, а потери пакетов или микрофризы проявляются только под нагрузкой. ethtool даёт прямой доступ к состоянию железа, драйвера и offload-механизмов, которые не показывает ни ip, ни netstat.

Базовый вывод: состояние линка

Установка элементарна:

# RHEL/Alma/Rocky
sudo dnf install ethtool -y

# Debian/Ubuntu
sudo apt install ethtool

Без флагов ethtool выводит сводку по интерфейсу:

$ ethtool eth0
Settings for eth0:
    Supported ports: [ TP ]
    Supported link modes:   1000baseT/Full
    Supported pause frame use: Symmetric
    Supported auto-negotiation: Yes
    Advertised link modes:  1000baseT/Full
    Advertised pause frame use: Symmetric
    Advertised auto-negotiation: Yes
    Speed: 1000Mb/s
    Duplex: Full
    Port: Twisted Pair
    PHYAD: 0
    Transceiver: internal
    Auto-negotiation: on
    MDI-X: Unknown
    Link detected: yes

Первое, что проверяю при жалобах на сетевые проблемы — поле Link detected. Если no, кабель или трансивер мёртв. Speed и Duplex подскажут, не сбросился ли линк до 100Mb/s или half-duplex.

Драйвер и оборудование: -i и -a

-i показывает информацию о драйвере:

$ ethtool -i eth0
driver: ixgbe
version: 5.19.0
firmware-version: 0x8000095d
expansion-rom-version: [trimmed]
bus-info: 0000:01:00.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes

Версия firmware критична для Intel и Broadcom — старые версии грешат известными багами. Если не видишь счётчики ошибок, которые ожидаешь, обнови прошивку, а не драйвер.

-a показывает настройки автопереговоров (auto-negotiation) и паузы:

$ ethtool -a eth0
Pause parameters for eth0:
Autonegotiate:  on
RX:             on
TX:             on
Предупреждение

Отключение flow control на одном конце линка без согласования на другом вызывает проблемы с потерями при突发ном трафике. Если на свиче PAUSE выключен — выключай и на хосте.

Скорость и дуплекс: -s и autoneg

-s меняет параметры интерфейса. Для изменения скорости и дуплекса автопереговоры сначала отключаются, потом задаются параметры:

# Фиксируем 1G full-duplex, отключаем автопереговоры
sudo ethtool -s eth0 speed 1000 duplex full autoneg off

# Включаем обратно
sudo ethtool -s eth0 autoneg on

После изменения параметров проверь линк повторно — не все карты корректно пересогласуются без переподнятия интерфейса.

Флаг 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 гарантирует сохранение после перезагрузки:

# RHEL-style: /etc/sysconfig/network-scripts/ifcfg-eth0
ETHTOOL_OPTS="speed 1000 duplex full autoneg off"

Offload-флаги: -k, -K и типичные подводные камни

-k показывает текущие offload-флаги, -K изменяет их:

$ ethtool -k eth0 | head -20
Features for eth0:
tcp-segment-offload: on
tcp-segment-offload: on [fixed]
generic-segment-offload: on
generic-receive-offload: on
generic-segment-offload: on [fixed]
large-receive-offload: on
rx-vlan-offload: on
tx-vlan-offload: on [fixed]
ntuple-filters: off [fixed]
receive-hashing: off

Метка [fixed] означает, что флаг аппаратный и не изменяется.

Отключение offload-флага — частая причина проблем с VPN, мониторингом и виртуализацией:

# Отключаем TSO, чтобы ядро отправляло сырые сегменты
sudo ethtool -K eth0 tso off

# Отключаем VLAN offload, если драйвер фильтра 802.1Q кривой
sudo ethtool -K eth0 rxvlan off txvlan off

# Проверяем изменения
ethtool -k eth0 | grep -E 'tcp-segment|vlan'
Примечание

GRO (generic-receive-offload) и TSO (tcp-segment-offload) работают в паре. Отключение одного без другого вызывает фрагментацию на уровне ядра — CPU на ровном месте подскакивает.

Статистика: -S и поиск потерь пакетов

-S выводит статистику драйвера. Формат и набор счётчиков зависят от драйвера:

$ ethtool -S eth0 | grep -E 'error|drop|miss'
     rx_errors: 0
     tx_errors: 0
     rx_dropped: 0
     tx_dropped: 0
     multicast: 42
     rx_no_buffer_count: 0
     rx_missed_errors: 0

Для Intel (ixgbe, i40e) релевантные счётчики:

$ ethtool -S eth0 | grep -iE 'flow-director|rss|mbus|over'
     rx_fifo_errors: 0
     rx_pause_pfc_ignored: 0
     tx_fifo_errors: 0
Подсказка

Счётчики rx_fifo_errors и tx_fifo_errors — индикатор перегрузки. Если растут при нормальной утилизации CPU, проблема в памяти или в шине.

Для поиска проблем в скрипте:

#!/bin/bash
IFACE=${1:-eth0}
ethtool -S $IFACE | awk '/error|drop|miss|overflow|fifo|discard/ {if ($2 > 0) print}'

Запускай периодически через cron — пиковые скачки потерь потом не найдёшь.

Задачаip linkethtool
Поднять/опустить интерфейсip link set eth0 up/downнет
MAC-адресip link show eth0нет
MTUip link set eth0 mtu 9000нет
Скорость/дуплекснетethtool -s eth0 speed 1000 duplex full
Auto-negotiationнетethtool -s eth0 autoneg off
Offload-флагичастично через ethtool -kethtool -K eth0 tso off
Статистика ошибокip -s link show eth0ethtool -S eth0 (детальнее)
Информация о драйверенетethtool -i eth0
Wake-on-LANнетethtool eth0 (вывод в конце)

ethtool не заменяет ip, а дополняет. Стек сетевой конфигурации: ip link → ip addr → ethtool → tc.

Troubleshooting: link/duplex mismatch

Классический сценарий: сервер и свитч не договорились о параметрах. Проявления — линк есть, пинги идут, но под нагрузкой резкие потери.

Алгоритм диагностики:

# 1. Проверяем, что видит хост
ethtool eth0 | grep -E 'Speed|Duplex|Auto-negotiation|Link'

# 2. Смотрим счётчики ошибок
ethtool -S eth0 | grep -iE 'error|drop|miss|fifo'

# 3. Сравниваем с соседом
# На коммутаторе (Cisco): show interfaces GigabitEthernet0/1

# 4. Фиксируем параметры с двух сторон
# На хосте:
sudo ethtool -s eth0 speed 1000 duplex full autoneg off

# На свитче (Cisco):
interface Gi0/1
  speed 1000
  duplex full
  no negotiate
Предупреждение

Всегда согласуй оба конца. Если на свиче фиксированный режим без autoneg, а на хосте autoneg включен — cтандарт 802.3 обязывает хост использовать fallback-логику, но вендоры реализуют её криво.

Если после согласования параметров интерфейс всё ещё теряет пакеты — смотри в сторону:

  • Драйвер и firmware: обнови прошивку сетевой карты
  • Кабель или трансивер: SFP-модуль на 10G, подключённый в 1G-порт без автопереговоров — гарантированные потери
  • Проблемы с RSS и прерываниями: cat /proc/interrupts | grep eth0, проверь балансировку IRQ