reuseport 通过让每个 worker 拥有独立 listen socket 并由内核哈希分发连接,彻底消除 accept 争抢与惊群;须内核≥3.9、nginx≥1.9.1、所有同端口 listen 行统一启用、配合 accept_mutex off 及 backlog 等调优。

listen ... reuseport 并不开启“内核级互斥”,恰恰相反——它是绕过互斥、取消争抢的设计。它的核心价值在于:让每个 worker 进程拥有独立监听 socket,由内核直接分发连接,从而彻底消除 accept 争抢和惊群唤醒。所谓“极致均衡”,是内核哈希分发的结果,不是靠锁或互斥实现的。
下面从实操角度讲清楚关键点:
必须满足的基础条件
- Linux 内核 ≥ 3.9(生产环境建议 4.19+ 或更新 LTS 版本)
- Nginx ≥ 1.9.1(OpenResty 推荐 ≥ 1.15.8.2),且编译时未禁用
reuseport支持 -
worker_processes设为auto或明确匹配 CPU 物理核心数 - 同一 IP:Port 组合的所有
listen行必须统一启用reuseport,例如:listen 80 reuseport; listen [::]:80 reuseport; listen 443 ssl reuseport; listen [::]:443 ssl reuseport;
混用(如一个开、一个关)会导致 Nginx 启动失败。
配置写法与常见误区
-
reuseport是listen的修饰符,不接受值,不能写成reuseport on或reuseport=on - 它作用于端口绑定层,与虚拟主机(
server_name)、SSL 配置、HTTP/2 等完全正交,可自由组合 - 若监听多个具体 IP(如
192.168.1.10:80和192.168.1.20:80),每条listen都需单独加reuseport
配套调优才能释放真实性能
仅加 reuseport 不够,还需同步调整:
- 关闭应用层锁:
accept_mutex off(Nginx 默认已是off,无需显式写,但确认不要设为on) - 提升连接队列容量:
listen 80 reuseport backlog=65535;
并配内核参数:
sysctl -w net.core.somaxconn=65535 sysctl -w net.ipv4.tcp_max_syn_backlog=65535
- 绑定 CPU 核心:
worker_cpu_affinity auto; - 提高文件描述符上限:
worker_rlimit_nofile 1048576;
如何验证真正生效
- 执行
ss -tlnp | grep :80,应看到多行输出,每行对应不同 PID(即每个 worker 独立监听) -
ps aux | grep nginx中 worker 进程数应与worker_processes一致 - 压测时用
top -H -p $(pgrep nginx)观察,各 worker 线程应在不同 CPU 核上活跃运行,CPU 利用率相对均衡 -
perf top中sys_accept、accept4及相关锁函数调用频次应显著下降
不复杂但容易忽略











