
Linux连接数过多时,核心是快速识别异常状态分布,并定位到具体连接和对应进程。别依赖过时的 netstat,直接用 ss——它从内核 socket 子系统读取,快、准、支持细粒度过滤。
快速统计各状态连接数量
一条命令看清全局分布:
ss -tan state established | wc -l —— 查当前 ESTABLISHED 连接数ss -tan state time-wait | wc -l —— 统计 TIME-WAIT 数量ss -tan state close-wait | wc -l —— 检查 CLOSE-WAIT 是否堆积ss -tan state syn-recv | wc -l —— 发现 SYN-RECEIVED 异常
想一次性看全状态占比?用:
ss -tan | awk '{print $1}' | sort | uniq -c | sort -nr
定位高连接数来源 IP 或端口
如果 ESTABLISHED 突增,先看是不是某几个客户端打爆了服务:
-
ss -tn state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10—— 找出连接最多的前 10 个客户端 IP -
ss -tn state established | awk '{print $4}' | cut -d: -f2 | sort | uniq -c | sort -nr | head -5—— 查看哪些服务端口承载了最多连接
若发现大量连接来自同一 IP 但源端口不同,大概率是该客户端未正确关闭连接;若集中在某个后端端口,需检查对应进程是否卡在 recv() 或 accept()。
深入分析单个异常连接行为
对可疑连接加参数看底层指标:
ss -tni state time-wait | head -5 —— 查看 TIME-WAIT 连接的重传(retrans)、RTO、RTTss -tni state established | grep "retrans: [4-9]\|retrans: [1-9][0-9]" —— 筛出重传 ≥4 次的连接,说明链路丢包或对端响应慢
结合 lsof -i :端口号 或 ss -tunlp | grep :端口号 直接看到占用该端口的进程 PID 和名称。
区分问题类型,对症下药
不同状态堆积反映不同根源:
-
TIME-WAIT 过多(持续 >5000):不是故障,是协议正常行为;但高频短连接(如 HTTP 无 Keep-Alive)会加剧。优先改应用:启用连接复用、引入连接池;临时可开
net.ipv4.tcp_tw_reuse = 1(仅对 client 有效) -
CLOSE-WAIT 大量堆积:服务端收到 FIN 后没调
close(),属于应用层资源泄漏。检查代码中 socket 关闭逻辑,或用strace -p PID观察是否阻塞在read()/recv() - SYN-RECEIVED 或 FIN-WAIT-2 堆积:两端行为不一致。前者常见于客户端网络不可达或防火墙拦截 ACK;后者多因对端未发 FIN 或中间设备中断连接
真正有效的排查,靠的是状态分布 + 源/目标特征 + 底层指标三者交叉验证,而不是只看一个数字。










