关键在于让每个数据包从进入网卡起就落到最适合的CPU核上处理,需确认硬件多队列支持(ethtool -l)、合理设置队列数与Ring Buffer、绑定中断亲和性、并视情况启用RPS/RFS补位。

要让 Linux 网络入口真正扛得住高并发、低延迟,关键不是堆 CPU 或换万兆卡,而是把网卡多队列机制用对、调准、配齐。核心逻辑就一条:让每个数据包从进来的那一刻起,就走最短路径落到最适合的 CPU 核上处理,避免中断争抢、缓存失效和跨 NUMA 访问。
确认硬件能力,再决定是否启用多队列
多队列不是“开了就有用”,它依赖真实硬件支持。先看网卡到底能不能分——
- 运行 ethtool -l eth0,重点看 Combined 行:如果 Current 值大于 1,说明网卡已启用多队列;Max 支持值告诉你上限
- 检查 cat /proc/interrupts | grep eth0:若看到多个 irq(如 eth0-TxRx-0、eth0-TxRx-1…),且中断数与队列数一致,说明硬件 RSS 已生效
- 注意 CPU 与队列匹配:系统通常不会允许队列数超过逻辑 CPU 数。比如有 24 个逻辑核,即使网卡最大支持 64 队列,ethtool -L eth0 combined 32 可能被静默截断为 24
合理设置队列数量与 Ring Buffer
队列不是越多越好,Buffer 也不是越大越稳,得平衡吞吐、延迟和内存开销——
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 接收队列(RX)建议设为逻辑 CPU 核数的 70%~100%,例如 24 核服务器可设 ethtool -L eth0 combined 20
- RX Ring Buffer 推荐调至 2048–4096(万兆环境常用 4096):ethtool -G eth0 rx 4096;过小易丢包,过大增加延迟且浪费内存
- TX Ring Buffer 一般设为 RX 的 50%~80%,如 ethtool -G eth0 tx 2048,避免发送侧阻塞影响整体吞吐
绑定中断到 CPU,避免负载倾斜
光有多队列还不够,得让每个队列的中断固定落在对应 CPU 上,否则还是争抢——
- 启用 irqbalance 服务,并配置为 NUMA 感知模式:IRQBALANCE_ARGS="--numa"(CentOS)或启用 systemd-irqbalance(Ubuntu 22.04+)
- 手动绑定更可控:查 cat /proc/interrupts | grep eth0 找出各队列 irq 编号,再用 echo $mask > /proc/irq/$irq/smp_affinity_list 绑定到指定 CPU 列表(如 0,2,4,6…)
- 验证是否均匀:持续压测时运行 watch -n1 'grep eth0 /proc/interrupts',观察各 irq 计数是否同步增长
软件补位:RPS/RFS 在无硬件多队列时兜底
老旧单队列网卡或某些虚拟化场景(如 KVM vhost-net),RSS 失效,这时靠内核软件层补足——
- 启用 RPS:写入 CPU 掩码到 /sys/class/net/eth0/queues/rx-0/rps_cpus(例如 echo fff > rps_cpus 表示前 12 个 CPU 可处理该队列软中断)
- 配套开启 RFS:增大 /proc/sys/net/core/rps_flow_cnt(如 32768),并设 /proc/sys/net/core/rps_sock_flow_entries 匹配连接数规模
- 注意 RFS 依赖 RPS,且只对 TCP 流有效;UDP 场景建议优先调大 net.core.rmem_max 和关闭 GRO


















