Nginx异常占用100%CPU
Nginx出现CPU 100%占用问题通常由多种原因引起,可分为正常业务负载和异常故障两类,以下是详细分析和解决方案:
一、问题诊断步骤
-
定位高负载进程
- 使用
top -p $(pgrep nginx)
区分主进程(master)或工作进程(worker)占用高 - 通过
perf top -p <PID>
分析CPU时间分布,判断是用户态(如正则计算)还是内核态(如I/O等待)问题
- 使用
-
检查连接状态
netstat -anp | grep nginx | wc -l
查看当前连接数是否超限- 监控
nginx_status
接口(需配置)获取实时请求处理情况
-
日志分析
- 重点检查错误日志
/var/log/nginx/error.log
中的循环等待、SSL握手失败等记录 - 使用
ngxtop
工具分析访问日志中的异常请求模式
- 重点检查错误日志
二、常见原因与解决方案
1. 配置不当
- 工作进程绑定问题
未设置worker_cpu_affinity
可能导致多核CPU负载不均,建议配置为auto
实现自动绑核 - 无效任务堆积
如复杂正则匹配、未启用缓存的重复请求,需优化配置并启用open_file_cache
2. 资源瓶颈
- 端口耗尽循环
TCP连接耗尽随机端口时,Nginx会进入无效循环,需调整net.ipv4.ip_local_port_range
扩大端口范围 - 内存不足触发交换
内存不足时频繁使用swap会拖累CPU,需增加内存或限制worker_connections
3. 特定场景故障
- 异步SSL模式缺陷
某些版本异步SSL处理会陷入EPOLL循环,需升级到v0.5.2+或禁用ssl_asynch
6 - Windows线程句柄泄漏
Windows版Nginx线程创建失败时可能未清理句柄,需应用官方补丁