Wie kann man den Grund (die Gründe) herausfinden, warum die Netzwerkschnittstelle Pakete verwirft?

18

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 ifconfigund netstat -imelden 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
Huygens
quelle

Antworten:

23

Try /sys/class/net/eth0/statistics/ (dh for eth0), 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 netstatzeigen 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:

# ethtool -S eth0
 rx_packets: 60666755
 tx_packets: 2206194
 rx_bytes: 6630349870
 tx_bytes: 815877983
 rx_broadcast: 58230114
 tx_broadcast: 9307
 rx_multicast: 8406
 tx_multicast: 17
 rx_errors: 0
 tx_errors: 0
 tx_dropped: 0
 multicast: 8406
 collisions: 0
 rx_length_errors: 0
 rx_over_errors: 0
 rx_crc_errors: 0
 rx_frame_errors: 0
 rx_no_buffer_count: 0
 rx_missed_errors: 0
 tx_aborted_errors: 0
 tx_carrier_errors: 0
 tx_fifo_errors: 0
 tx_heartbeat_errors: 0
 [...]

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.cwenn Sie stöbern müssen).

ethtool -i eth0zeigt die Treiberdetails an, die Ausgabe lspci -vsollte detaillierter sein, allerdings auch mit ein bisschen Unordnung.


Update In tg3.cFunktion tg3_rx()gibt es nur einen Ort, der mit einem wahrscheinlich aussieht tp->rx_dropped++, aber der Code ist übersät mit gotos, so dass es mehrere andere Ursachen als die offensichtlichen gibt, dh irgendetwas mit goto drop_it oder goto 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:

           if (len > (tp->dev->mtu + ETH_HLEN) &&
                skb->protocol != htons(ETH_P_8021Q)) {
                    dev_kfree_skb(skb);
                    goto drop_it_no_recycle;
            }

Ü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 tcpdumpsich 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, tcpdumpwenn TSO / LRO aktiviert ist ( Erläuterung ).

mr.spuratic
quelle
Vielen Dank für Ihre vorgeschlagene Antwort. Die vom sysfs statistics dir oder von angegebenen Informationen ethtool -Ssind ä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.
Huygens
Ich habe den Treiberquellcode (tg3.c) überprüft und nur Verweise auf Abbrüche auf VLAN-Fehler und falsche Socket-Pufferlänge gefunden. Ich weiß noch nicht, was ich daraus schließen soll ...
Huygens
Danke für das Update, leider kann ich kein zweites Mal +1 geben ;-) Ich werde mal schauen, ob tcpdump Jumbo Frames oder Frames größer als meine MTU (1500) meldet.
Huygens
Ich habe TSO und LRO "on". Tcpdump meldet Frames, die größer sind als meine MTU, aber ich müsste sehen, ob dies an der LRO liegt ... Ich werde es am Montag sehen. Jetzt ist es Zeit, am Wochenende zu sein.
Huygens
2
Wenn tg3es sich um ein Modul handelt und Sie wirklich auf den Grund gehen möchten, können Sie mit printk()-like netdev_info()einige Ereignisse aufzeichnen. Der Code enthält bereits Instanzen, die Sie kopieren können. Siehe include/linux/skbuff.hfür die sk_buffStruktur (nicht für schwache Nerven). Streuen Sie ein paar Anrufe an die entsprechenden Stellen in tg3_rx(), bauen Sie das Modul neu auf, laden Sie es neu und warten Sie ...
mr.spuratic