由于多个CLOSE_WAIT
s。当现有连接总数和CLOSE_WAIT
s 等于 10 时,新连接会失败。10 个连接的限制在哪里?如何扩展它? (很难找到如何消除CLOSE_WAIT
,但这是一个不同的问题,这个问题具体是关于如何扩大 10 个连接限制。)
Ubuntu 18.04
内核:4.15.0-91-通用
架构:x86_64
输出netstat --tcp --numeric-ports -p|grep 2225
tcp 15 0 localhost:2225 localhost:42928 CLOSE_WAIT -
tcp 8 0 localhost:2225 localhost:33860 CLOSE_WAIT 10570/mdp
tcp 15 0 localhost:2225 localhost:41938 CLOSE_WAIT -
tcp 15 0 localhost:2225 localhost:42800 CLOSE_WAIT -
tcp 15 0 localhost:2225 localhost:40912 CLOSE_WAIT -
tcp 25 0 localhost:2225 localhost:33974 CLOSE_WAIT -
tcp 0 1 localhost:51842 localhost:2225 SYN_SENT 12221/telnet
tcp 15 0 localhost:2225 localhost:41808 CLOSE_WAIT -
tcp 0 0 localhost:33202 localhost:2225 ESTABLISHED 33721/controller
tcp 481 0 localhost:2225 localhost:33596 CLOSE_WAIT 10570/mdp
tcp 20 0 localhost:2225 localhost:33582 CLOSE_WAIT 10570/mdp
tcp 0 0 localhost:2225 localhost:33202 ESTABLISHED 10570/mdp
尝试连接时,我收到“连接超时”。
监听中的积压设置为 5。
应用程序不会(故意)限制连接。
答案1
没有这样的限制(嗯,有是,但即使对于普通系统来说,它也远远超出了 40,000 个连接限制)。
那有什么是,不过,是的限制套接字积压加上服务连接(在多线程服务器的情况下)。
要进行验证,请运行strace
您的二进制文件并使用 grep 查找该行的输出listen(x,y)
。处于 CLOSE_WAIT 状态的连接可能会计入总积压量,因此如果该值太低,则普通的CLOSE_WAIT 的数量可能会阻止服务器接受新连接。
CLOSE_WAIT 意味着客户已关闭连接,但服务器尚未释放套接字。连接到该套接字的任何线程或资源仍然繁忙。通常,对于服务器来说,这是没有意义的 - 一旦连接终止,进程就应该尽快终止。如果没有,则意味着代码级别存在一些问题(而 TIME_WAIT 可以在内核级别调整)。例如,参见本文。
你能有时会减少 CLOSE_WAIT 延迟时间(请参阅这里),但真正的问题在于代码,应该在那里解决。
增加可提供服务的连接数量还需要对服务器代码进行操作 - 它可能是一些简单的配置指令(例如 MaxConnections),甚至可能意味着架构更改。
在某些情况下,可能可以放置一个多路复用器,例如重迪尔在服务器前面(即:在端口上运行原始程序,例如 127.0.0.1:12225,然后指示 redir 侦听 0.0.0.0:2225 上的连接并将它们重定向到 127.0.0.1:12225),以及这将“治愈”某些可能导致过多 CLOSE_WAIT 的连接事故。