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

net.core.netdev_budget_usecs 软中断时间预算

softirq 每轮处理收包的时间预算(微秒), 与按包数限制的 netdev_budget 配套; 突发场景 underrun 时评估提高。

什么是软中断收包预算

内核通过软中断处理网卡收包,每轮处理受两个预算约束:net.core.netdev_budget 限制单轮最多处理多少个报文,net.core.netdev_budget_usecs 限制单轮最多花多少微秒。任一预算用尽,本轮就结束,剩余报文留给下一次软中断调度,这种现象在 /proc/net/softnet_stat 的 time_squeeze 计数里体现。突发大流量或高核数机器上,预算偏小会造成处理不及与丢包。

基本信息

参数路径net.core.netdev_budget_usecs(微秒)
配套参数net.core.netdev_budget(按包数限制)
默认值netdev_budget 常为 300,budget_usecs 常为 2000(以本机为准)
观测/proc/net/softnet_stat 第 3 列(time_squeeze)
相关机制NAPI 轮询、RPS/RFS 多队列分发
生效范围内核全局

典型使用场景

  • 高 PPS 小包场景丢包排查:确认是否频繁触发 squeeze
  • 虚拟化宿主:多个虚拟网卡共享软中断处理能力时的调优
  • 新硬件上线:多队列网卡与更高带宽下的预算复核
  • 与 RPS/多队列配置一起核对,避免单核成为瓶颈
  • 压测前建立基线,明确调参前后的 squeeze 增量变化

查看与核对

查看与核对
sysctl net.core.netdev_budget net.core.netdev_budget_usecs
cat /proc/net/softnet_stat | head -3    # 第 3 列是 time_squeeze 计数
awk '{print NR-1, $1, $2, $3}' /proc/net/softnet_stat | head   # CPU 0..N 的收包与 squeeze
cat /proc/net/dev | head                # 各网卡累计收包
ethtool -l eth0 | head -10              # 队列数,与软中断分布相关
dmesg -T | tail -20 | grep -i -E 'drop|squeeze'

softnet_stat 判读

列含义异常信号
第 1 列该 CPU 处理的报文数分布不均说明中断集中在少数核
第 2 列因队列满而丢弃增长说明处理能力不足
第 3 列time_squeeze 次数快速增长说明预算经常用尽
第 4 列CPU 冲突导致的丢弃通常与热锁或竞争相关
先查询本机默认值再评估:不同发行版与内核版本给出的默认预算差异较大,盲目套用别处的数值往往没有效果。
提高预算意味着单次软中断占核时间变长,可能推迟同核上其他任务(包括网络之外的工作)的执行,需要结合 ss/软中断占比一起评估。
多队列网卡与 RPS/RFS 能把收包中断先分散到多个核,再考虑提高预算;如果本来就是单核收包饱和,只加预算收效有限,先解决分发问题。

易错点

  • 只改微秒预算不改包数预算,两者不匹配会让限制仍然生效在另一个维度上
  • 在未出现 squeeze 的场景盲目提高预算,除了增加单核占用时间没有收益
  • 只看 sysctl 不看 /proc/net/softnet_stat,无法判断预算是否真的是瓶颈
  • 把高 PPS 丢包归因到网卡硬件:先用 softnet_stat 与 ss -s 区分是软中断处理不及还是驱动/链路问题

数据来源与参考

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