首页/系统/Linux 内核与性能调优速查/net.core.netdev_budget 软中断预算
网络栈调优98 条

net.core.netdev_budget 软中断预算

每轮网络软中断最多处理的包数与时间预算(netdev_budget / netdev_budget_usecs);高 PPS 丢包时可评估调整。

网络软中断预算

net.core.netdev_budget 与 net.core.netdev_budget_usecs 是网络软中断的每轮预算:前者限制一次软中断轮询最多处理多少个包(默认 300 量级),后者限制最多消耗多少微秒(默认 2000 量级)。两者共同决定收包压力大时一次能完成多少工作,处理不完的留到下一轮。包速率高而预算不足时,来不及处理的包会被丢弃,证据就在 /proc/net/softnet_stat 的 dropped 与 time_squeeze 列。

基本信息

参数net.core.netdev_budget 与 net.core.netdev_budget_usecs
默认量级300 个包与 2000 微秒
丢包证据/proc/net/softnet_stat 的第 2 列 dropped 与第 3 列 time_squeeze
关联参数net.core.netdev_max_backlog
生效范围全机

典型使用场景

  • 负载均衡、DNS、日志采集等高包速率场景出现收包丢包
  • softnet_stat 的 time_squeeze 计数持续增长
  • 单核软中断饱和限制了整机收包能力
  • 与中断亲和、RPS 配合做收包侧优化
  • 评估网卡队列数与核数配置是否匹配

查看与观察

查看与观察
sysctl net.core.netdev_budget net.core.netdev_budget_usecs
cat /proc/net/softnet_stat | head -3     # 每行对应一个 CPU,数值为十六进制
sysctl -w net.core.netdev_budget=600
sysctl -w net.core.netdev_budget_usecs=8000
sysctl net.core.netdev_max_backlog
mpstat -P ALL 1 3                        # 看软中断是否集中在单一核
cat /proc/softirqs | head -8             # 软中断分类累计计数

softnet_stat 逐列读法

列含义判读
第 1 列处理的包总数处理能力参考
第 2 列因 backlog 溢出丢弃的包增长说明 netdev_max_backlog 不足
第 3 列time_squeeze 次数增长说明软中断预算被耗尽
行号每行对应一个 CPU用于定位热点核
提升预算会增加软中断占用单个 CPU 的时间,可能影响同核上其他任务的延迟,应先排除中断过度集中的问题。
判断是否需要调整的依据是 dropped 与 time_squeeze 是否在增长,而不是参数看起来偏小。

常见的配套优化

  • 中断亲和:把网卡各队列的中断分散到不同的核
  • RPS 与 RFS:在软件层把收包处理分发到更多核
  • 增大 netdev_max_backlog:针对第 2 列代表的溢出现象
  • 核对网卡队列数与可用核数是否匹配,避免队列远多于核数

三个预算参数的分工

  • netdev_budget 限制单轮软中断能处理多少个包
  • netdev_budget_usecs 限制单轮软中断最多消耗多少微秒
  • netdev_max_backlog 决定网卡到协议栈之间的队列能排多长,属于另一个环节

易错点

  • 没有证据就调参:两个关键计数都没涨,调了也看不到收益
  • 只有单核在收包:预算调大也救不了,应先做中断亲和与 RPS
  • 把十六进制当十进制读:softnet_stat 的数值是十六进制,误读会得出相反结论
  • 预算调得过大:软中断长时间占用单个核,同核任务延迟变差
  • 忽略 backlog 与预算的分工:二者分别对应第 2 列与第 3 列的现象

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/net.rst
  • Linux 内核 Documentation/networking/
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌