开发使用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
求解?
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 了.
为什么还没有释放链接? 操作姿势不对?