Netstat -s 显示(和增长)“从接收队列中修剪的数据包”和“在接收队列中折叠的数据包”

ano*_*one 7 networking linux tcp sysctl buffer

我们看到以下情况:

[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]#
Run Code Online (Sandbox Code Playgroud)

请记住,以上是一个刚重新启动的盒子......大约 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
Run Code Online (Sandbox Code Playgroud)

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

谢谢。

Rom*_*man 2

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

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