首页/系统/Linux 内核与性能调优速查//proc/net/snmp 协议计数速查
网络栈调优98 条

/proc/net/snmp 协议计数速查

协议栈各层的累计计数来源: 头部行与数值行成对出现, 用列序对位解读重传、错误等指标。

/proc/net/snmp 是什么

这是协议栈各层累计计数的原始来源,每个协议段由两行组成:第一行是列名,第二行是对应的数值,两行的列序严格对应。nstat 与 netstat -s 都在它之上做二次加工,需要原始累计值或自建采集时可以直接读这个文件。

基本信息

包含协议段Ip、Icmp、Tcp、Udp 等,按段解析
读取方式成对提取表头行与紧跟的数值行
Tcp 段常用列RetransSegs、InErrs、InCsumErrors、OutRsts、CurrEstab
计数语义自开机以来的累计值,重启后归零
更易读的替代nstat 会补上名称并按差值展示

典型使用场景

  • 自建监控采集:直接取累计值再自行计算速率
  • 核对 nstat 与 netstat -s 的口径,确认两者的数据来源一致
  • 怀疑校验和错误或 RST 异常增多时,查看对应计数器
  • 对比重启前后的累计值变化,判断异常是否持续存在
  • 在没有 sysstat 与 nstat 的精简系统上做协议栈观测

读取方法

读取方法
awk '/^Tcp:/{print; getline; print}' /proc/net/snmp   # 表头与数值成对输出
awk '/^Udp:/{print; getline; print}' /proc/net/snmp   # 换段名即换统计对象
nstat -az | grep -iE 'RetransSegs|InErrs|OutRsts'     # 带名称与差值的对照口径
stat -c %Y /proc/uptime && uptime                     # 先确认运行时长再解读累计值

Tcp 段常见列

列名含义异常提示
RetransSegs重传的报文段总数需与发送总量比较占比
InErrs接收到的错误报文数持续增长说明链路或对端异常
InCsumErrors校验和错误的报文数增长通常指向链路质量或网卡卸载问题
OutRsts发出的 RST 报文数异常增多可能是连接被频繁拒绝
CurrEstab当前处于建立状态的连接数用于判断连接规模与容量水位
列名与数值必须按位置一一对位,直接按固定列号取值会在内核版本变化时读错列;稳妥做法是先打印表头确认列序,再按名称定位。
累计值在重启后归零,跨重启直接比较毫无意义。做趋势分析前先确认系统运行时长,或者改用 nstat 的差值口径。

易错点

  • 列名行与数值行错位对读,得出完全错误的结论
  • 忽略累计值跨重启归零,把重启后的低计数当成问题已解决
  • 用固定列号提取数值,内核升级后列序变化导致采集静默失真
  • 把 32 位计数器的回绕当成异常,未先确认运行时长与增长速度

数据来源与参考

  • Linux Documentation/networking/proc_net_snmp.rst
  • man nstat
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌