Netstat -s 显示(并且不断增长)“从接收队列中修剪的数据包”和“接收队列中的数据包崩溃”

Netstat -s 显示(并且不断增长)“从接收队列中修剪的数据包”和“接收队列中的数据包崩溃”

我们看到以下情况:

[root@primary data]# netstat -s | grep buffer ; sleep 10 ; netstat -s | grep buffer
    20560 packets pruned from receive queue because of socket buffer overrun
    997586 packets collapsed in receive queue due to low socket buffer
    20587 packets pruned from receive queue because of socket buffer overrun
    998646 packets collapsed in receive queue due to low socket buffer
[root@primary data]#

请记住,以上是刚刚重启的盒子……正常运行时间约为 1 小时。我们最近有一个运行了 2 个月的盒子,这些计数器将达到数百万(XXX 百万)。

我们尝试改变各种 sysctl 变量......

以下是我认为相关的 sysctl 变量:

net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

是否有人知道如何解决由于套接字缓冲区溢出/数据包崩溃而导致的这些修剪的数据包(据我所知,这并不像修剪的数据包那么糟糕)?

谢谢。

答案1

实际上,您不一定增加缓冲区;仅仅增加队列的最大可能大小。

当你打开一个套接字时,队列被设置为以下值:net.core.rmem_default = 212992 net.core.wmem_default = 212992

因此增加最大值不会起任何作用除非应用程序正在调用 setsockopt() 来增加队列大小(如果最大值低于它试图分配的大小,则会失败)。

尝试增加上述值。

答案2

从您提供的信息来看,由于您似乎已经增加了缓冲区,因此问题很可能出在您的应用程序上。这里的根本问题是,即使操作系统接收到网络数据包,它们处理速度也不够快,因此填满了队列。

这并不一定意味着应用程序本身太慢,也可能由于该机器上运行了太多其他进程而没有获得足够的 CPU 时间。

相关内容