Ubuntu 服务器 10.04.2
$ uname -a Linux my.local 2.6.32-30-generic-pae#59-Ubuntu SMP 2011 年 3 月 1 日星期二 23:01:33 UTC i686 GNU/Linux
看起来我的域套接字队列已溢出,但我无法证明这一点。
我有这个堆栈nginx->[spawn-fcgi->multiwatch->]custom-fcgi-service
custom-fcgi-service
Nginx通过 unix 域套接字的方式进行通信。
今天我们的流量略有增加,突然我的 nginxerror.log
充满了鳗鱼:
2011/04/07 15:31:51 [错误] 28187#0: *469350 connect() 至 unix:/tmp/my.socket 连接上游时失败(11:资源暂时不可用), 客户端:[IP 保留],服务器:my.local,请求:“GET /myurl HTTP/1.0”, 上游:“fastcgi://unix:/tmp/my.socket:”,主机:“example.com”
一些请求成功通过,但许多请求返回 5xx 错误。
如果我重新启动custom-fcgi-service
,错误就会消失,但很快又会出现。检查custom-fcgi-service
状态后,我确信它运行正常(尽管对于这种流量来说可能太慢了,但这只是假设)。
我尝试过这样做:
回显 65535 > /proc/sys/net/unix/max_dgram_qlen
但这并没有多大帮助。(不确定错误发生时间是否会变长,也许会,但还不足以修复它。)
如果我增加工作程序分叉的数量custom-fcgi-service
,错误不会在较长时间内出现,但到目前为止,我无法将工作程序数量增加到足以永久修复该问题。该机器上的 CPU 和内存以及 IO 负载都在限制范围内,因此,我再次认为这custom-fcgi-service
只是某些后续网络调用速度较慢。
问题是:如何调试此问题?如果确实是套接字队列长度,如何制作一个传感器来警告我们需要分叉更多custom-fcgi-service
工作器?
答案1
看起来您的问题与连接有关,与发送无关。尝试增加内核接收器积压:
echo "2000" > /proc/sys/net/core/netdev_max_backlog
或者
sysctl –w sys.net.core.netdev_max_backlog=2000
您检查过系统日志(例如 dmesg)吗?
答案2
尝试更改spawn的配置文件,backlog:4096。