Nginx HTTPS CPU争抢本质是worker进程无约束竞争TLS资源,解决关键是worker与CPU核心一对一绑定并降低单核加密负载。需先用ps、top、perf确认争抢,再配置worker_cpu_affinity、启用TLSv1.3、优化会话复用及系统参数。

Nginx 中 HTTPS 配置项引发的 CPU 争抢,本质是多个 worker 进程在无约束调度下竞争 TLS 握手与加解密资源,导致缓存失效、TLB miss 和跨核迁移开销激增。解决重点不是减少计算,而是让每个 worker 独占核心、固化上下文、避免干扰。
确认是否真为 HTTPS 引起的 CPU 争抢
先排除误判:
- 运行
ps -eo pid,psr,comm | grep 'nginx: worker' | sort -k2,2n,观察各 worker 是否分散绑定到不同 CPU 号;若多个 PID 显示同一 PSR,说明存在争抢 -
top -H -p $(pgrep nginx | head -1)查看线程级 CPU 分布,若某核上多个 nginx 线程同时飙高(>80%),即为典型争抢 -
perf top -p $(pgrep nginx | head -1) -g中若ssl3_read_bytes、EVP_EncryptFinal_ex或ecdsa_sign_setup占比异常高,可锁定 HTTPS 计算热点
强制 worker 与 CPU 核心一对一绑定
这是最直接有效的缓解手段:
- 在
nginx.conf的全局块中配置:worker_processes auto; worker_cpu_affinity auto;
- 验证生效:重启后再次运行
ps -eo pid,psr,comm | grep 'nginx: worker',输出应为类似:12345 0 nginx: worker 12346 1 nginx: worker 12347 2 nginx: worker 12348 3 nginx: worker
- 若
auto失效(常见于容器或 cgroup 限制环境),改用手动掩码,例如 4 核服务器写为:worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;
降低单个 worker 的 TLS 计算密度
绑定只是治标,还需减轻每个核上的加密压力:
- 启用 TLSv1.3(需 OpenSSL 1.1.1+):
ssl_protocols TLSv1.2 TLSv1.3;,握手开销可降 30%~50% - 禁用 RSA 密钥交换,只保留 ECDHE 套件:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305; ssl_prefer_server_ciphers off;
- 开启双会话复用机制:
ssl_session_cache shared:SSL:20m; ssl_session_timeout 4h; ssl_session_tickets on; ssl_session_ticket_key /etc/nginx/ssl/ticket.key;
协同调优系统与连接层参数
CPU 绑定效果依赖底层支撑:
- 提升文件描述符上限:
ulimit -n 65536,并在/etc/security/limits.conf中固化 - 调整内核网络参数:
echo 'net.core.somaxconn = 65535' >> /etc/sysctl.conf echo 'vm.swappiness = 1' >> /etc/sysctl.conf sysctl -p
- 在
events块中启用高效模型并防惊群:events { use epoll; multi_accept on; worker_connections 10240; }
不复杂但容易忽略


















