You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 14:34:31