ifconfig/netstat等网络指标数据统计说明及数据来源
ifconfig中的errors/dropped/fifo/frame统计指标 ====================================================================== [root@iZbp126mp5q29hm6x761dlZ ~]# ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.26.6.14 netmask 255.255.192.0 broadcast 172.26.63.255 ether 00:16:3e:20:72:84 txqueuelen 1000 (Ethernet) RX packets 44661967 bytes 25880649483 (24.1 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 48448504 bytes 63530076723 (59.1 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ------------------------------------------------------------------------------------------ errors---------stats->rx_errors errors指的是网卡接收异常统计,这个值是从网卡上读取到的,并否内核计数,因此具体含义需要参考网卡的技术说明书,可以认为是接收到异常包,接收异常错误统计的总和。比如校验错误、帧同步错误等; ------------------------------------------------------------------------------------------ dropped---------stats->rx_dropped + stats->rx_missed_errors dropped 表示数据包已经进入了 Ring Buffer,但是由于内存不够等系统原因,导致在拷贝到内存的过程中被丢弃。 rx_dropped统计了网卡丢包数同时也包括网卡dev层的内核丢包,比如内核发现网卡传递过来的包是不支持的协议类型,那么就会丢弃该包同时增加该计数。 会产生rx_dropped统计值的情况包括如下几种: 1.Softnet backlog full ( /proc/net/softnet_stat) 2.Bad / Unintended VLAN tags 3.Unknown / Unregistered protocols 4.IPv6 frames when the Nic is not configured for IPv6 ------------------------------------------------------------------------------------------ overruns(fifo)---------stats->rx_fifo_errors overruns 表示超限数据包数,即网络 I/O 速度过快,导致 Ring Buffer 中的数据包来不及处理(队列满)而导致的丢包; overruns 表示了 fifo 的 overruns,这是由于 Ring Buffer(aka Driver Queue) 传输的 IO 大于 kernel 能够处理的 IO 导致的,而 Ring Buffer 则是指在发起 IRQ 请求之前的那块 buffer。 overruns 的增大意味着数据包没到 Ring Buffer 就被网卡物理层给丢弃了,而 CPU 无法即使的处理中断是造成 Ring Buffer 满的原因之一 overruns指的是fifo被填满了从而导致的丢包量,当内核申请内存给网卡使用,如果被填满后,内核还没有来得及读取和清空数据,那么就会触发overrun,从而把第一个包丢弃掉。 内核通常需要快速的拷贝网络数据包到系统内存,因为网卡上接收网络数据包的缓存大小固定,而且相比系统内存也要小得多。 所以上述拷贝动作一旦被延迟,必然造成网卡 FIFO 缓存溢出 - 进入的数据包占满了网卡的缓存,后续的包只能被丢弃,这也应该就是 ifconfig 里的 overrun 的来源。 当驱动处理速度跟不上网卡收包速度时,驱动来不及分配缓冲区,NIC 接收到的数据包无法及时写到 sk_buffer,就会产生堆积,当 NIC 内部缓冲区写满后,就会丢弃部分数据,引起丢包。 这部分丢包为 rx_fifo_errors,在 /proc/net/dev 中体现为 fifo 字段增长,在 ifconfig 中体现为 overruns 指标增长。 ###overruns:数据包还没进入Ring Buffer就被丢了 ###dropped:数据包进入Ring Buffer后被丢弃 ------------------------------------------------------------------------------------------ frame---------stats->rx_length_errors + stats->rx_over_errors + stats->rx_crc_errors + stats->rx_frame_errors frame指的是帧格式错误计数,一般是帧不符合要求,比如长度未进行8字节对齐,2层帧中的crc校验错误等,很可能是网线或者网口异常引起。 ------------------------------------------------------------------------------------------ carrier 表示发生 carrirer 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等; collisions 表示碰撞数据包数。
ifconfig给出的drop和error与ethtool -S 给出的rx_dropped和rx_errors是什么关系;(存疑,待验证) ifconfig是间接到网卡上取数据;ethtool是直接到网卡取数据??? ifconfig中的RX dropped = rx_dropped + rx_missed_errors, RX errors = rx_errors。
虚拟网卡不支持“ethtool -S eth0”,可以查看/sys/devices/pci0000:00/0000:00:05.0/virtio2/net/eth0/statistics ===================================================================================================== [root@iZbp126mp5q29hm6x761dlZ ~]# ethtool -S eth0 no stats available [root@iZbp126mp5q29hm6x761dlZ ~]# ethtool -i eth0 driver: virtio_net version: 1.0.0 firmware-version: expansion-rom-version: bus-info: 0000:00:05.0 supports-statistics: no #不支持statistics supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no [root@iZbp126mp5q29hm6x761dlZ ~]# find /sys -name eth0 /sys/devices/pci0000:00/0000:00:05.0/virtio2/net/eth0 /sys/class/net/eth0 [root@iZbp126mp5q29hm6x761dlZ statistics]# cd /sys/devices/pci0000:00/0000:00:05.0/virtio2/net/eth0/statistics [root@iZbp126mp5q29hm6x761dlZ statistics]# ls #其实/sys/目录下存在着内核数据的映射 collisions rx_bytes rx_crc_errors rx_errors rx_frame_errors rx_missed_errors rx_over_errors tx_aborted_errors tx_carrier_errors tx_dropped tx_fifo_errors tx_packets multicast rx_compressed rx_dropped rx_fifo_errors rx_length_errors rx_nohandler rx_packets tx_bytes tx_compressed tx_errors tx_heartbeat_errors tx_window_errors [root@iZbp126mp5q29hm6x761dlZ statistics]# grep . * |grep rx rx_bytes:25908366346 rx_compressed:0 rx_crc_errors:0 rx_dropped:0 rx_errors:0 rx_fifo_errors:0 rx_frame_errors:0 rx_length_errors:0 rx_missed_errors:0 rx_nohandler:0 rx_over_errors:0 rx_packets:44808209
数据统计来源
netstat、nstat是来自/proc/net/netstat和/proc/net/snmp的数据;
ifconfig是读取/proc/net/dev下的数据,而后者的数据是从设备在内核的数据结构net_device里的结构rtnl_link_stats64中获取的;
ethtool是直接通过ioctl下放的方式从同样的结构(net_device中的rtnl_link_stats64)中获取数据;
因此可以认为ifconfig和ethtool两者看到的网卡相关数据来源是一样的,但是/proc/net/dev进行了一定程度的归档,因此ifconfig中的RX dropped = rx_dropped + rx_missed_errors,RX errors = rx_errors。
ifconfig统计数据来自net driver结构,ethtool统计数据来自设备的私有结构。网卡驱动程序可以在设备关闭和备份时重新初始化其私有结构,但不能重新初始化net driver程序结构。
net/core/net-procfs.c:
errors --------- stats->rx_errors
dropped --------- stats->rx_dropped + stats->rx_missed_errors
overruns(fifo) --------- stats->rx_fifo_errors
frame --------- stats->rx_length_errors + stats->rx_over_errors + stats->rx_crc_errors + stats->rx_frame_errors
=====================================================
如何理解ifconfig中的errors/dropped/fifo/frame统计指标 https://www.codenong.com/cs110957428/
关于以ethtool为主的网络指标统计工具之间统计数据关系的研究 https://cloud.tencent.com/developer/article/2050526