如何在 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 10000
和 sudo ethtool -G eth0 rx 48
填充缓冲区。第一个命令设置在数据包到达后延迟 RX 中断多少 usecs。第二条命令设置 RX 环形缓冲区大小。然后我打开了一些网站,看了一些视频,环形缓冲区满了,然后丢包数增加了。
而且环形缓冲区的最小大小似乎是 48,无论我设置多小,ethtool -g eth0
总是显示当前缓冲区大小是 48。
据我所知,网络接口卡有一个环形缓冲区,如果该缓冲区溢出,传入的数据包将被丢弃,除非内核耗尽数据包并释放缓冲区中的 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 10000
和 sudo ethtool -G eth0 rx 48
填充缓冲区。第一个命令设置在数据包到达后延迟 RX 中断多少 usecs。第二条命令设置 RX 环形缓冲区大小。然后我打开了一些网站,看了一些视频,环形缓冲区满了,然后丢包数增加了。
而且环形缓冲区的最小大小似乎是 48,无论我设置多小,ethtool -g eth0
总是显示当前缓冲区大小是 48。