如何在 Linux 上模拟和检测 NIC 环形缓冲区溢出

How to simulate and detect NIC ring buffer overflow on Linux

据我所知,网络接口卡有一个环形缓冲区,如果该缓冲区溢出,传入的数据包将被丢弃,除非内核耗尽数据包并释放缓冲区中的 space。

我的问题是如何在 Linux 上检测此类 NIC 环形缓冲区溢出?

如何在Linux上模拟这种环形缓冲区溢出?必要时可以修改/proc。

2016 年 2 月 2 日更新:

我会接受 John Zwinck 的解释作为答案,如果有谁知道模拟环形缓冲区溢出的知识,也请告诉我,在此先感谢。

我认为您无法(便携地)检测或模拟这一点。可能有一些方法可以使用特定的 NIC 驱动程序来实现,但您必须准确指定您使用的是什么,我怀疑对于消费级产品来说这是不可能的。但是,您可以使用 ethtool -g 测量和调整环形缓冲区的大小,此处对此进行了解释:http://www.scottalanmiller.com/linux/2011/06/20/working-with-nic-ring-buffers/

1) 您可以通过检查 NIC 统计信息来检测缓冲区溢出:ethtool -s eno1。输出中会有很多信息。字段名称取决于驱动程序。例如,在提交 "rx_discards" 的 tg3 驱动程序中 - 就是您正在寻找的。它存储因缓冲区已满而丢弃的数据包数量。

2) 当我需要丢弃数据包时,我将缓冲区大小设置为非常小的值(例如 2):ethtool -G eno1 rx 2。并用netperf加载网卡。

我试图用 sudo ethtool -C eth0 rx-usecs 10000sudo ethtool -G eth0 rx 48 填充缓冲区。第一个命令设置在数据包到达后延迟 RX 中断多少 usecs。第二条命令设置 RX 环形缓冲区大小。然后我打开了一些网站,看了一些视频,环形缓冲区满了,然后丢包数增加了。

而且环形缓冲区的最小大小似乎是 48,无论我设置多小,ethtool -g eth0 总是显示当前缓冲区大小是 48。