Ağ arayüzünün paketleri bırakma nedenlerini nasıl öğrenebilirim?


18

Linux'ta paketlerin bırakılmasının çeşitli nedenleri hakkında istatistik almanın bir yolu var mı?

Birkaç sunuculardaki tüm ağ arayüzleri (openSUSE 12.3) günü ifconfigve netstat -iresepsiyonda bırakılan paketleri bildiriliyor. Bir yaptığımda tcpdump, bırakılan paketlerin sayısı artmayı durdurur, yani arayüz kuyrukları dolu değildir ve verileri düşürür. Bu nedenle, bunun olmasının başka nedenleri olmalıdır (örneğin, arayüz çok noktaya yayın grubunun bir parçası değilken, çok noktaya yayın pkts alındı).

Bu bilgileri nerede bulabilirim? (/ proc? / sys? bazı günlükler?)

İstatistik örneği (/ sys / class / net / <dev> / istatistik ve ettool çıktısının birleştirilmesi):

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

Yanıtlar:


23

Deneyin /sys/class/net/eth0/statistics/ (örn.eth0 ), mükemmel değil, ancak gönderme / alma ve taşıyıcı, pencere, fifo, crc, çerçeve, uzunluk (ve birkaç tane daha) hata türüne göre hataları parçalar.

Damlalar "yok sayıldı" ile aynı değildir, netstatarayüz seviyesi istatistiklerini gösterir, daha yüksek bir düzey (katman 3, IP yığını) tarafından yoksayılan çok noktaya yayın paketi bir damla olarak gösterilmez (bazılarında "filtrelenmiş" olarak görünebilir) NIC istatistikleri). İstatistikler, çeşitli boşaltma özellikleri nedeniyle biraz karmaşık olabilir.

Varsa daha fazla istatistik alabilirsiniz 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
 [...]

Bazı istatistikler tam anlamında olduğu gibi NIC sürücüsüne de bağlıdır. Yukarıdakiler bir Intel'den e1000. Birkaç sürücüye bakıldığında, bazıları diğerlerinden daha fazla istatistik toplar (ettool için mevcut istatistikler ayrı bir kaynak dosyada tutulur, örn.drivers/net/ethernet/intel/e1000/e1000_ethtool.c , rummage gerekiyorsa).

ethtool -i eth0sürücü ayrıntılarını gösterecektir, çıktısı lspci -vda biraz daha dağınık olsa da, daha ayrıntılı olmalıdır.


Güncelleme yılında tg3.cfonksiyonu tg3_rx()olasılıkla ile görünüyor tek bir yer var tp->rx_dropped++, ama kod ile çevrili gotos, bu yüzden birlikte bariz yani her şeyden daha birçok başka nedeni vardır goto drop_it ya goto drop_it_no_recycle. (Düşme sayacının sürücü tarafından tutulan birkaç kişiden biri olduğunu, geri kalanının cihazın kendisi tarafından korunduğunu unutmayın.)

Kullanmam gereken sürücü kaynağı 3.123. En iyi tahminim bu kod:

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

MTU'yu kontrol edin, olası nedenler kapsüllemeye izin vermek için jumbo çerçeveler veya biraz büyük boyutlu ethernet çerçeveleridir . tcpdumpDavranışı neden değiştirebileceğini açıklayamıyorum , arayüz MTU'sunu değiştirmek bilinmiyor. Eğer "görmek" olabileceğini de unutmayın sonra paketler daha büyük olan MTU tcpdumpeğer TSO / LRO etkin (edilmektedir açıklama ).


Önerdiğiniz cevap için teşekkür ederiz. Sysfs istatistik dir veya tarafından verilen bilgiler ethtool -Sbenzerdir (en azından benim sistemimde) ve sadece bırakılan paketlerin sayısı hakkında bilgi alıyorum. Yazımı çıktı ile güncelleyeceğim.
Huygens

Sürücü kaynak kodunu (tg3.c) kontrol ettim ve VLAN hatası ve yanlış soket arabellek uzunluğu için sadece referanslara başvurdum. Bundan ne sonuca
varacağımı

Güncelleme için teşekkürler, ne yazık ki ikinci kez +1 olamaz ;-) tcpdump jumbo çerçeveleri veya MTU (1500) 'den daha büyük çerçeveleri bildiriyorsa bir göz atacağım.
Huygens

TSO ve LRO 'açık' var. Tcpdump, MTU'mdan daha büyük çerçeveler rapor ediyor, ancak bunun LRO'dan kaynaklanıp kaynaklanmadığını görmem gerekiyor ... Pazartesi günü göreceğim. Şimdi hafta sonu olma zamanı.
Huygens

2
Eğer tg3bir modül olduğunu ve gerçekten kullanabileceğiniz bunun altına almak istiyorum printk()-like netdev_info()bazı olayları kaydetmek için kopyalamak için, örnekleri kodda zaten vardır. Bkz include/linux/skbuff.hiçin sk_buff(değil kalbin zayıf) yapıyla. İlgili yerlere birkaç çağrı tg3_rx()
serpiştirin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.