Nginx高性能调优核心是将每个worker进程稳定绑定至独立物理CPU核,需协同配置CPU亲和性(worker_processes auto; worker_cpu_affinity auto;)、资源限制(worker_rlimit_nofile、sysctl及limits.conf)与I/O优化(sendfile、epoll、tcp_nopush/nodelay),并验证ps、taskset、vmstat结果。

核心是让每个 Nginx worker 进程稳定运行在固定物理 CPU 核上,避免跨核迁移带来的缓存失效、TLB 刷新和频繁上下文切换。这不是调几个参数的事,而是从进程绑定、资源供给、I/O 路径三方面协同控制。
CPU 亲和性必须设为 auto
手动写二进制掩码(如 0001 0010)容易出错,且无法适配超线程或 NUMA 架构。Nginx 1.9.10+ 支持:
-
worker_processes auto;—— 自动识别物理核心数,不把超线程逻辑核当真实核心用 -
worker_cpu_affinity auto;—— 自动将每个 worker 绑定到独立物理核,跳过错误绑定风险 - 禁用
worker_priority或外部sched_setaffinity脚本,避免干扰 Nginx 自身调度
确保 worker 有足够资源持续运行
光绑定没用,一旦因资源不足被抢占或阻塞,亲和性就失效了:
-
worker_rlimit_nofile 65535;—— 显式声明单进程文件描述符上限 - 同步修改
/etc/security/limits.conf:对 nginx 用户设soft nofile 65535和hard nofile 65535 - 调大内核级限制:
fs.file-max = 2097152(写入/etc/sysctl.conf) - 启用
use epoll;和multi_accept on;,提升事件处理效率,减少无效唤醒
静态文件服务要走零拷贝路径
传统 read()+write() 模式会触发 4 次上下文切换;而静态文件完全可绕过用户空间:
-
sendfile on;—— 内核态直接搬运数据,仅需 2 次上下文切换 -
tcp_nopush on;—— 配合 sendfile,攒满 TCP 包再发,减少小包数量 -
tcp_nodelay on;—— 防止 keepalive 场景下最后不满包的数据被延迟发送 - 关闭未使用的模块(如 Lua、Perl),减小内存 footprint,提升缓存命中率
验证是否真正生效
不能只看配置重载成功,要查实际运行状态:
-
ps -eo pid,args,psr | grep 'nginx: worker'—— 每个 worker 的 PSR 列应显示不同且稳定的 CPU 编号(如 0、1、2、3) -
taskset -cp $(pgrep -f "nginx: worker" | head -1)—— 输出类似pid 12345's current affinity list: 0表示已绑定 -
vmstat 1观察cs列 —— 优化后每秒上下文切换应明显下降,理想低于 10 万次


















