我们的应用程序在高负载下变得反应迟钝,等待时间更长。 进程使用率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万附近,哎! 需要得到的应用程序,所以创可贴的解决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
我的问题:
TIME-WAIT
状态下的套接字数量? 预先感谢您提供的任何帮助!
最后,我做了更多的研究,并阅读了关于在nginx代理之后扩展Node应用的非常出色的指南 。
当我在nginx的upstream
模块中joinkeepalive
参数时,主要的区别就来了。 事实certificate,nginx工作人员不会caching传入的连接并重新使用它们,从而导致创build数千个新的连接(尤其是w / socket.io握手等)
@ MichaelHamptonbuild议使用unix域套接字也可以很好地解决这个问题。