网络栈调优98 条

/proc/net/sockstat 速读

按协议汇总 socket 使用量: TCP inuse/orphan/tw/alloc 与内存占用, 适合脚本化采集。

/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 的差值反映回收情况
memsocket 缓冲区占用的页数换算字节后再与缓冲配置对照

判读要点

  • mem 的单位是页,与字节混淆会得出错误的内存结论
  • orphan 要与连接状态分布一起看,单独一个数字没有意义
  • tw 高不等于故障,要结合业务的连接复用方式判断
  • 采集时记录时间戳,便于与告警时间对齐
  • 把数值与业务侧连接数变化对照,才能判断是否真的异常
孤儿连接是无进程持有的连接,通常出现在应用程序异常退出或关闭流程不完整时。它的增长往往比 inuse 更能说明应用侧的问题。
该文件给出的是协议层汇总,看不到具体连接与进程。定位到进程还需 ss 或 lsof 这类工具,两者配合使用效率更高。

易错点

  • 把 mem 的页数当成字节数,内存评估偏差成百上千倍
  • 孤立地看 orphan 计数,不与连接状态分布对照
  • 把 tw 数量高一律当成异常,忽略业务短连接模式的正常特征
  • 只看文件不做时间序列采集,无法判断趋势与变化速度

数据来源与参考

  • Linux 源码 net/ipv4/proc.c
  • man 5 proc
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌