调大net.core.netdev_budget可提升单次软中断轮询处理包数,缓解高吞吐下ksoftirqd高占用,但需避免过大导致cpu响应延迟;它与netdev_budget_usecs构成包数/时间双重约束,默认300,万兆场景常调至600–1200,并须协同调优max_backlog和ring buffer。

直接调大 net.core.netdev_budget 可提升单次软中断轮询处理的数据包数量,缓解高吞吐场景下软中断处理不及时、CPU在ksoftirqd上持续高占用的问题。但不能盲目设得过大,否则会延长单次轮询耗时,影响其他软中断或进程调度的实时性。
理解 netdev_budget 的作用机制
该参数定义 NAPI 轮询一次最多处理多少个数据包(即“预算”)。它与 netdev_budget_usecs 共同构成双重约束:轮询在达到包数上限 或 超过时间上限(微秒级)时即停止。默认值通常为 300,适合中低负载;在 10G+ 网卡、百万级 PPS 场景下常需调高。
关键点:
- 值太小 → 轮询频繁触发,软中断开销增加,可能堆积 backlog
- 值太大 → 单次轮询占 CPU 时间过长,延迟敏感型任务响应变差
- 必须配合
net.core.netdev_max_backlog和网卡 Ring Buffer 大小协同调整
推荐配置值与适用场景
没有绝对最优值,需结合网卡型号、CPU 核数、流量特征实测。常见参考如下:
- 万兆网卡 + 8 核以上 + 均匀流:建议设为 600–1200
- 单一大流(如视频推流)+ 高延迟容忍:可尝试 1500–2000,但需监控
/proc/net/softnet_stat第 1 列(drop)是否增长 - 多小流 + 低延迟要求(如金融报文):保持 300–600,优先调优
netdev_budget_usecs(如设为 500–1000 微秒)
正确修改方式(永久生效)
务必使用 /etc/sysctl.d/ 方式,避免被系统覆盖:
- 新建配置文件:
sudo tee /etc/sysctl.d/99-net-budget.conf net.core.netdev_budget = 800<br>EOF
- 加载配置:
sudo sysctl --system - 验证是否生效:
sysctl net.core.netdev_budget或cat /proc/sys/net/core/netdev_budget
临时调试可用 sysctl -w net.core.netdev_budget=1000,但重启后失效。
配套检查与效果验证
单独改 budget 效果有限,需同步关注:
- 确认
net.core.netdev_max_backlog≥ budget(例如设为 5000) - 用
ethtool -g eth0查看并适当增大 Ring Buffer(如ethtool -G eth0 rx 4096 tx 4096) - 观察软中断分布:
watch -n1 'cat /proc/softirqs | grep -E "(NET_RX|NET_TX)"' - 检查丢包:
grep "eth0" /proc/net/dev中rx_dropped是否下降











