【uWSGI】 listen queue of socket (fd: 3) 错误分析

如今django的应用基本都是使用uWSGI来部署,相似下面 listen queue of socket "127.0.0.1:9001" (fd: 3) 的错误说下此次错误出现的解决的过程。linux

出错场景

  • centos 7.4
  • uWSGI 2.0
  • nginx 1 .12

错误日志截取nginx

 *** uWSGI listen queue of socket "127.0.0.1:9001" (fd: 3) full !!! (101/100) *** Tue Jun 2 17:33:28 2015 - *** uWSGI listen queue of socket "127.0.0.1:9001" (fd: 3) full !!! (101/100) ***
  • 第一次是由于联通机房防火墙配置错了,限制了服务器output,也就是外部发包给服务器没有问题,可是服务器返回包给外部的时候很是慢,几乎不可用,这个时候uwsgi日志中就出现了大量的错误django

  • 第二次是并发量剧增以后,活动连接保持在6000左右的时候,大量出现这个错误。centos

分析

以这个错误为基础,查询了下相关资料,应该是系统级别参数的问题,具体能够参考 linux man page listen(2).服务器

简单的理解就是每一个监听的socket,在没有accept以前,等待处理的socket队列长度,linux(至少在centos6.6中)默认是128,在我这个编译的uwsgi中默认是100,也就是说没有调整系统参数以前,最高也就是128。网络

那么怎样才能把队列的长度调整变长呢? 
* 必须调整系统参数,使其生效 
* 必须调整uwsgi配置,而后重启应用并发

操做

修改系统参数

这里直接修改配置文件了,重启后仍然有效。socket

修改/etc/sysctl.conf文件,添加或者修改这几个参数值大数据

# 用于设置内核没法及时处理网络接口收到的数据包时容许发送到队列的最大数据包数目,默认为128。也就是每一个监听的socket,在没有accept以前,等待处理的socket队列长度
net.core.somaxconn = 20480

修改完成以后要记得 sysctl -p 从新加载参数atom

uwsgi调整

无论是配置,仍是命令行加一个选项,例如 uwsgi.ini 文件中在socket= 127.0.0.1:9001下面添加以下配置

listen=10240

以后重启应用,从新加载配置。

错误

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

小结

经过修改配置,这种错误基本没有出现过了,系统的吞吐量和并发数都大大提升了。因此系统特性和调优对于提升整个服务质量很是重要。

相关文章
相关标签/搜索