ss -s 是最轻量精准的连接状态分布入口,直接汇总 ESTAB、TIME-WAIT、LISTEN 数量及内存占用;TCP inuse 持续超1000或 orphaned > 0 提示泄漏或进程崩溃,tw > 5000 且 tcp_tw_reuse 关闭易致端口耗尽。

直接看连接状态分布,ss -s 是最轻量、最准的入口——它不列具体连接,但一眼告诉你 ESTAB、TIME-WAIT、LISTEN 各有多少,内存占用多少,有没有异常堆积。
ss -s 输出各字段含义和判断依据
ss -s 不显示单个连接,而是汇总统计。输出类似:
sockets: used 1234 TCP: inuse 456 orphaned 12 tw 89 alloc 470 mem 32 UDP: inuse 23 mem 1 RAW: inuse 0 ...
关键看三块:
-
TCP: inuse:当前活跃 TCP socket 数(含 LISTEN 和 ESTAB),持续高于 1000 且增长快,可能有连接泄漏 -
tw:TIME-WAIT 连接数,短时突增几百属正常;若长期 >5000 且net.ipv4.tcp_tw_reuse关闭,容易耗尽端口 -
orphaned:无用户进程关联的 TCP socket,值 >0 就要查——通常意味着进程崩溃但 socket 没被回收
为什么不用 netstat -s?
netstat -s 也能统计,但它按协议分段输出、字段命名不统一(比如 TIME-WAIT 记作 time wait,大小写和空格不一致),且默认不汇总内存占用。更麻烦的是:
- 部分新版系统(如 Ubuntu 24.04+/AlmaLinux 9+)默认不带
netstat,需额外装net-tools -
netstat -s解析内核计数器时有缓存延迟,ss -s直读 /proc/net/sockstat,更实时 - 遇到大量连接时,
netstat -s执行慢半秒以上,ss -s基本瞬回
结合 ss -tuln 和 ss -s 定位异常状态
光看 ss -s 知道“有问题”,但不知道“在哪”。这时用 ss -tuln 过滤对应状态:
- 查所有 ESTAB 连接:
ss -tn state established(注意不是ss -tuln | grep ESTAB,后者漏掉非监听态连接) - 查异常多的 TIME-WAIT:
ss -tan state time-wait | head -20,看是不是集中在某 IP 或端口 - 查 LISTEN 但没进程绑定的端口:
ss -tuln | grep ":8080"(假设 8080 异常)再补-p,如果没 PID 就是端口被占但服务没起来
特别注意:ss -tn 默认只显示 IPv4,要含 IPv6 得加 -6 参数,否则可能漏掉真实连接来源。
连接状态分布背后容易被忽略的点
很多人把 ss -s 当成“看看数字”,其实它暴露的是内核 socket 子系统的负载水位。真正要命的不是 ESTAB 多,而是 mem 字段持续上涨——说明 sk_buff 缓冲区吃紧,可能引发丢包或延迟抖动。另外,RAW 或 UNIX 行非零,往往意味着监控 agent(如 Prometheus node_exporter)或容器运行时在高频创建 socket,得查对应进程是否配置了过短的采集间隔。


















