NodeJs中, TCP的socket如何彻底的断开链接?
发布于 7 年前 作者 axetroy 6318 次浏览 来自 问答

开发使用thrift作rpc通信

thrift的源码大概是这样:

exports.createSSLConnection = function(host, port, options) {
  var stream = tls.connect(port, host, options);
  var connection = new Connection(stream, options);
  connection.host = host;
  connection.port = port;

  return connection;
};

tls类又继承与Net类.

一个Socket, 打开一个文件…

查看进程打开的文件数: ls /proc/{pid}/fd | wc -l

数量稳定的逐步升高.

经过排查后, 发现是链接的RPC没有断开

已经手动调用了: .end: https://nodejs.org/dist/latest-v6.x/docs/api/net.html#net_socket_end_data_encoding .destroy: https://nodejs.org/dist/latest-v6.x/docs/api/net.html#net_socket_destroy_exception

求解?

2 回复

netstat -n | awk ‘/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}’ 排查下TCP的链接状态 看看是不是有大量CLOSE_WAIT?

暂行解决方案:

之前就是hook进Thrift的方法, 一个方法一个链接, 方法调用结束后, 自动end/destroy链接

然后悲剧的是, 这个链接, 并不能释放…导致进程操作的文件数越来越多, 然后进程卡死. pm2内存占用5G后, pm2 ls 根本就没反应.

要手动杀掉进程

Thrift自带重连功能, 离线的write数据放进队列, 老老实实滚回单链接…

但是问题还是那个问题: 明明已经调用了 .destroy 方法 socket.destroyed === true 了.

为什么还没有释放链接? 操作姿势不对?

回到顶部