通过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()挂起检查一些套接字?
两件事情:
代码中的错误调用“select”。
尚未收到任何信息。
我现在已经解决了这个问题。 请看我最近的问题的细节。 基本上,服务器正在遭受熵的短缺(使用cat /proc/sys/kernel/random/entropy_avail
)。 通过Debian haveged
安装haveged
软件包解决了使用sftp
漫长的挂起问题,这可能与大卫·施瓦茨(David Schwartz)所说的“没有收到任何信息”,因为它不能被encryption。 目前我还不清楚为什么ssh
没有受到影响(或者没有受到太多的影响)。