处于TIME-WAIT状态的套接字数量较多,服务器在加载时无响应

我们的应用程序在高负载下变得反应迟钝,等待时间更长。 进程使用率exception低(每个进程约15%的CPU利用率,我们的应用程序运行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输出 ss -tan | grep TIME-WAIT | wc -l ss -tan | grep TIME-WAIT | wc -l在3万附近,哎!
  • 该应用程序将是响应,然后:
    • 所有的进程会突然下降到接近0的CPU使用率
    • 应用程序将无法响应
    • 约30秒后,应用程序将备份,重复无限

需要得到的应用程序,所以创可贴的解决scheme:

  • echo 28000 65535 > ip_local_port_range (MongoDB在27101上运行,所以我select了一个以上的下限)
  • echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
  • echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle

这减less了TIME-WAIT状态下的套接字数量到400。


这是一个ss -tan | grep TIME-WAIT片段 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地址的数量,这可能是相关的吗?
  • 如何正确减lessTIME-WAIT状态下的套接字数量?
  • 我是积极的,我们没有每秒 3000个独特的套接字连接,是我们的结果错误configuration,并打开数百个sockets,当它应该打开一个?

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

最后,我做了更多的研究,并阅读了关于在nginx代理之后扩展Node应用的非常出色的指南 。

当我在nginx的upstream模块中joinkeepalive参数时,主要的区别就来了。 事实certificate,nginx工作人员不会caching传入的连接并重新使用它们,从而导致创build数千个新的连接(尤其是w / socket.io握手等)

@ MichaelHamptonbuild议使用unix域套接字也可以很好地解决这个问题。