net.core.dev_weight控制单次NAPI轮询中每个实例最多处理的数据包数量,默认64,万兆网卡等高吞吐场景建议调至128–512,过高易致延迟上升;需配合多队列、RPS及GRO协同优化。

net.core.dev_weight 控制内核在软中断(NET_RX_SOFTIRQ)中轮询单个 NAPI 实例时的最大处理配额,本质是调节每个网卡 RX 队列在一次 poll 调用中最多能处理多少数据包。它不直接“在网卡间分配权重”,而是影响同一网卡多个 RX 队列之间或不同网卡 NAPI 实例之间的轮询公平性与吞吐分配——尤其在多队列、多网卡、高并发收包场景下,合理设置可避免某队列长期饥饿或独占 CPU。
以下是具体操作和关键要点:
理解 dev_weight 的作用机制
- 该值不是“百分比”或“优先级”,而是一个整数配额(budget),用于限制每次
napi_poll()函数最多处理的包数量; - 内核轮询时,会按
poll_list中 NAPI 实例顺序依次调用其poll()函数,每个实例最多处理dev_weight个包; - 若某网卡队列流量极高,其 poll() 很快耗尽配额(如返回
dev_weight),内核可能在本次软中断周期中不再调度其他低流量队列,造成不公平; - 默认值为 64,对千兆网卡够用,但对万兆(如 ixgbe、i40e)、RDMA 或 DPDK 卸载后仍走内核协议栈的高性能网卡,常需提高至 128–512;
- 过高(如设为 2048)可能导致单次轮询时间过长,延迟上升、软中断响应变慢,甚至影响其他软中断(如 NET_TX)。
查看与临时修改 dev_weight
# 查看当前值 sysctl net.core.dev_weight # 临时设为 256(重启失效) sudo sysctl -w net.core.dev_weight=256 # 验证是否生效(需有活跃收包) cat /proc/net/softnet_stat | head -n 2 # 观察第1列(processed)和第3列(dropped)变化趋势
持久化配置
# 写入 sysctl.conf echo "net.core.dev_weight = 256" | sudo tee -a /etc/sysctl.conf # 立即加载 sudo sysctl -p
结合多队列与 RPS/RFS 进行协同调优
仅调 dev_weight 不足以实现“网卡间平衡”,还需配合以下设置:
-
确认网卡启用多 RX 队列:
ethtool -l eth0 # 查看当前 max/rx 值 ethtool -L eth0 rx 8 # 如支持,设为 8 个 RX 队列
-
为每个 RX 队列绑定独立 CPU(RPS):
# 允许 CPU 0–3 处理 rx-0 队列的数据包(十六进制掩码 0xf) echo f | sudo tee /sys/class/net/eth0/queues/rx-0/rps_cpus # 同理设置 rx-1 ~ rx-7,分散到不同 CPU 核心
-
开启 GRO/LRO 提升单次处理效率(减少包数量,间接降低对 high dev_weight 的依赖):
ethtool -K eth0 gro on lro on
推荐值参考(按网卡类型与负载)
- 普通千兆网卡(igb、e1000e),中等并发:64(默认,无需改动)
- 万兆网卡(ixgbe、i40e),HTTP API 服务:128–256
- 高频小包(如金融行情、UDP 日志采集):256–512
- 启用 XDP 或 AF_XDP 卸载后仍走内核路径:可设为 64,因大部分包已被过滤
注意:调整后务必用 sar -n DEV 1、/proc/net/dev 和应用层延迟监控(如 p99 RT)验证效果,避免为追求吞吐而牺牲响应稳定性。


















