Gibt es unter Linux eine Möglichkeit, Statistiken über die verschiedenen Gründe für das Verwerfen von Paketen abzurufen?
Auf allen Netzwerkschnittstellen (openSUSE 12.3) auf mehreren Servern ifconfig
und netstat -i
melden verworfene Pakete an der Rezeption. Wenn ich a mache tcpdump
, steigt die Anzahl der verworfenen Pakete nicht mehr an, was bedeutet, dass die Schnittstellenwarteschlangen nicht voll sind und die Daten verwerfen. Es muss also andere Gründe dafür geben (z. B. empfangene Multicast-Pakete, während die Schnittstelle nicht Teil dieser Multicast-Gruppe ist).
Wo finde ich solche Informationen? (/ proc? / sys? einige Protokolle?)
Beispiel für eine Statistik (Zusammenführung der Ausgabe von / sys / class / net / <dev> / statistics und 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
quelle
Antworten:
Try
/sys/class/net/eth0/statistics/
(dh foreth0
), es ist nicht perfekt, aber es gliedert Fehler nach Sende- / Empfangsart und nach Träger-, Fenster-, FIFO-, CRC-, Frame-, Längen- (und ein paar weiteren) Fehlertypen auf.Drops sind nicht dasselbe wie "ignoriert". Sie
netstat
zeigen Statistiken auf Schnittstellenebene an. Ein Multicast-Paket, das von einer höheren Ebene (Schicht 3, IP-Stack) ignoriert wird, wird nicht als Drop angezeigt (obwohl es bei einigen möglicherweise als "gefiltert" angezeigt wird NIC-Statistiken). Die Statistik kann durch verschiedene Auslagerungsfunktionen etwas kompliziert werden.Sie können mehr Statistiken erhalten, wenn Sie
ethtool
:Einige Statistiken hängen vom NIC-Treiber ab, ebenso die genaue Bedeutung. Das obige stammt von einem Intel
e1000
. Einige haben sich eine Handvoll Treiber angesehen und sammeln viel mehr Statistiken als andere (die Statistiken, die für ethtool verfügbar sind, werden normalerweise in einer separaten Quelldatei gespeichert, z. B.drivers/net/ethernet/intel/e1000/e1000_ethtool.c
wenn Sie stöbern müssen).ethtool -i eth0
zeigt die Treiberdetails an, die Ausgabelspci -v
sollte detaillierter sein, allerdings auch mit ein bisschen Unordnung.Update In
tg3.c
Funktiontg3_rx()
gibt es nur einen Ort, der mit einem wahrscheinlich aussiehttp->rx_dropped++
, aber der Code ist übersät mitgoto
s, so dass es mehrere andere Ursachen als die offensichtlichen gibt, dh irgendetwas mitgoto drop_it
odergoto drop_it_no_recycle
. (Beachten Sie, dass der Drop-Counter einer der wenigen ist, die vom Treiber verwaltet werden, der Rest wird vom Gerät selbst verwaltet.)Die Treiberquelle, die ich zur Hand haben muss, ist 3.123. Mein bester Tipp ist dieser Code:
Überprüfen Sie die MTU. Mögliche Ursachen sind Jumbo-Frames oder leicht übergroße Ethernet-Frames , um die Kapselung zu ermöglichen. Ich kann nicht erklären, warum
tcpdump
sich das Verhalten ändern könnte, es ist nicht bekannt, die MTU-Schnittstelle zu ändern. Beachten Sie auch, dass Sie möglicherweise Pakete "sehen", die größer als die MTU sind,tcpdump
wenn TSO / LRO aktiviert ist ( Erläuterung ).quelle
ethtool -S
sind ähnlich (zumindest auf meinem System) und ich erhalte nur die Informationen über die Anzahl der verworfenen Pakete. Ich werde meinen Beitrag mit der Ausgabe aktualisieren.tg3
es sich um ein Modul handelt und Sie wirklich auf den Grund gehen möchten, können Sie mitprintk()
-likenetdev_info()
einige Ereignisse aufzeichnen. Der Code enthält bereits Instanzen, die Sie kopieren können. Sieheinclude/linux/skbuff.h
für diesk_buff
Struktur (nicht für schwache Nerven). Streuen Sie ein paar Anrufe an die entsprechenden Stellen intg3_rx()
, bauen Sie das Modul neu auf, laden Sie es neu und warten Sie ...