如何debuggingunix域套接字的麻烦?

Ubuntu服务器10.04.2

 $ uname -a
 Linux my.local 2.6.32-30-generic-pae#59-Ubuntu SMP 
星期二3月1日23:01:33 UTC 2011 i686 GNU / Linux

看起来,我的域套接字队列溢出,但我不能certificate这一点。

我有这个栈nginx->[spawn-fcgi->multiwatch->]custom-fcgi-service

Nginx通过unix域套接字与custom-fcgi-service进行通信。

今天我们的stream量略有增加,突然我的nginx error.log里充满了鳗鱼:

 2011/04/07 15:31:51 [error] 28187#0:* 469350连接()到unix:/tmp/my.socket 
连接上游失败(11:资源暂时不可用) 
客户端:[IP witheld],服务器:my.local,请求:“GET / myurl HTTP / 1.0”, 
上游:“fastcgi:// unix:/tmp/my.socket:”,主机:“example.com”

一些请求通过,但许多返回5xx错误。

如果我重新启动custom-fcgi-service ,错误消失,但很快就会重新出现。 在检查了custom-fcgi-service状态后,我相当确定它可以正常工作(虽然对于这个stream量来说可能太慢,但这仅仅是一个假设)。

我试过这样做:

 echo 65535> / proc / sys / net / unix / max_dgram_qlen

但是这并没有太大帮助。 (不知道时间到错误是否变得更长,可能是,但不足以解决它。)

如果增加custom-fcgi-service的工作人员数量,错误不会出现更长的时间,但到目前为止,我无法增加足够高的工人数量来解决它永远。 这台机器上的CPU和内存以及IO负载都在限制之内,所以我认为custom-fcgi-service在一些后续的networking调用中速度很慢。

问题是:如何debugging这个问题? 如果确实是套接字队列的长度,那么如何制作一个传感器来警告我们,我们需要分配更多的custom-fcgi-service工作者?

好像你有连接问题,而不是发送。 尝试增加内核接收器积压:

 echo "2000" > /proc/sys/net/core/netdev_max_backlog 

要么

 sysctl –w sys.net.core.netdev_max_backlog=2000 

你有没有检查系统日志(例如dmesg)?

尝试改变spawn的configuration文件,积压:4096。