“ cat / proc / net / dev”和“ ip -s链接”显示不同的统计信息。哪一个在说谎?


8

我注意到/proc/net/deveth3有1753 drops。ip -s link显示0 dropped。为什么有区别?不同的数据来自哪里?哪一个是正确的?

我删除了多余的数据。

# uname -a
Linux example09 2.6.32-5-amd64 #1 SMP Thu Mar 22 17:26:33 UTC 2012 x86_64 GNU/Linux

# lsb_release -a
Distributor ID: Debian
Description:    Debian GNU/Linux 6.0.4 (squeeze)
Release:        6.0.4
Codename:       squeeze

# cat /proc/net/dev
Inter-|   Receive                                                |  Transmit
 face |bytes    packets errs drop fifo frame compressed multicast|bytes    packets errs drop fifo colls carrier compressed
  eth3:1258629839430 12545003042    0 1753    0     0          0  10594858 6666255952912 10026428444    0    0    0     0       0          0

# ip -s link
5: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:15:17:96:0b:61 brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    244248462  3955476484 0       0       0       10595400
    TX: bytes  packets  errors  dropped carrier collsns
    683632524  1436809416 0       0       0       0

同样在这里。它看起来像是用户空间程序中的32位整数翻转(ifconfig在这里做同样的事情),但是根据bc1258629839430%(2^32)204421702不是244248462,所以我不确定是不是这样(除非您ip稍后运行
〜40MB

@DerfK是的,大约40MB的声音正确。只是几秒钟,但这是一台繁忙的服务器。
ablackhat 2012年

Answers:


11

在挤压机上,信任/proc/net/dev。这是一种查看相同数据的更直接,更可靠的方法。

对于掉落计数的特殊情况,我无法解释确切的问题,但可以在其他Squeeze盒上观察到。如果我关心的话,我会将其作为错误报告给Debian(并建议有人这样做并在此处报告)。

两者都取的tx_dropped字段中的数字net_device_stats。在/proc/net/dev中,通过所产生的线dev_seq_printf_statsnet/core/dev.c

ip像往常一样,通过netlink进行连接,更准确地说,是通过网络设备统计信息rtnetlink。传递给用户空间的结构rtnl_link_stats

本机结构使用unsigned longrtnetlink使用__u32或多或少地在中进行隐式转换copy_rtnl_link_stats

从结构的开头rx_packets可以很容易地看到正在使用的32位版本:/proc/net/dev显示1258629839430,ip显示244248462,大致对应于最后32位(在命令之间还有更多字节);与数据包计数相同。

这是前两个字段的数字运算:

% echo '1258629839430 % (2^32)'|bc; echo 244248462
204421702
244248462
% echo '12545003042 % (2^32)'|bc; echo 3955476484 
3955068450
3955476484

引入以下内容后情况变得更好了IFLA_STATS64

  • 在内核中(来自提交10708f37ae729baba9b67bd134c3720709d4ae62,在v2.6.35和更高版本中可用)
  • 在iproute2中(来自提交8864ac9dc5bd5ce049280337deb21191673a02d0,在v2.6.33-36及更高版本中可用)。

太好了,这正是我想要的。
ablackhat 2012年

-2

在大多数设备上,/ proc / net / dev是从硬件计数器读取的。其他统计信息是从设备结构中的网络堆栈更新的。

丢弃很有可能不匹配,因为它们可以由硬件来实现:数据包mac目的地既不是设备的也不是组播的,并且该设备也不是混杂的:硬件直接丢弃数据包,堆栈将永远不会知道它的存在。

最后,您可能想知道为什么不同步它们或始终使用硬件统计信息?当堆栈由于任何原因丢弃数据包时,它无法更新硬件计数器,并且对于调试很有用,知道您可以找到每个数据包以跟踪数据包被丢弃的位置。

希望这可以帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.