十个连接阻塞 TCP 侦听器,如何解除阻塞

十个连接阻塞 TCP 侦听器,如何解除阻塞

由于多个CLOSE_WAITs。当现有连接总数和CLOSE_WAITs 等于 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 的连接事故。

相关内容