有没有办法在Linux上获得有关数据包丢失的各种原因的统计数据?
在多台服务器上的所有networking接口(openSUSE 12.3)上, ifconfig和netstat -i在接收时报告丢弃的数据包。 当我做一个tcpdump ,丢弃的数据包的数量停止增加,这意味着接口队列没有满并丢弃数据。 所以一定还有其他的原因(例如接收到多播包,而接口不是这个多播组的一部分)。
我在哪里可以find这样的信息? (/ proc?/ sys?一些日志?)
统计信息示例(/ sys / class / net / <dev> / statistics和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
尝试/sys/class/net/eth0/statistics/ (例如, eth0 ),这不是完美的,但它通过发送/接收和载体,窗口,fifo,crc,帧,长度(和更多)的错误。
丢弃与“忽略”不同, netstat显示接口级别统计信息,更高级别(第3层,IP堆栈)忽略的组播数据包不会显示为丢弃(尽pipe它可能显示为“过滤”一些网卡统计)。 统计可能会因各种卸载function而有些复杂。
如果你有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 [...]
一些统计信息取决于NIC驱动程序,确切的含义也是如此。 以上是来自Intel e1000 。 看过less数的驱动程序,有些收集比其他更多的统计数据(ethtool可用的统计数据往往保存在单独的源文件中,例如drivers/net/ethernet/intel/e1000/e1000_ethtool.c ,如果需要翻找) 。
ethtool -i eth0会显示驱动程序的详细信息, lspci -v的输出应该更详细,尽pipe也有一些混乱。
更新在tg3.c函数tg3_rx() ,只有一个地方看起来像tp->rx_dropped++ , 但是代码里散布着goto s,所以还有其他几个原因,比如goto drop_it或goto drop_it_no_recycle 。 (请注意,丢弃计数器是驱动程序维护的less数几个之一,其余部分由设备本身维护。)
我要交的驱动源是3.123。 我最好的猜测是这个代码:
if (len > (tp->dev->mtu + ETH_HLEN) && skb->protocol != htons(ETH_P_8021Q)) { dev_kfree_skb(skb); goto drop_it_no_recycle; }
检查MTU,可能的原因是巨型帧,或稍微超大的以太网帧允许封装。 我无法解释为什么tcpdump可能会改变行为,但不知道更改接口MTU。 还要注意,如果启用了TSO / LRO ( 说明 ),你可以使用tcpdump “查看”大于MTU的数据包。