FreeBSD netstat -di,Idrop 与 Drop 以及来自 NIC 或内核的丢弃计数?

FreeBSD netstat -di,Idrop 与 Drop 以及来自 NIC 或内核的丢弃计数?

在 FreeBSD 上,netstat 输出中的 Drop 和 Idrop 有什么区别?

$ netstat -di 
Name    Mtu Network       Address              Ipkts Ierrs Idrop    Opkts Oerrs  Coll Drop
bge0*  1500 <Link#1>      00:16:d4:e3:49:31        0     0     0        0     0     0    0 
wpi0   2290 <Link#2>      00:1b:77:86:2d:fa        0 53068     0   179587     3     0    0 

另外,netstat 是从 NIC 还是从内核缓冲区获取丢弃计数?例如,如果由于缺少描述符,NIC 无法再接受任何数据包,丢失的数据包是否会被报告为 netstat 中的丢弃值之一?

我之所以问这个问题,是因为在 Linux 中,ifconfig 从 /proc/net/dev 读取数据,据我所知,只有当内核缓冲区已满时,它才会丢弃。因此,如果 NIC 由于缺少描述符而不接受数据包,您不会知道这一点,即它还没有进入内核内存。

而且 FreeBSD 上的 netstat 具有用于 BPF 缓冲区统计的 -B 选项,因此现在 netstat -di 报告来自 NIC/驱动程序本身的丢弃计数是有意义的。

正确错误?

任何帮助都值得赞赏,谢谢

答案1

可以通过以下方式观察到缺少软件描述符(即 mbuf 集群):

# vmstat -z

FAIL专栏。

缺少硬件描述符只能通过特定于驱动程序的接口观察到,例如对于 Intel e1000 卡,通过:

# sysctl dev.em.0.debug=1 && dmesg | tail
...
em0: Tx Descriptors avail failure = 0
em0: RX discarded packets = 0
...

loader.conf某些网卡也可以通过以下方式调整描述符数量

关于你的问题“idrops vs. drops”,你应该寻找以下来源

if_data.ifi_iqdrops
if_snd.ifq_drops

如果我理解正确的话,一个用于输入下降,另一个用于输出下降(即ALTQ)。

附言:有关更多信息,请参阅ifnetTCP/IP Illustrated Volume 2(Stevens & Wright 编著)第 3.3 节“结构”。或者您的操作系统的源代码。

相关内容