Много dropped пакетов на интерфейсе.[linux]

YUAL

Господа, подскажите чем может быть вызвано такое кол-во дропнутых пакетов? Я так понимаю что если бы была проблема в физической передаче сигнала (кабель хреновый то было бы много error`ов. Куда вообще копать?

[fe02 ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:26:55:1A:A7:40
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:144427187 errors:0 dropped:1075593 overruns:0 frame:0
TX packets:87408193 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:20130010994 (18.7 GiB) TX bytes:55522993954 (51.7 GiB)
Interrupt:31 Memory:f8000000-f8012800
[fe02 ~]# cat /sys/class/net/eth0/device/uevent
DRIVER=bnx2
PCI_CLASS=20000
PCI_ID=14E4:1639
PCI_SUBSYS_ID=103C:7055
PCI_SLOT_NAME=0000:02:00.0
MODALIAS=pci:v000014E4d00001639sv0000103Csd00007055bc02sc00i00

Marinavo_0507

ethtool более подробную статистику показывает

oksan4ik79

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500  metric 1
inet 111.111.111.111 netmask 255.255.252.0 broadcast 111.111.111.255
inet6 fe80::16da:e9ff:feb7:1cd9 prefixlen 64 scopeid 0x20<link>
ether f8:d1:11:01:7a:62 txqueuelen 1000 (Ethernet)
RX packets 2704192505 bytes 1708330892842 (1.5 TiB)
RX errors 5 dropped 28052 overruns 0 frame 5
TX packets 2797185455 bytes 3022339474826 (2.7 TiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 48 base 0xc000

Решил проверить, у меня, оказывается, тоже куча dropped. Присоединяюсь к вопросу.
Из доп. инфы, на этом интерфейсе где-то неделю-две назад кольцо было в прилежащей к нему сети, возможно этим dropped и обусловлено.

YUAL

[fe02 ~]# ethtool -S eth0
NIC statistics:
rx_bytes: 20214478644
rx_error_bytes: 0
tx_bytes: 55583731204
tx_error_bytes: 0
rx_ucast_packets: 144601651
rx_mcast_packets: 4341
rx_bcast_packets: 1498
tx_ucast_packets: 87499432
tx_mcast_packets: 4018
tx_bcast_packets: 123
tx_mac_errors: 0
tx_carrier_errors: 0
rx_crc_errors: 0
rx_align_errors: 0
tx_single_collisions: 0
tx_multi_collisions: 0
tx_deferred: 0
tx_excess_collisions: 0
tx_late_collisions: 0
tx_total_collisions: 0
rx_fragments: 0
rx_jabbers: 0
rx_undersize_packets: 0
rx_oversize_packets: 0
rx_64_byte_packets: 0
rx_65_to_127_byte_packets: 133025184
rx_128_to_255_byte_packets: 296108
rx_256_to_511_byte_packets: 5884523
rx_512_to_1023_byte_packets: 37429
rx_1024_to_1522_byte_packets: 5364246
rx_1523_to_9022_byte_packets: 0
tx_64_byte_packets: 7384
tx_65_to_127_byte_packets: 50659956
tx_128_to_255_byte_packets: 705538
tx_256_to_511_byte_packets: 2828210
tx_512_to_1023_byte_packets: 26980
tx_1024_to_1522_byte_packets: 33275505
tx_1523_to_9022_byte_packets: 0
rx_xon_frames: 0
rx_xoff_frames: 0
tx_xon_frames: 0
tx_xoff_frames: 0
rx_mac_ctrl_frames: 0
rx_filtered_packets: 25393
rx_ftq_discards: 0
rx_discards: 0
rx_fw_discards: 1086921

Нашёл вроде баг в багзиле редхата. http://bugzilla.redhat.com/show_bug.cgi?id=484667
Но он пофикшен стопицот лет назад. Да и рядом у меня пачка таких же серверов на том же ядре работают без сбоев.
$ uname -a
Linux ***********.ru 2.6.32-220.7.1.el6.x86_64 SMP Wed Mar 7 00:52:02 GMT 2012 x86_64 x86_64 x86_64 GNU/Linux

Marinavo_0507

rx_filtered_packets: 25393
rx_fw_discards: 1086921
ну вот походу твои дропы
погугли теперь, что это означает

YUAL

фильтеред это айпитэйблс. по дроппедам я бегло погуглил - нагуглил тот баг что привёл.

Marinavo_0507

http://bugzilla.redhat.com/show_bug.cgi?id=640026 - тут вроде интересней

tokuchu

duplex одинаковый с двух сторон?

YUAL

гигабит же

tokuchu

гигабит же
Ну ладно. Я просто чего-то выше не узрел, что гигабитный линк.

sergey_m

rx_fw_discards это человеческим языком "no buffers", то есть на момент прихода пакета, все дескрипторы уже были заполнены и не обслужены драйвером. Не справляется твоя машина с нагрузкой.

YUAL

Странно. Нагрузка ничтожна для такого сервера. Сам видишь, что траффика пару десятков гигабайт. А могут какие-то пакеты создавать такой эффект? Проблема в том что каталист на другом в конце не в моей юриксдиции и посмотреть что там нельзя.

Marinavo_0507

а ты крутил настройки, как по моей ссылке делать предлагали?
убедился, что твой драйвер с фиксом, про который там говорят?

sergey_m

Такая проблема может возникать и при load average 0.01, суть в том, что операционная система по какой-то причине не успевает разгребать дескрипторы. В современных ОС, где гонятся за производительностью, входящие пакеты обрабатываются непосредственно в контексте прерывания. В прошлом прерывание только перекладывало пакет из ринга сетевой карты в софтварную очередь и скедулило софтварное прерывание. Такая обработка гарантировала быструю отработку прерывания, однако перекладывание в очередь, её локинг и переключение в другой контекст всё это давало низкую производительность. Поэтому сейчас непосредственно прерывание заходит в сетевой стек и там работает. Если там оно блокируется на чём-то (а вариантов очень много) даже на непродолжительное время, то сетевая карта переполняется. Классическая проблема - пуржинг каких-то кешей, он может длиться значительное время и держать при этом мьютексы, которые также нужны и тредам осуществляющим обработку входящих пакетов. Это всё общие теории, но я думаю, что в линуксе, скорее всего всё так же.

Marinavo_0507

Это всё общие теории, но я думаю, что в линуксе, скорее всего всё так же.
Скорее нет. В контексте прерывания не делается нифига, насколько я понимаю, так как сейчас везде NAPI.
По моей ссылке рассуждают о том, что карточка задерживает прерывания (что обычное дело для современных карт, и величина задержки настраивается за это время приходит дофига пакетов, а хост ничего не разгребает, поэтому лишние отбрасываются. Надо крутить эти настройки (насколько задерживать, и какой размер буфера).

YUAL

руки не дошли. завтра может попробую.

sergey_m

Это? http://en.wikipedia.org/wiki/New_API#NAPI_compliant_drivers Не вижу чем это отличается от обычного polling, который у нас был уже 10 лет как. :grin:
Если всё так, как написано в wikipedia, то вероятность получить no buffers ещё выше, чем с прерываниями. Если ядро по какой-то причине слишком редко поллит, то no buffers гарантированы.

Marinavo_0507

Не вижу чем это отличается от обычного polling, который у нас был уже 10 лет как.
Основное отличие в том, что у вас его не доделали (помнится надо было руками указывать частоту опроса и долю процессорного времени - что годится только для роутера, который больше ничего не делает) и (насколько я понял) бросили, а в линуксе это давно стандартная модель драйвера. Штука адаптивная: при малой нагрузке классическая схема, при большой - прерываний становится меньше вплоть до нуля, буфера разгребаются специальным тредом.
Если ядро по какой-то причине слишком редко поллит, то no buffers гарантированы.
При малой нагрузке причина проста - interrupt mitigations в железке, что и предлагается крутить.

sergey_m

При малой нагрузке причина проста - interrupt mitigations в железке, что и предлагается крутить.
Ты же сам выше говоришь что от прерываний вообще не зависит, да и wikipedia подтверждает.

Marinavo_0507

Ты же сам выше говоришь что от прерываний вообще не зависит, да и wikipedia подтверждает.
Не, я говорю, что в контексте прерывания не делают опрос железки, а только будят тред softirq (или не тред, там есть ещё какие-то механизмы - я несколько отстал от жизни, так как давно не хакал ядро).
В википедии написано что-то странное. Они наверное хотели сказать, что прерывания от сетевой карты запрещены, пока работает метод poll, но если нагрузка невелика, то он быстро завершается, и прерывания опять включаются.
То, что прерывания идут, можно проверить непосредственно. При большой нагрузке их меньше, это тоже можно проверить, но сложнее - нужна собственно нагрузка.
Оставить комментарий
Имя или ник:
Комментарий: