worker_processes 应按单numa节点物理核数设置(如双网卡双节点则各设一半),配合rps/rfs将网卡rx队列绑定对应cpu、worker_cpu_affinity固定worker到同核,实现软中断与worker处理路径对齐,避免跨核开销。

Nginx 本身不直接管理网卡软中断,worker_processes 也不是用来“绑定网卡”的指令。但你可以通过合理配置 worker_processes,并协同系统层多网卡、RPS/RFS、CPU 亲和性等机制,让 Nginx worker 进程与网卡软中断在逻辑上对齐,从而实现流量处理路径最短、跨核开销最小——这才是真正意义上的“网卡软中断均衡”。
明确物理拓扑,按网卡分组规划 worker 数量
多网卡场景下,不能简单设 worker_processes auto(它只看总 CPU 数)。你需要:
- 用
lscpu和ls /sys/class/net/确认网卡数量、每张网卡的 NUMA 节点归属(如eth0在 node 0,eth1在 node 1) - 若双网卡且分别连不同交换机(如南北向/东西向),建议按 NUMA 节点隔离部署:
- node 0 上启动一半 worker(如 8 核就启 4 个),专收
eth0流量 - node 1 上启动另一半,专收
eth1流量
- node 0 上启动一半 worker(如 8 核就启 4 个),专收
- 对应地,
worker_processes应设为单节点物理核数(不是总数),避免跨 NUMA 访存
让网卡队列与 CPU 核严格匹配,再让 worker 绑定同一核
软中断(NET_RX)必须和 worker 运行在同一个物理核上,否则数据要跨核搬运:
- 对每张网卡启用多队列:
ethtool -L eth0 combined 4 # 假设 eth0 有 4 队列能力 ethtool -L eth1 combined 4 # 同理配置 eth1
- 为每个 RX 队列绑定 CPU 掩码(以 4 队列为例,用前 4 个物理核):
echo 0f > /sys/class/net/eth0/queues/rx-0/rps_cpus # 0f = 00001111,对应 CPU 0–3 echo 0f > /sys/class/net/eth0/queues/rx-1/rps_cpus echo 0f > /sys/class/net/eth0/queues/rx-2/rps_cpus echo 0f > /sys/class/net/eth0/queues/rx-3/rps_cpus # eth1 同理,但绑定到另一组核(如 CPU 4–7),并确保它们同属 node 1
- Nginx 配置中:
worker_processes 4; # 匹配 eth0 所用的 4 核 worker_cpu_affinity 0001 0010 0100 1000; # 每个 worker 各占 CPU 0/1/2/3 events { use epoll; multi_accept on; accept_mutex off; }
多网卡流量分流需靠内核或前置设备,Nginx 不参与决策
Nginx 的 worker_processes 不决定“哪个网卡进来的包由哪个 worker 处理”——这是网卡驱动、RPS、RFS 或硬件负载均衡器的事。你只需确保:
- 每张网卡的 RX 队列只往指定 CPU 发送软中断
- Nginx worker 进程固定运行在这些 CPU 上
- (可选)启用
reuseport on,让内核在 socket 层就按四元组哈希分发连接,进一步降低 accept 竞争
验证是否真正对齐
重启 Nginx 后交叉检查:
-
watch -n 1 'cat /proc/softirqs | grep NET_RX'→ 看 CPU 0–3 的计数是否增长,CPU 4–7 是否几乎为 0(eth0 流量) -
ps -eo pid,args,psr | grep 'nginx: worker'→ 确认各 worker 的psr列是 0/1/2/3 -
numastat -p $(pgrep nginx)→ local_node 应接近 100%,foreign 接近 0
这样配置后,从网卡进来的包,经软中断处理、进入 socket 队列、被 worker accept,全程都在同一物理核完成,缓存友好,延迟稳定。











