什么是软中断收包预算
内核通过软中断处理网卡收包,每轮处理受两个预算约束: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 能把收包中断先分散到多个核,再考虑提高预算;如果本来就是单核收包饱和,只加预算收效有限,先解决分发问题。