Nginx异常占用100%CPU

Nginx出现CPU 100%占用问题通常由多种原因引起,可分为正常业务负载和异常故障两类,以下是详细分析和解决方案:

一、问题诊断步骤

  1. ‌定位高负载进程‌

    • 使用top -p $(pgrep nginx)区分主进程(master)或工作进程(worker)占用高
    • 通过perf top -p <PID>分析CPU时间分布,判断是用户态(如正则计算)还是内核态(如I/O等待)问题
  2. ‌检查连接状态‌

    • netstat -anp | grep nginx | wc -l查看当前连接数是否超限
    • 监控nginx_status接口(需配置)获取实时请求处理情况
  3. ‌日志分析‌

    • 重点检查错误日志/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_asynch6
  • ‌Windows线程句柄泄漏‌
    Windows版Nginx线程创建失败时可能未清理句柄,需应用官方补丁