【发布时间】:2017-02-13 04:36:04
【问题描述】:
我使用 ubuntu(12.04) + nodejs (v0.10.22) + socket.io (v0.9.14) 来传输消息。
有大约 300 个同时连接。几个小时后(大约 1 或 2 小时以上,它不会立即显示),一些连接将持续处于 CLOSE_WAIT 或 FIN_WAIT2 状态。
这些不死连接会随着时间线性增长。当连接数达到限制(默认1024)时,用户将很难连接套接字服务器,除非某些连接正常释放。
以下为socket服务连接状态,运行约3小时。
netstat -anl | grep <PORT_OF_NODE_PROCESS> | awk '/^tcp/ {t[$NF]++}END{for(state in t){print state, t[state]} }'
FIN_WAIT2 23
LISTEN 1
CLOSE_WAIT 27
TIME_WAIT 12
ESTABLISHED 333
FIN_WAIT1 12
可能的解决方案
1。定时触摸js文件
使用Nodemon Package运行js文件,当修改文件的最后修改时间时,nodemon会重启服务,并释放之前所有的未死连接(CLOSEWAIT或FINWAIT2)
2。增加连接限制
sudo vim /etc/security/limits.conf
* soft nofile 1024
* hard nofile 2048
root soft nofile 4096
root hard nofile 8192
user1 soft nofile 2048
user1 hard nofile 2048
尽量让连接难以达到限制。
3。减少保活超时
让操作系统在短时间内自动关闭连接,但我还没有尝试。
问题
我找到了一些可能的解决方案来解决这个问题。但上述解决方案并没有真正解决状态为 CLOSE_WAIT 或 FIN_WAIT2 的持久连接问题。我可以发现这是服务器(CLOSE_WAIT)或客户端(FIN_WAIT2)未正确关闭连接的结果。我认为 socket.io 会在超时后强制关闭这些错误的连接。但它似乎无法正常工作。
我尝试在我的测试环境中再次出现状态 CLOSE_WAIT 或 FIN_WAIT2 问题。但它从不显示这些连接情况。
- 连接套接字服务器并断开网络后
- 长时间连接socket服务器
我之前发现有人问过相关问题(Many stale connections in state CLOSE_WAIT and FIN_WAIT2),但仍然找不到解决方案。有谁知道如何解决这个问题??
谢谢
【问题讨论】: