首页/系统/Linux 内核与性能调优速查//proc/net/softnet_stat 丢包定位
网络栈调优98 条

/proc/net/softnet_stat 丢包定位

网卡到协议栈之间的丢包会统计在 softnet_stat: 第二列增长代表 backlog 溢出, 第三列增长代表软中断预算耗尽。

收包丢包定位

/proc/net/softnet_stat 记录网卡到协议栈之间的丢包与压力,每个 CPU 一行,数值以十六进制呈现。第 1 列是累计处理的包数,第 2 列是因 backlog 队列溢出丢弃的包数,第 3 列是 time_squeeze 次数(软中断一轮处理超时、被迫让出 CPU 的次数)。第 2 列增长说明 net.core.netdev_max_backlog 相对当前速率偏小,第 3 列增长说明 netdev_budget 系列的预算不足,两列对应不同参数。

基本信息

读取cat /proc/net/softnet_stat
行对应每行对应一个 CPU
第 2 列backlog 溢出丢弃的包
第 3 列time_squeeze 次数
相关参数netdev_max_backlog 与 netdev_budget

典型使用场景

  • 高包速率下出现应用层看不见的丢包
  • 判断该调大 backlog 还是预算
  • 定位软中断热点集中在哪个核
  • 与网卡级、UDP 层统计交叉印证丢包位置
  • 收包优化前后的对比验证

读取与对照

读取与对照
cat /proc/net/softnet_stat            # 十六进制,每行一个 CPU
cat /proc/net/softnet_stat | head -4
sysctl net.core.netdev_max_backlog net.core.netdev_budget
mpstat -P ALL 1 3                    # 看 %soft 的核间分布
cat /proc/net/snmp | grep -A1 Ip     # 协议栈层统计对照
ip -s link show dev ens5 | head -20  # 网卡层丢包统计

逐列读法

列含义对应动作
第 1 列累计处理的包数作为处理能力基线
第 2 列backlog 溢出丢弃的包评估 netdev_max_backlog
第 3 列time_squeeze 次数评估 netdev_budget 与 netdev_budget_usecs
行号CPU 序号定位热点核,配合中断亲和调整
这些数值是十六进制,直接按十进制读会得出完全错误的量级,需要先转换再判断。
逐 CPU 的分布比总量更有价值:总量看不出问题集中在哪个核,而热点核往往就是优化的入口。

拿到读数后的下一步

  • 把逐核增量与 /proc/interrupts 的中断分布对照,确认热点核是否与中断集中位置一致
  • 若第 2 列增长,评估 netdev_max_backlog;若第 3 列增长,评估 netdev_budget 系列
  • 若两列都不增长却仍有丢包,转到网卡统计与应用套接字统计继续排查
  • 调整后用相同采样方式复核,确认对应列的增长速率确实下降
采样要把同一 CPU 行的前后两次读数对比:不同核之间的绝对值没有可比性,必要时用 mpstat 的逐核数据交叉确认行号对应的核。

易错点

  • 按十进制解读:数值是十六进制,量级判断完全失真
  • 只看总量不看逐核分布:定位不到热点核,无从下手优化
  • 混淆第 2 列与第 3 列:它们对应不同参数,改错对象看不到效果
  • 忽略网卡侧统计:驱动层丢弃不会体现在 softnet_stat 里
  • 采样间隔过短:计数增长慢的场景需要更长的观察窗口

数据来源与参考

  • Linux Documentation/admin-guide/sysctl/net.rst
  • Linux 源码 net/core/dev.c softnet_data
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌