网络软中断预算
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 决定网卡到协议栈之间的队列能排多长,属于另一个环节