我有一台运行 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 的“预设最大值”,当然,这一切都取决于型号。