Node服务器大量ESTABLISHED连接异常排查求助
排查Node服务器大量ESTABLISHED连接问题
我正在排查一个Node服务器的连接泄漏问题:即使没有活跃请求,服务器仍存在大量ESTABLISHED连接,该问题在测试环境和生产环境均存在。
测试机ESTABLISHED连接数统计
572 127.0.0.1 48 172.18.0.23 48 172.18.0.16 47 172.18.0.18 47 172.18.0.15 46 172.18.0.24 46 172.18.0.20 31 0.0.0.0 26 2 172.31.45.51
本地localhost ESTABLISHED连接示例
tcp 0 0 localhost:59596 localhost:8051 ESTABLISHED hyperledger 478386467 3632665/node /opt/h tcp 0 0 localhost:44164 localhost:2379 ESTABLISHED etcd 459192509 529/etcd tcp 0 0 localhost:9050 localhost:48376 ESTABLISHED root 478391433 1653221/docker-prox tcp 0 0 localhost:8050 localhost:55040 ESTABLISHED root 478390603 1652718/docker-prox tcp 0 0 localhost:39050 localhost:8050 ESTABLISHED hyperledger 478550015 3632665/node /opt/h tcp 0 0 localhost:8051 localhost:60804 ESTABLISHED root 478579826 1652946/docker-prox tcp 0 0 localhost:7051 localhost:44068 ESTABLISHED root 478581029 3355251/docker-prox tcp 0 0 localhost:37922 localhost:9050 ESTABLISHED hyperledger 478382004 3632665/node /opt/h tcp 0 0 localhost:53382 localhost:8050 ESTABLISHED hyperledger 478537715 3632665/node /opt/h tcp 0 0 localhost:45914 localhost:7050 ESTABLISHED hyperledger 478384838 3632665/node /opt/h tcp 0 0 localhost:9051 localhost:36842 ESTABLISHED root 478388152 1653426/docker-prox tcp 0 0 localhost:56526 localhost:7050 ESTABLISHED hyperledger 478390799 3632665/node /opt/h tcp 0 0 localhost:53918 localhost:7051 ESTABLISHED hyperledger 478608229 3632665/node /opt/h tcp 0 0 localhost:8051 localhost:42296 ESTABLISHED root 478537891 1652946/docker-prox tcp 0 0 localhost:7050 localhost:56334 ESTABLISHED root 478390037 1652249/docker-prox
连接双向关系说明
本地连接呈现成对的双向连接,一半由root用户(Docker代理)发起,另一半由hyperledger用户(Node进程)发起,示例如下:
tcp 0 0 localhost:7051 localhost:53946 ESTABLISHED root 478608259 3355251/docker-prox tcp 0 0 localhost:53946 localhost:7051 ESTABLISHED hyperledger 478609232 3632665/node /opt/h
其中:
localhost:53946 -> localhost:7051:Node服务器连接到Docker中的Fabric节点localhost:7051 -> localhost:53946:容器内Fabric节点回连到Node服务器
当前运行的Node进程
1716966 ? Sl 17:15 node app/main.js name - hyperledger-explorer 3632665 ? Ssl 7:11 node /opt/hyperledger/vm1/fabric/server/server.js
疑问与排查难点
- 无活跃请求时仍存在大量ESTABLISHED连接,是否说明Node服务器未正确关闭连接?
- Node Web服务器仅监听5000端口,为何会出现大量不同端口的连接?
- 已调用Fabric SDK的
gateway.disconnect()方法,但连接似乎未被释放,问题出在哪里? - 对netstat输出的细节理解不足,无法定位核心问题,怀疑与Node应用有关但未找到线索。
排查建议
1. 验证Fabric SDK资源释放逻辑
- 检查
gateway.disconnect()的调用时机:是否在所有Fabric操作(合约调用、查询)完成后执行?是否存在异步操作未等待完成就调用断开的情况? - 除Gateway外,确认是否释放了所有关联的
Network、Contract实例,部分SDK版本需显式关闭这些资源才能释放底层连接。 - 核对Fabric Node SDK官方文档,确认资源释放的完整流程,避免遗漏步骤。
2. 监控Node进程的连接生命周期
- 使用
lsof -p <Node进程ID>实时跟踪进程连接变化,对比调用gateway.disconnect()前后的连接数差异。 - 开启Fabric SDK调试日志:
DEBUG=fabric-network:* node server.js,查看连接建立、关闭的日志记录,确认是否有断开失败的日志。
3. 检查TCP连接超时配置
- 查看Fabric节点的TCP连接超时设置,是否因保持时间过长导致连接未被主动回收。
- 在Node应用中配置Socket超时参数,比如设置
request.setTimeout()或SDK层面的连接超时,确保闲置连接能被主动关闭。
4. 排查Docker代理的连接转发逻辑
- 由于连接是Docker代理与Node进程的双向连接,可重启Docker服务临时验证是否缓解问题,排查
docker-proxy是否存在连接泄漏。 - 检查容器网络配置,确认端口映射是否正确,是否存在异常的连接转发规则。
5. 分析连接创建频率
- 使用
watch -n 1 "netstat -anp | grep ESTABLISHED | grep <Node进程ID>"观察连接是否持续增长,判断是泄漏还是正常的连接池保留。 - 如果是连接池问题,检查Fabric SDK是否启用连接池,确认池大小和闲置超时配置是否合理。
内容的提问来源于stack exchange,提问作者Matias Salimbene
相关产品推荐
相关产品推荐

