FreeBSD 监听队列溢出 - 无法增加最大队列大小

FreeBSD 监听队列溢出 - 无法增加最大队列大小

我有一个流量相当大的 FreeBSD Nginx 服务器,并且开始出现大量的监听队列溢出:

[root@svr ~]# netstat -sp tcp | fgrep listen
80361931 listen queue overflows
[root@svr ~]# netstat -Lan | grep "*.80"
tcp4  192/0/128        *.80
[root@svr ~]# sysctl kern.ipc.somaxconn
kern.ipc.somaxconn: 12288
[root@svr ~]#

但是我似乎无法将最大监听队列长度增加到 128 以上。我增加了 kern.ipc.somaxconn,但最大值没有改变。我是不是漏掉了什么?

谢谢!

答案1

kern.ipc.somaxconn 可能不会像你想象的那样工作。它是未完成的且未处理连接。(例如,这不是连接限制,而是待办的处理连接限制)。

使用非计算机类比:它是响铃电话的最大数量(在拿起和接听之前),而不是同时拨打电话的最大数量。

如果您有那么大的积压,那么您需要让您的应用程序更频繁地接听电话(例如,为其提供更多资源、更多 CPU、更好的框架等等)。

请注意,http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/configtuning-kernel-limits.html">FreeBSD 手册中有关内核限制的部分指出了这一点:(重点是我的)。

kern.ipc.somaxconn sysctl 变量限制了接受的监听队列的大小新的TCP 连接。默认值 128 通常太低,无法在负载很重的 Web 服务器环境中可靠地处理新连接。对于此类环境,建议将此值增加到 1024 或更高。服务守护进程本身可能会限制监听队列的大小

我没有使用过 Nginx,但也从应用程序端检查了其配置文件是否存在上述限制。

答案2

监听队列可能限制为 128nginx 配置

查看 nginx 配置中的设置如下:

listen 80 backlog=128;

并删除积压(默认值为 -1 = 使用系统限制)或更改为更大的值(8192 应该足以满足负载服务器的需求)。如果即使增加了监听队列,您仍然看到监听队列溢出,则可能表明 nginx 被阻塞了很长时间(因为硬盘速度慢/过载,或者第三方模块编写不当)。

相关内容