Czy w Linuksie jest sposób na uzyskanie statystyk dotyczących różnych powodów, dla których pakiety zostały odrzucone?
Na wszystkich interfejsach sieciowych (openSUSE 12.3) na kilku serwerach ifconfig
i netstat -i
zgłasza odrzucone pakiety w recepcji. Kiedy robię a tcpdump
, liczba upuszczanych pakietów przestaje rosnąć, co oznacza, że kolejki interfejsów nie są pełne i upuszczam dane. Dlatego muszą istnieć inne powody, dla których tak się dzieje (np. Odebrano punkty multiemisji, podczas gdy interfejs nie należy do tej grupy multiemisji).
Gdzie mogę znaleźć takie informacje? (/ proc? / sys? niektóre logi?)
Przykład statystyki (scalenie danych wyjściowych / sys / class / net / <dev> / statistics i ethtool):
alloc_rx_buff_failed: 0
collisions: 0
dropped_smbus: 0
multicast: 1644
rx_align_errors: 0
rx_broadcast: 23626
rx_bytes: 1897203
rx_compressed: 0
rx_crc_errors: 0
rx_csum_offload_errors: 0
rx_csum_offload_good: 0
rx_dropped: 4738
rx_errors: 0
rx_fifo_errors: 0
rx_flow_control_xoff: 0
rx_flow_control_xon: 0
rx_frame_errors: 0
rx_length_errors: 0
rx_long_byte_count: 1998731
rx_long_length_errors: 0
rx_missed_errors: 0
rx_multicast: 1644
rx_no_buffer_count: 0
rx_over_errors: 0
rx_packets: 25382
rx_short_length_errors: 0
rx_smbus: 0
tx_aborted_errors: 0
tx_abort_late_coll: 0
tx_broadcast: 7
tx_bytes: 11300
tx_carrier_errors: 0
tx_compressed: 0
tx_deferred_ok: 0
tx_dropped: 0
tx_errors: 0
tx_fifo_errors: 0
tx_flow_control_xoff: 0
tx_flow_control_xon: 0
tx_heartbeat_errors: 0
tx_multicast: 43
tx_multi_coll_ok: 0
tx_packets: 63
tx_restart_queue: 0
tx_single_coll_ok: 0
tx_smbus: 0
tx_tcp_seg_failed: 0
tx_tcp_seg_good: 0
tx_timeout_count: 0
tx_window_errors: 0
linux
networking
kernel
Huygens
źródło
źródło
Odpowiedzi:
Spróbuj
/sys/class/net/eth0/statistics/
(tj. Dlaeth0
), nie jest idealny, ale rozkłada błędy według transmisji / odbioru i według operatora, okna, fifo, crc, ramki, długości (i kilku innych) rodzajów błędów.Krople nie są tym samym, co „ignorowane”,
netstat
pokazują statystyki na poziomie interfejsu, pakiet multiemisji ignorowany przez wyższy poziom (warstwa 3, stos IP) nie będzie wyświetlany jako kropla (choć może być wyświetlany jako „filtrowany” na niektórych Statystyki NIC). Statystyki mogą być nieco skomplikowane przez różne funkcje odciążania.Możesz uzyskać więcej statystyk, jeśli masz
ethtool
:Niektóre statystyki zależą od sterownika karty sieciowej, podobnie jak dokładne znaczenie. Powyższe pochodzi od Intela
e1000
. Po zapoznaniu się z garstką sterowników, niektórzy zbierają znacznie więcej statystyk niż inni (statystyki dostępne dla ethtool są zwykle przechowywane w osobnym pliku źródłowym, np.drivers/net/ethernet/intel/e1000/e1000_ethtool.c
Jeśli potrzebujesz przeszukać).ethtool -i eth0
pokaże szczegóły sterownika, wyjścielspci -v
powinno być bardziej szczegółowe, choć z odrobiną bałaganu.Aktualizacja W
tg3.c
funkcjitg3_rx()
jest tylko jedno miejsce, które wygląda prawdopodobnie ztp->rx_dropped++
, ale kod jest zaśmieconagoto
s, więc istnieje kilka innych przyczyn niż oczywiste, czyli coś zgoto drop_it
lubgoto drop_it_no_recycle
. (Należy pamiętać, że licznik upuszczeń jest jednym z niewielu obsługiwanych przez sterownik, pozostałe są obsługiwane przez samo urządzenie).Źródło sterownika, które mam pod ręką, to 3.123. Domyślam się, że ten kod:
Sprawdź MTU, możliwe przyczyny to duże ramki lub nieco za duże ramki Ethernet, aby umożliwić enkapsulację. Nie potrafię wyjaśnić, dlaczego
tcpdump
może to zmienić zachowanie, nie wiadomo, aby zmienić MTU interfejsu. Zauważ również, że możesz „zobaczyć” pakiety większe niż MTU,tcpdump
jeśli TSO / LRO jest włączony ( wyjaśnienie ).źródło
ethtool -S
są podobne (przynajmniej w moim systemie) i otrzymuję tylko informacje o liczbie odrzuconych pakietów. Zaktualizuję mój post o dane wyjściowe.tg3
jest to moduł i naprawdę chcesz się do niego dostać, możesz użyć polecenia-printk()
likenetdev_info()
do zarejestrowania niektórych zdarzeń, w kodzie są już instancje do skopiowania. Zobaczinclude/linux/skbuff.h
nask_buff
konstrukcji (nie dla osób o słabym sercu). Zrób kilka połączeń w odpowiednich miejscach wtg3_rx()
, przebuduj i ponownie załaduj moduł i poczekaj ...