1.原因
就在今天部门测试,并发量增高,突然服务断了,查看了下uwsgi.log的日志,大量出现这个错误 listen queue of socket (fd: 3)
结果查了下,是队列满了,简单的理解就是每个监听的socket,在没有accept之前,等待处理的socket队列长度,linux(至少在centos6.6中)默认是128,在我这个编译的uwsgi中默认是100,也就是说没有调整系统参数之前,最高也就是128。
2.操作
1、修改系统参数
这里直接修改配置文件了,重启后仍然有效。
修改/etc/sysctl.conf文件,添加或者修改这几个参数值
net.ipv4.tcp_max_syn_backlog = 8192 # add by YuanFang net.core.somaxconn = 65535 net.core.netdev_max_backlog = 65536
修改完成之后要记得 sysctl -p
重新加载参数
2、修改uwsgi的文件
不管是配置,还是命令行加一个选项,例如 uwsgi.ini 文件中在socket= :9001下面添加如下配置 listen=10240 也可以小一点比如2048 之后重启应用,重新加载配置。
3.错误
1. 当sysctl -p重新加载参数时报错“sysctl: setting key ‘net.core.somaxconn’: Invalid argument” 无效的参数,
原因:net.core.somaxconn 的值设置的大于USHRT_MAX(Maximum value of a type unsigned short int. 无符号短整型最大值65535,也可以用命令:getconf USHRT_MAX 查看)
修改:net.core.somaxconn的值设置的小于USHRT_MAX就可以了,如10240
4、小结
通过修改配置,这种错误基本没有出现过了,系统的吞吐量和并发数都大大提高了。所以系统特性和调优对于提高整个服务质量非常重要。
3.拓展
针对IPV4内核的参数优化可以看看https://www.cnblogs.com/liuyisai/p/6020300.html
说说上面的2.1的配置参数是什么意思
1、net.ipv4.tcp_max_syn_backlog参数
记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。一般在系统内存比较充足的情况下,可以增大这个参数的赋值:
net.ipv4.tcp_max_syn_backlog = 262144
2、net.core.somaxconn参数
该参数用于调节系统同时发起的TCP连接数,一般默认值为128.在客户端存在高并发请求的情况下,该默认值较小,肯那个导致连接超时或重传问题,我们可以根据实际需要结合并发请求数来调节此值。
net.core.somaxconn = 262144
3、net.core.netdev_max_backlog参数
参数net.core.netdev_max_backlog表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目,一般默认值为128(可能不同的linux系统该数值也不同)。nginx服务器中定义的NGX_LISTEN_BACKLOG默认为511。我们可以将它调整一下:
net.core.netdev_max_backlog = 262144