Apakah ada cara di Linux untuk mendapatkan statistik tentang berbagai alasan paket dijatuhkan?
Pada semua antarmuka jaringan (openSUSE 12.3) pada beberapa server, ifconfig
dan netstat -i
melaporkan paket yang jatuh di resepsi. Ketika saya melakukan tcpdump
, jumlah paket yang dijatuhkan berhenti meningkat, yang berarti bahwa antrian antarmuka tidak penuh dan menjatuhkan data. Jadi harus ada alasan lain mengapa hal ini terjadi (mis. Pkts multicast diterima sedangkan antarmuka bukan bagian dari grup multicast ini).
Di mana saya dapat menemukan informasi tersebut? (/ proc? / sys? beberapa log?)
Contoh statistik (gabungan dari / sys / class / net / <dev> / statistik dan output 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
sumber
sumber
Jawaban:
Coba
/sys/class/net/eth0/statistics/
(yaitu untuketh0
), itu tidak sempurna tetapi memecah kesalahan dengan mengirimkan / menerima dan oleh operator, jendela, fifo, crc, bingkai, panjang (dan beberapa lagi) jenis kesalahan.Drops tidak sama dengan "diabaikan",
netstat
menunjukkan statistik tingkat antarmuka, paket multicast diabaikan oleh level yang lebih tinggi (layer 3, tumpukan IP) tidak akan ditampilkan sebagai drop (meskipun mungkin muncul sebagai "difilter" pada beberapa Statistik NIC). Statistik agak rumit oleh berbagai fitur pembongkaran.Anda bisa mendapatkan lebih banyak statistik jika Anda memiliki
ethtool
:Beberapa statistik bergantung pada driver NIC, seperti makna yang sebenarnya. Di atas adalah dari Intel
e1000
. Setelah melihat beberapa driver, beberapa mengumpulkan lebih banyak statistik daripada yang lain (statistik yang tersedia untuk ethtool cenderung disimpan dalam file sumber yang terpisah, misalnyadrivers/net/ethernet/intel/e1000/e1000_ethtool.c
, jika Anda perlu mencari-cari).ethtool -i eth0
akan menunjukkan detail driver, outputlspci -v
harus lebih detail, meskipun dengan sedikit kekacauan juga.tg3.c
Fungsi Pembaruan dalamtg3_rx()
hanya ada satu tempat yang kemungkinan terlihat dengantp->rx_dropped++
, tetapi kode dikotori dengangoto
s, sehingga ada beberapa penyebab lain selain yang jelas, yaitu apa pun dengangoto drop_it
ataugoto drop_it_no_recycle
. (Perhatikan bahwa penghitung drop adalah salah satu dari sedikit yang dikelola oleh pengemudi, sisanya dikelola oleh perangkat itu sendiri.)Sumber driver yang harus saya tangani adalah 3.123. Tebakan terbaik saya adalah kode ini:
Periksa MTU, kemungkinan penyebabnya adalah frame jumbo, atau frame ethernet yang sedikit kebesaran untuk memungkinkan enkapsulasi. Saya tidak bisa menjelaskan mengapa
tcpdump
mungkin mengubah perilaku, tidak diketahui mengubah antarmuka MTU. Perhatikan juga bahwa Anda dapat "melihat" paket yang lebih besar dari MTU dengantcpdump
jika TSO / LRO diaktifkan ( penjelasan ).sumber
ethtool -S
serupa (setidaknya pada sistem saya) dan saya hanya mendapatkan informasi tentang jumlah paket yang dijatuhkan. Saya akan memperbarui posting saya dengan output.tg3
modul dan Anda benar - benar ingin mendapatkan bagian bawahnya, Anda dapat menggunakanprintk()
-sepertinetdev_info()
untuk merekam beberapa peristiwa, ada beberapa contoh yang sudah ada dalam kode untuk Anda salin. Lihatinclude/linux/skbuff.h
untuksk_buff
struktur (bukan untuk pingsan hati). Taburkan beberapa panggilan di tempat-tempat yang relevan ditg3_rx()
, membangun kembali dan memuat kembali modul, dan tunggu ...