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,但它并没有改变最大值。 我错过了什么吗?

谢谢!

在nginxconfiguration中 ,可能会将监听队列限制为128个

看看nginxconfiguration的设置如:

 listen 80 backlog=128; 

并删除积压(默认是-1 =使用系统限制)或更改为更大的值(8192应该足够,即使是加载的服务器)。 如果即使增加了监听队列,你仍然可以看到监听队列溢出,这可能表明,nginx长时间被阻塞(因为缓慢/过载的硬盘或错误的第三方模块)。

kern.ipc.somaxconn可能不会做你认为的事情。 优秀和未处理的连接是有限的。 (例如,它不是连接限制,而是挂起的句柄连接限制)。

使用非计算机类比:这是振铃电话的最大数量(在被接听和接听之前),而不是最大同时通话的电话数量。

如果你的积压是那么大,那么你需要让应用程序更频繁地拿起电话(例如,给它更多的资源,更多的CPU,更好的框架,无论如何)。

请注意,关于内核限制的FreeBSD手册部分指出:(Emphasis mine)。

kern.ipc.somaxconn sysctlvariables会限制侦听队列的大小以接受新的 TCP连接。 对于负载较重的Web服务器环境中的新连接的强大处理,默认值128通常太低。 对于这样的环境,build议将此值增加到1024或更高。 服务守护进程本身可能会限制侦听队列的大小

我对Nginx没有任何经验,但也从应用程序端检查其configuration文件的上述限制。