我似乎遇到了 IP 队列问题。
我有一台 Linux 机器,用于运行一些实验。这台 Linux 机器配置为路由器,具有两个 NIC,连接另外两台计算机并管理它们的网络流量。所有传入的数据包都使用 iptables 捕获,并由 C 应用程序进行分析。
作为实验的一部分,分析数据包的应用程序具有内置延迟。
因此,我有一台非常快的计算机通过我的 Linux 路由器发送数据包,还有一台(相对)慢的 Linux 路由器逐一分析和处理数据包。
这种情况导致的结果是,当我在连接到 Linux 路由器的其中一台计算机上启动发送方应用程序时,Linux 路由器上的 IP 队列 (几乎) 立即被填满。
IP 队列的最大长度目前设置为 1024,如果溢出,数据包将被丢弃。这是意料之中的,我对此表示同意。
但是,(这就是它变得有趣的地方),时不时我会收到以下错误:
“无法接收 Netlink 消息:没有可用的缓冲区空间”
一开始,我以为这是由于 IP 队列溢出造成的,但经过一番分析后我发现,有时即使 IP 队列缓冲区没有溢出,我也会收到错误,而有时即使缓冲区确实溢出,我也不会收到消息。
当我运行时> cat /proc/net/ip_queue
,我得到了下表(也用于监控 IP 队列溢出):
Peer PID : 27389
Copy mode : 2
Copy range : 65535
Queue length : 0
Queue max. length : 1024
Queue dropped : 1166875
Netlink dropped : 2916
查看最后两个值,Queue dropped
似乎是指由于缓冲区已满而无法进入 IP 队列的数据包。当我轰炸 linux-router 时,我可以看到这个值上升。Netlink dropped
(正如它的名字所暗示的那样 :))似乎与我得到的错误有关。
我尽力寻找有关此错误的材料,但没有找到任何似乎能为我指明所需方向的东西。
底线:为什么我会收到此错误?我该如何避免它?