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小时的正常运行时间。 我们最近有一个盒子已经有两个月的时间了,这些反击器将达到几百万(XXX百万)。

我们试图改变各种sysctlvariables…

这是我认为是相关的我们的sysctlvariables:

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

有谁知道如何解决这些修剪pakcets由于套接字缓冲区溢出/数据包colapsing(我知道是不是像修剪的数据包一样坏)?

谢谢。

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

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

其实,你不一定要增加缓冲区, 只是队列的最大可能的大小。

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

因此, 除非应用程序正在调用setsockopt()来增加队列大小(并且失败,如果最大值低于它要分配的大小), 否则增加最大值将不会执行任何操作。

尝试增加上面的值。