ss -tna 能直接看到所有 tcp 连接状态,因为它直接读取内核 socket 表,状态字段稳定、延迟低;-t 限定 tcp,-n 禁用解析防卡顿,-a 包含监听与中间态(如 time-wait、close-wait)。

ss -tna 能直接看到所有 TCP 连接状态
Linux 查看具体连接等待状态,核心是看 TCP 状态机里的中间态(比如 TIME-WAIT、CLOSE-WAIT、FIN-WAIT-1),而不是只盯着 ESTABLISHED 或 LISTEN。用 ss 最准,因为它直接读内核 socket 表,不经过用户态解析,延迟低、状态字段稳定。
执行:ss -tna 就能列出全部 TCP 连接,每行末尾的 State 列就是当前状态(如 ESTAB、TIME-WAIT、CLOSE-WAIT)。注意加 -n 是为了跳过 DNS 和服务名反查——否则遇到大量连接时会卡住甚至超时。
-
-t:只看 TCP(UDP 不参与状态机) -
-n:禁用解析,避免阻塞 -
-a:包含监听中和已关闭但未清理的连接(比如LISTEN和各种*-WAIT)
统计 TIME-WAIT 数量别用 grep,用 ss 的 state 子命令
很多人写 ss -tn | grep 'TIME-WAIT' | wc -l,结果不准。因为不同内核版本里状态字段对齐方式可能变,grep 容易漏匹配或误匹配。正确做法是用 ss 自带的状态过滤:
ss -tn state time-wait | wc -l
这个命令靠内核返回的真实状态值过滤,大小写不敏感,且不依赖列位置。如果要按本地端口聚合,可以追加:ss -tn state time-wait | awk '{print }' | cut -d':' -f2 | sort | uniq -c
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 状态名用小写(
time-wait),ss内部自动映射 - 输出无表头,不用
grep -v去除标题行 - 避免用
/proc/net/sockstat里的tw字段做精确排查——它只是概览值,滞后且不带连接详情
netstat 输出的 TIME_WAIT 状态容易被忽略
netstat 默认不显示 TIME-WAIT 连接,除非显式加 -a。常见错误是只跑 netstat -tuln,结果只能看到 LISTEN,完全漏掉大量等待回收的连接。
要查全,必须用:netstat -tna | grep -i time_wait(注意大小写不敏感)
-
-a是关键,否则非监听态连接(包括所有等待态)全被过滤 -
netstat在新系统上常未预装,需先确认:which netstat或安装net-tools - 性能比
ss差,尤其连接数 >5k 时,netstat可能卡顿数秒
为什么 CLOSE-WAIT 多说明对方没发 FIN?
CLOSE-WAIT 出现多,不是本机问题,而是远端关闭连接后,本机应用没调用 close() —— 导致 socket 卡在半关闭状态。这和 TIME-WAIT 不同:TIME-WAIT 是主动关闭方的必要等待,而 CLOSE-WAIT 是被动方该关没关。
排查方法:ss -tn state close-wait | head -20 看前 20 条,结合 -p(需 root)定位进程:ss -tnp state close-wait
- 如果看到大量
CLOSE-WAIT对应同一个 PID,基本锁定是那个进程的 socket 泄露 - 注意:加
-p会触发权限检查,普通用户只能看到自己的进程 -
CLOSE-WAIT持续堆积会导致本地 fd 耗尽,后续connect()失败报EMFILE
ss -tna 输出里的 State 列,比反复猜更省时间。










