nginx – 处于TIME-WAIT状态的高#套接字,服务器在加载时无响应

前端之家收集整理的这篇文章主要介绍了nginx – 处于TIME-WAIT状态的高#套接字,服务器在加载时无响应前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我们的应用程序在高负载时没有响应,等待时间更长.进程使用率异常低(每个进程的cpu利用率约为15%,我们的应用程序在8个进程上运行).

Nginx错误日志输出显示了以下一些:

2014/12/04 03:39:31 [crit] 24383#0: *2008067 connect() to 127.0.0.1:4567 Failed (99: Cannot assign requested address) while connecting to upstream,client: 108.162.246.229,server: example.org,request: "GET /socket.io/?EIO=3&transport=polling&t=1417682366937-11501 HTTP/1.1",upstream: "http://127.0.0.1:4567/socket.io/?EIO=3&transport=polling&t=1417682366937-11501",host: "example.org",referrer: "https://example.org/unread"

我看到了什么

> ss -tan的输出grep TIME-WAIT | wc -l在30,000附近的某处,哎哟!
>该应用程序将响应,然后:

>所有进程都会突然降至接近0 cpu使用率
>应用程序将无法响应
>大约30秒后,应用程序将重新启动,无限重复

需要获得应用程序,所以创可贴解决方案:

> echo 28000 65535> ip_local_port_range(MongoDB运行于27101,所以我选择了一个上限)
> echo 1>的/ proc / SYS /网/的IPv4 / tcp_tw_reuse
> echo 1>的/ proc / SYS /网/的IPv4 / tcp_tw_recycle

这使得TIME-WAIT状态下的套接数量减少到400以上.

这是ss -tan的片段grep TIME-WAIT:

State      Recv-Q Send-Q        Local Address:Port          Peer Address:Port
TIME-WAIT  0      0                 127.0.0.1:29993            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:28522            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:29055            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:31849            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:32744            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:28304            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:34858            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:36707            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:34756            127.0.0.1:4567  
TIME-WAIT  0      0            104.131.91.122:443          108.162.250.6:55549 
TIME-WAIT  0      0                 127.0.0.1:32629            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:34544            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:34732            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:33820            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:33609            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:34504            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:32463            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:35089            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:30003            127.0.0.1:4567  
TIME-WAIT  0      0            104.131.91.122:443         199.27.128.100:36383 
TIME-WAIT  0      0                 127.0.0.1:33040            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:34038            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:28096            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:29541            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:30022            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:31375            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:29827            127.0.0.1:4567  
TIME-WAIT  0      0                 127.0.0.1:29334            127.0.0.1:4567  

我的问题:

>其中很多都是从127.0.0.1到127.0.0.1,这是正常的吗?对等体地址不应该都来自外部IP吗?

>我们的Node.js应用程序支持Nginx代理,在CloudFlare DNS之后,这限制了唯一入站IP地址的数量,这可能是相关的吗?

>如何正确减少TIME-WAIT状态下的插座数量
>我很肯定我们每秒没有3000个独特的套接字连接,在我们的端部配置错误并且在应该打开一个套接字时打开数百个套接字?

预先感谢您提供的任何帮助!

最佳答案
最后,我做了更多的研究,并阅读了关于在Nginx代理后面扩展Node应用程序的very excellent guide.

当我将keepalive参数添加Nginx中的上游块时,出现了主要区别.事实证明,Nginx工作者不会缓存传入的连接并重新使用它们,从而导致创建数千个新连接(特别是w / socket.io握手等)

@MichaelHampton建议使用unix域套接字也可以解决这个问题.

猜你在找的Nginx相关文章