如何调试unix域套接字故障?

如何调试unix域套接字故障?

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-serviceNginx通过 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。

相关内容