优先看 /proc/net/sockstat 是因为它提供内核级全局统计快照,字段明确、无解析开销、不依赖 tcp_diag 模块,适合脚本轮询或告警;而 ss -s 的 total 与 kernel 差值需人工解读且旧内核中 kernel 值可能不准。

直接看 /proc/net/sockstat,它给出的是内核级套接字资源总览,比 ss -s 更底层、更稳定,且无需 root 权限就能读取。
为什么优先看 /proc/net/sockstat 而不是 ss -s
/proc/net/sockstat 是内核维护的全局统计快照,字段含义明确、无解析开销、不依赖 tcp_diag 模块,适合脚本轮询或告警阈值判断。而 ss -s 的 Total 和 kernel 两数差值虽能提示泄漏,但需人工解读,且部分旧内核(如 3.10)中 kernel 值可能不准。
-
sockets: used N—— 当前所有协议栈中已分配的 socket 结构体总数(含未绑定、半连接等) -
TCP: inuse X orphan Y tw Z alloc W——inuse是当前活跃 TCP socket 数;orphan是无进程归属的连接(典型泄漏信号);tw是 TIME_WAIT 数量;alloc是已分配的 socket 描述符总数 -
UDP: inuse M—— UDP 套接字数量,不体现连接状态,只反映绑定端口数
ss -s 输出里哪些字段真正值得盯
ss -s 第一行的 Total: N (kernel M) 容易误导,真正要盯的是下面按状态拆解的 TCP 行:
-
estab:ESTABLISHED 连接数,持续高于业务峰值均值,说明下游响应变慢或连接未释放 -
orphaned> 0:必须立即排查——进程已退出但 socket 未 close,常见于 daemon 子进程异常终止后父进程未 wait -
timewait左侧数字持续增长且net.ipv4.tcp_tw_reuse为 0:说明 TIME_WAIT 积压,需检查是否短连接密集且未启用复用 -
synrecv> 0 且长期不降:要么是 SYN Flood,要么是net.core.somaxconn设置过小导致 accept 队列满,新连接卡在 SYN_RECV
定位具体进程打开的 socket 时别只靠 ss -tulp
ss -tulp 看起来方便,但实际有三个硬伤:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 需要 root 权限才能显示
-p(否则报Permission denied) - 输出中 PID 可能被截断(尤其当命令行过长时),
ss默认只显示前 20 字符 - 无法区分同一进程多个线程打开的 socket,也无法看到已关闭但尚未被回收的 fd
更可靠的做法是组合 /proc/[pid]/fd/ 和 /proc/net/tcp:
ls -l /proc/1234/fd/ | awk '/socket/ {gsub(/[^0-9]/,"",$11); print $11}' | sort -u | \
xargs -I{} awk '$10 == "{}" {print $2,$4,$5,$6}' /proc/net/tcp
其中 $10 是 inode 列,$2 是本地地址+端口,$4 是十六进制状态码(01=ESTABLISHED,0A=LISTEN)
监控连接数趋势时避免轮询 /proc/net/tcp
直接 cat /proc/net/tcp | wc -l 在万级连接下会明显拖慢系统,因为每次读取都要遍历整个哈希表。正确做法是:
- 用
ss -tan state established | wc -l替代,它走 tcp_diag 接口,速度提升 5–10 倍 - 若需长期采样,改用
ss -s解析 TCP 行里的estab字段,而非全文计数 - 注意
ss默认会做 DNS 反解,加-n参数禁用,否则在 DNS 不稳时会卡住
真正容易被忽略的是:/proc/net/ 下所有文件都是实时生成的虚拟文件,没有缓存机制。高频读取(如间隔 /proc/net/tcp6 在 IPv6 启用时也会参与计算——哪怕你只关心 IPv4。










