跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何通过listen_reuseport配合双机热备压榨多核多队列吞吐

reuseport 是提升 Nginx 多核吞吐的基础,需配合合理 worker_processes、调优 somaxconn、关闭 accept_mutex,并在双机热备与多队列网卡(RSS/RPS/XPS)协同下,实现内核级连接分发、消除惊群与锁竞争,最终达成高并发低延迟。 直接在 Nginx 的
listen
指令后加
reuseport
,再结合双机热备与多队列网卡调度,是压榨现代服务器端口吞吐的成熟路径。它不靠堆硬件,而是让内核、网卡、进程三者协同工作——连接进来时就分好流,不排队、不争抢、不跨核。 reuseport 是基础,但不是全部 它让每个 worker 进程拥有独立监听 socket,由内核按五元组哈希分发新连接,彻底规避“惊群”和 accept 锁竞争。但这只是第一步: 若
worker_processes
设为 1,哪怕开了 reuseport,也只有一个进程干活,多核闲置 若
net.core.somaxconn
还是默认的 128,全连接队列很快溢出,客户端看到 connection refused 若没关
accept_mutex on
,Nginx 会在用户态再加一层锁,抵消内核层优化 双机热备必须适配 reuseport 语义 Keepalived + VIP 场景下,reuseport 不是“可选增强”,而是故障切换时维持吞吐的关键: 主备节点都需启用 reuseport,且配置完全一致(包括 IPv4/IPv6 所有 listen 行) 切换瞬间,备机要能立即用多个 worker 并行 accept 新连接,而不是等单个进程从 backlog 里慢慢取 配合
preempt on
和主动
arping -U
,确保 VIP 绑定后,新连接能被多个 socket 同时承接 多队列网卡(RSS/RPS/XPS)是最后一环 光有 reuseport 和多 worker,若网络中断集中在单个 CPU,软中断处理仍会成为瓶颈。需对齐三层绑定: RSS :网卡硬件将不同流哈希到不同 RX 队列,对应不同 CPU(需 BIOS 开启 SR-IOV 或 RSS) RPS :软件层面将单队列软中断分发到多 CPU(
/sys/class/net/ens33/queues/rx-0/rps_cpus
) XPS :发送队列绑定到特定 CPU(避免跨核写缓存),配合
worker_cpu_affinity auto
让每个 worker 独占核心 验证是否真正跑通整条链路 不能只看 Nginx 启动成功,要分层确认:
ss -tlnp | grep :80
—— 显示多个 nginx worker 分别监听
*:80
,PID 各不相同
cat /proc/interrupts | grep ens33
—— RX 中断分散在多个 CPU 上,非集中于 CPU0
perf top -p $(pgrep nginx)
——
sys_accept4
、
inet_csk_accept
调用大幅下降,无明显锁函数热点 Keepalived 切换后 1 秒内,
top -H
观察各 worker CPU 使用率快速均衡上升,而非单核飙高 不复杂但容易忽略

相关文章