27 votes

Comment trouver la ou les raisons pour lesquelles l'interface réseau laisse tomber des paquets ?

Existe-t-il un moyen, sous Linux, d'obtenir des statistiques sur les différentes raisons pour lesquelles les paquets ont été abandonnés ?

Sur toutes les interfaces réseau (openSUSE 12.3) sur plusieurs serveurs, ifconfig y netstat -i signalent des paquets abandonnés à la réception. Lorsque je fais un tcpdump Le nombre de paquets abandonnés cesse alors d'augmenter, ce qui signifie que les files d'attente des interfaces ne sont pas pleines et qu'elles abandonnent les données. Il doit donc y avoir d'autres raisons à cela (par exemple, des paquets multicast reçus alors que l'interface ne fait pas partie de ce groupe multicast).

Où puis-je trouver ces informations ? (/proc ? /sys ? certains journaux ?)

Exemple de statistiques (fusion des résultats de /sys/class/net/<dev>/statistics et 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

28voto

mr.spuratic Points 3330

Essayer /sys/class/net/eth0/statistics/ (c'est-à-dire pour eth0 ), il n'est pas parfait mais il décompose les erreurs par transmission/réception et par porteuse, fenêtre, fifo, crc, trame, longueur (et quelques autres) types d'erreurs.

Les chutes ne sont pas la même chose que les "ignorés", netstat Dans les statistiques de niveau interface, un paquet multicast ignoré par un niveau supérieur (couche 3, la pile IP) n'apparaîtra pas comme un drop (bien qu'il puisse apparaître comme "filtré" dans les statistiques de certaines cartes réseau). Les statistiques peuvent être quelque peu compliquées par diverses fonctions de délestage.

Vous pouvez obtenir plus de statistiques si vous avez 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
 [...]

Certaines statistiques dépendent du pilote NIC, de même que la signification exacte. Les données ci-dessus proviennent d'une carte Intel e1000 . Après avoir examiné une poignée de pilotes, certains collectent beaucoup plus de statistiques que d'autres (les statistiques disponibles pour ethtool ont tendance à être conservées dans un fichier source séparé, par exemple. drivers/net/ethernet/intel/e1000/e1000_ethtool.c si vous avez besoin de fouiller).

ethtool -i eth0 affichera les détails du conducteur, la sortie de lspci -v devrait être plus détaillé, mais aussi un peu plus fouillis.


Update En tg3.c fonction tg3_rx() il n'y a qu'un seul endroit qui semble probable avec un tp->rx_dropped++ , mais le code est truffé de goto Il y a donc plusieurs autres causes que la plus évidente, c'est-à-dire tout ce qui contient des goto drop_it ou goto drop_it_no_recycle . (Le compteur de chutes est l'un des rares à être géré par le pilote, les autres étant gérés par l'appareil lui-même).

La source du pilote que j'ai sous la main est la 3.123. Ma meilleure hypothèse est ce code :

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

Vérifier le MTU, les causes possibles sont les trames jumbo, ou des trames Ethernet légèrement surdimensionnées pour permettre l'encapsulation. Je ne peux pas expliquer pourquoi tcpdump pourrait modifier le comportement, il n'est pas connu pour modifier le MTU de l'interface. Notez également que vous pouvez "voir" des paquets plus grands que le MTU avec tcpdump もし TSO / LRO est activée ( explication ).

1voto

mayur murkya Points 11

Les erreurs indiquent un mode et une vitesse mal négociés ou incorrects, ou un câble réseau endommagé.

dropped indicate Possiblement dû à iptables ou à d'autres règles de filtrage, plus probablement dû à un manque de mémoire tampon réseau.

overrun indique le nombre de fois où l'interface réseau a manqué d'espace tampon. carrier Câble réseau endommagé ou mal connecté, ou problèmes de commutateur.

collsns indique le nombre de collisions, qui doit toujours être égal à zéro sur un réseau local commuté. Un nombre différent de zéro indique des problèmes de négociation du mode duplex approprié. Un petit nombre qui n'augmente jamais signifie qu'il s'est produit lorsque l'interface a été mise en service, mais qu'il ne s'est pas reproduit depuis.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X