/proc/net/sockstat 速读
这个文件按协议汇总 socket 的使用量:sockets 行给出总量,TCP 行则把在使用的连接、无进程持有的孤儿连接、TIME-WAIT 数量、已分配总数与内存占用分列出来。它的输出格式稳定、读取开销很低,很适合脚本化采集和长期留档。
基本信息
| 读取方式 | cat /proc/net/sockstat |
|---|---|
| 文件开头 | sockets: used 后跟当前使用的 socket 总数 |
| TCP 行字段 | inuse、orphan、tw、alloc、mem |
| 内存单位 | mem 以页计,换算成字节需乘页大小 |
| 其他协议 | UDP、UDPLITE、RAW 等各有独立行 |
典型使用场景
- 脚本化采集连接规模趋势,比解析 ss 输出更稳定
- 观察 orphan 增长,判断是否存在无进程持有的连接堆积
- 跟踪 TIME-WAIT 数量随业务模式变化的规律
- 估算 socket 缓冲区内存占用,评估容量水位
- 与 ss -s 对照,核对两处口径是否一致
读取与采集
读取与采集
cat /proc/net/sockstat # 查看全部协议段的汇总
awk '/^TCP:/{print}' /proc/net/sockstat # 只看 TCP 行
cat /proc/net/sockstat > /tmp/sk1; sleep 60; cat /proc/net/sockstat > /tmp/sk2 # 间隔采集
ss -s # 与 ss 的总览输出对照TCP 行字段判读
| 字段 | 含义 | 判读 |
|---|---|---|
| inuse | 当前在使用的 TCP socket 数 | 与业务连接规模对照 |
| orphan | 无进程持有的孤儿连接数 | 持续增长说明连接未被正确关闭 |
| tw | 处于 TIME-WAIT 的连接数 | 短连接频繁时会明显偏高 |
| alloc | 已分配的 TCP socket 总数 | 与 inuse 的差值反映回收情况 |
| mem | socket 缓冲区占用的页数 | 换算字节后再与缓冲配置对照 |
判读要点
- mem 的单位是页,与字节混淆会得出错误的内存结论
- orphan 要与连接状态分布一起看,单独一个数字没有意义
- tw 高不等于故障,要结合业务的连接复用方式判断
- 采集时记录时间戳,便于与告警时间对齐
- 把数值与业务侧连接数变化对照,才能判断是否真的异常
孤儿连接是无进程持有的连接,通常出现在应用程序异常退出或关闭流程不完整时。它的增长往往比 inuse 更能说明应用侧的问题。
该文件给出的是协议层汇总,看不到具体连接与进程。定位到进程还需 ss 或 lsof 这类工具,两者配合使用效率更高。