在 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
)。
附言:有关更多信息,请参阅ifnet
TCP/IP Illustrated Volume 2(Stevens & Wright 编著)第 3.3 节“结构”。或者您的操作系统的源代码。