对于ifconfig来说,它所获取一些错误统计信息如下所示:
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
首先这些指标获取是从/proc/net/dev:
cat /proc/net/dev
Inter-| Receive | Transmit
face | bytes packets errs drop fifo frame compressed multicast| bytes packets errs drop fifo colls carrier compressed
docker0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
eth1: 4847481013 8371013 0 0 0 0 0 0 1375941032 6231188 0 0 0 0 0 0
lo: 1812 6 0 0 0 0 0 0 1812 6 0 0 0 0 0 0
主要通过这里去获取errs统计计数、drop统计计数、fifo统计计数和frame统计计数。
如何理解这里的RX errors和dropped,以及overruns和frame。首先需要明确的就是这里的统计信息均来自于内核驱动层,驱动实际上都是通过获取硬件中的状态来得到这些信息的,因此这里统计的值都是网卡上会出现的情况,驱动从网卡寄存器中读取到相应的计数信息,因此这些计数信息不涉及系统软件协议栈中的丢包和错误。
内核在打印这些内容时,是通过如下信息进行输出的:
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
上面的对应关系,其右侧的指标都是从网卡上获取的,那么对于具体的含义,每个网卡可能多少会存在一些差异,不过在设计上总的还是遵循如下原则的:
1.errors指的是网卡接收异常统计,这个值是从网卡上读取到的,并否内核计数,因此具体含义需要参考网卡的技术说明书,可以认为是接收到异常包,接收异常错误统计的总和。
2.overruns指的是fifo被填满了从而导致的丢包量,当内核申请内存给网卡使用,如果被填满后,内核还没有来得及读取和清空数据,那么就会触发overrun,从而把第一个包丢弃掉。
3.frame指的是帧格式错误计数,一般是帧不符合要求,比如长度未进行8字节对齐,2层帧中的crc校验错误等,很可能是网线或者网口异常引起。
4.rx_dropped统计了网卡丢包数同时也包括网卡dev层的内核丢包,比如内核发现网卡传递过来的包是不支持的协议类型,那么就会丢弃该包同时增加该计数。
最后来特别介绍一下dropped指标,从名字上来看是丢包了,这个丢包和大家口中常说的丢包其实是不同的,这里的dropped仅仅特指网卡对特定包执行了丢弃操作。而我们所说的应该叫系统丢包,它可能包含多种情况,本文介绍的erros/dropped/overruns/frame指标值,如果站在系统的角度都可以被叫做系统丢包了,当然除了网卡错误导致的丢包还应该包括协议栈里面的丢包等。
会产生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