ss命令是排查TCP残留连接的核心工具,可精准统计TIME_WAIT、CLOSE_WAIT等非ESTABLISHED状态分布,并通过state语法和-p选项定位关联进程与端口,无ss时可读/proc/net/tcp解析十六进制状态码。

直接用 ss -antp 查残留连接分布,关键不在“全量输出”,而在精准提取和分类状态。残留连接通常指非 ESTABLISHED 但长期不消退的状态,比如 TIME_WAIT、CLOSE_WAIT、FIN_WAIT1/2、LAST_ACK 等——它们卡住会耗端口、占内存、拖慢服务。
看全量状态分布(含残留)
执行以下命令一次性统计所有 TCP 状态数量:
ss -ant | awk 'NR>1 {print $1}' | sort | uniq -c | sort -nr
说明:
-
NR>1跳过表头行,避免把 "State" 当作状态计数 -
$1是 ss -ant 输出的第一列,即状态名(如 TIME_WAIT、CLOSE_WAIT),稳定可靠 - 结果按数量降序排列,高频残留状态(如大量 TIME_WAIT 或 CLOSE_WAIT)一眼可见
单独查重点残留状态详情
对可疑状态,加 -p 查进程,确认谁在持有着这些连接:
ss -antp state time-wait | head -20
ss -antp state close-wait | head -20
ss -antp state fin-wait-2 | head -20
说明:
-
state time-wait是 ss 原生语法,不区分大小写,比 grep 更准 -
-p显示关联进程(需 root 或 sudo 权限),可定位是 nginx、java 还是某个未释放 socket 的脚本 -
head -20防止刷屏,先看典型样本;若要导出分析,可接> close_wait.log
按进程或端口聚焦残留来源
如果发现某进程残留多,进一步按其 PID 或监听端口过滤:
ss -antp | grep ':80' | grep 'close-wait'
ss -antp | grep 'java' | grep -E '(fin-wait|close-wait)'
说明:
- 注意 sport/dport 方向:服务端查别人连自己,用
sport = :80;客户端查自己连出去的,才用dport = :80 - 用
grep -E同时匹配多个状态,适合快速筛查组合问题(如 FIN_WAIT2 + CLOSE_WAIT 共存,常指向对端异常 + 本端未 close)
补充:无 ss 时读 /proc/net/tcp(Alpine 等精简系统)
若容器里没有 ss,可解析内核原始状态码:
awk '$4 == "06" {++tw} $4 == "08" {++cw} END {print "TIME_WAIT:", tw+0, "CLOSE_WAIT:", cw+0}' /proc/net/tcp
说明:
-
$4是十六进制状态字段:06= TIME_WAIT,08= CLOSE_WAIT(查man 7 tcp确认) - 这种写法绕过用户态工具,最底层、最轻量,适合资源受限环境


















