如何更改 Linux 中网络接口的接收队列长度?

如何更改 Linux 中网络接口的接收队列长度?

我有一台运行 Linux(内核 2.6.18)的服务器,它正在大量丢弃传入的网络数据包。我认为它之所以出现这种情况是因为该接口的接收队列长度太小(默认为 1000)。我想通过修改值 /proc/sys/net/core/netdev_max_backlog(到 3000)来扩大这个队列。但似乎不起作用。我在 Google 上搜索了一下,发现有人说这个值仅适用于非 NAPI 设备,而我不认为我的设备是 NAPI,因为 NAPI 是从内核 2.4.20 开始引入的。我不知道这是否属实,于是转向安装在该服务器上的内核文档,但该文档自内核 2.2 以来就没有更新过。

所以我想知道这是否属实,如果属实,我该如何更改 NAPI 设备的队列长度?

谢谢。冯

答案1

我最终发现,接口之所以会丢包,是因为驱动程序配置的 Rx 描述符大小太小,该描述符在与中断合并一起工作时,决定了驱动程序在向内核发送中断之前可以容纳多少个数据包。如果此值(显示为ethtool -g <interface>)太小,则会在发出中断之前丢包。在我将其放大后ethtool -G <interface> Rx <a some big value>,再也没有出现丢包现象。

谢谢大家。

答案2

以下命令可能也有效:

/sbin/sysctl -w net.core.netdev_max_backlog = 10000

答案3

在输出中,ethtool -g您将获得 NIC 的“预设最大值”和“当前硬件设置”。始终建议将您的设置设置为允许的最大值,以避免丢包,但更具体地说:接收错误或超限(例如,在突发情况下可能发生)。

甚至在某些情况下,驱动程序更新可以增加 NIC 的“预设最大值”,当然,这一切都取决于型号。

相关内容