select()挂起由于资源枯竭 – 但是什么资源?

通过sftp连接到我的服务器有时会导致挂起:

if (select(max+1, rset, wset, NULL, NULL) < 0) {

这是来自openssh 5.2p1的sftp-server.c(sftp_server_main()的主循环)的1428行。

通过例如vanilla FTP打开数据连接时发生同样的挂起。 我有时候能够在几秒钟或几分钟之后通过,但有时在服务器能够响应之前,客户端的连接超时。 当服务器确实响应并且我已连接,那么如果我发出'ls',它将在select()处再次挂起一段时间。

ssh是可以的; 可以毫不迟疑地连接并发出命令等

我不认为这是sockets死亡:

 root@dl:~# cat /proc/net/sockstat sockets: used 304 TCP: inuse 444 orphan 302 tw 152 alloc 451 mem 5280 UDP: inuse 4 RAW: inuse 0 FRAG: inuse 0 memory 0 root@dl:~# netstat -tan | awk '{print $6}' | sort | uniq -c 2 CLOSE_WAIT 121 CLOSING 1 established) 109 ESTABLISHED 17 FIN_WAIT1 9 FIN_WAIT2 1 Foreign 300 LAST_ACK 20 LISTEN 2 SYN_RECV 433 TIME_WAIT 

它也似乎没有文件描述符,但我不是100%确定的。 即使是这样,不会产生一个错误,不挂?

这似乎与nginx正在服务的连接数量有些相关。 我可以closuresnginx,问题就消失了。 说了这个,nginx和apache能够在这个状态下共存,没有问题(apache从不挂起)。 在这些“情节”中,人们也可以在同一台机器上连接到IRC服务器,没有任何问题。 所以也许它是有限的select()?

nginx使用的资源是不是导致select()挂起的套接字/文件描述符? 我正在把头发拉出来。

我尝试了所有通常的networking调整(通过sysctl的各种设置,减less超时),所有没有效果。 机器没有内存不足,CPU和I / O都很好。

Linux dl 2.6.26-2-486 #1 Sat Jun 11 14:47:34 UTC 2011 i686 GNU/Linux

它正在运行Debian Lenny。

什么可能导致select()挂起检查一些套接字?

两件事情:

  1. 代码中的错误调用“select”。

  2. 尚未收到任何信息。

我现在已经解决了这个问题。 请看我最近的问题的细节。 基本上,服务器正在遭受熵的短缺(使用cat /proc/sys/kernel/random/entropy_avail )。 通过Debian haveged安装haveged软件包解决了使用sftp漫长的挂起问题,这可能与大卫·施瓦茨(David Schwartz)所说的“没有收到任何信息”,因为它不能被encryption。 目前我还不清楚为什么ssh没有受到影响(或者没有受到太多的影响)。