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中的errors/dropped/fifo/frame统计指标

 

ifconfig给出的drop和error与ethtool -S 给出的rx_dropped和rx_errors是什么关系;(存疑,待验证)

ifconfig是间接到网卡上取数据;ethtool是直接到网卡取数据???
ifconfig中的RX dropped = rx_dropped + rx_missed_errors,
            RX errors = rx_errors。
ifconfig给出的drop和error与ethtool -S 给出的rx_dropped和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
虚拟网卡不支持“ethtool -S eth0”,可以查看/sys/devices/pci0000:00/0000:00:05.0/virtio2/net/eth0/statistics

 

数据统计来源 

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

posted @ 2023-03-20 19:42  雲淡風輕333  阅读(610)  评论(0编辑  收藏  举报