在分布式系统运维中,TCP连接状态异常往往是系统健康的重要风向标。当生产环境频繁出现大量CLOSE_WAIT状态时,意味着系统存在资源泄漏风险。本文基于典型技术栈(Oracle 12c+ZooKeeper+Redis+JDK8),详细解析问题排查路径。
一、现象确认与初步分析
1.1 状态定位
# 快速统计各状态连接数
ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}'
# 定位具体CLOSE_WAIT连接
netstat -napo | grep CLOSE_WAIT | awk '{print $5}' | cut -d: -f1 | sort | uniq -c
1.2 特征分析
- 客户端型CLOSE_WAIT:多出现于服务主动发起请求的场景(如DB/Redis客户端)
- 服务端型CLOSE_WAIT:常见于HTTP服务未关闭连接(Nginx反向代理场景)
二、全链路排查路径
2.1 网络层排查(OS级)
# 查看文件描述符限制
cat /proc/sys/fs/file-nr
# 跟踪socket关闭事件
tcpdump -nn -i any 'tcp[tcpflags] & (tcp-fin) != 0'
2.2 应用层深度检测
2.2.1 JDK内置工具
# 获取线程堆栈
jstack -l <pid> > thread_dump.log
# 内存快照分析(谨慎使用)
jmap -dump:live,format=b,file=heap.hprof <pid>
2.2.2 连接池专项检查
以DBCP连接池为例,添加监控配置:
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name