使用ws模块搭建的WebSocket服务器终止连接后,操作系统仍存在ESTABLISHED状态TCP连接的问题求助
使用ws模块搭建的WebSocket服务器终止连接后,操作系统仍存在ESTABLISHED状态TCP连接的问题求助
我用ws模块搭了个WebSocket服务器,整体运行还不错,但最近发现Active handles的数量比实际活跃连接数多了一倍还多。
于是我查了服务器上的开放套接字,执行了这个命令:
lsof -p <pid-of-node-process> > lsof.log
结果显示的ESTABLISHED状态TCP套接字数量和Active handles的数值差不多。
我对日志做了些处理,发现大约三分之二的连接来自重复的地址,用到的命令是:
cat lsof.log | grep -oP ':3000->\S+:' | grep -oP '[0-9A-z\-.]+:$' | sort
因为客户端分布在不同地区,网络连接肯定存在一些问题,所以服务器需要偶尔终止连接,来保证客户端状态报告的准确性。我是通过一个基础的心跳循环来实现的,代码如下:
function heartbeat() { this.isAlive = true; } var noop = function () {}; var interval = setInterval(function () { server.clients.forEach(function (conn) { if (conn.isAlive === false) { conn.emit("close"); return conn.terminate(); } conn.isAlive = false; conn.ping(noop); }); }, options.pingInterval); server.on('connection', function onOpen(conn, req) { ... conn.isAlive = true; conn.on('pong', heartbeat); });
为了搞清楚问题根源,我想知道这些套接字最后一次传输数据是什么时候,还好ss命令能帮我做到这点:
ss -ti > ss.log
查看lastrcv字段后,我发现有些套接字从进程创建时(大概30天前)就处于“空闲”状态,但它们的状态仍然是ESTABLISHED。这看起来很奇怪,我怀疑服务器终止套接字的时候,虽然从应用的clients列表里移除了连接,但操作系统层面的套接字还保持着开放状态。
有没有人遇到过类似的情况,或者能给我一些相关的信息?
备注:内容来源于stack exchange,提问作者php_nub_qq
相关产品推荐
相关产品推荐

