• nginx 子进程 woker process 启动失败的问题


    问题

    重启nginx服务,worker process 子进程启动失败,启动的都是master进程:

     

    负载急速升高(平常都是4-5),占用CPU资源多的前十进程都是nginx :

     

    nginx 错误日志里频繁记录:

    2016/07/15 11:54:19 [alert] 2930#0: worker process 2940 exited on signal 9
    2016/07/15 11:54:19 [alert] 2930#0: worker process 2947 exited on signal 9
    2016/07/15 11:54:19 [alert] 2930#0: worker process 2948 exited on signal 9
    2016/07/15 11:54:19 [alert] 2930#0: worker process 2951 exited on signal 9
    2016/07/15 11:54:19 [alert] 2930#0: worker process 2952 exited on signal 9

    查看dmesg 信息:

    # dmesg |grep nginx
    Out of memory: Kill process 43796 (nginx) score 480 or sacrifice child

    系统内存被耗尽,导致nginx进程频繁被 kill 掉。

    分析

    没重启nginx前,服务一切正常。回想昨天对nginx的配置做了优化,而没有重启nginx测试。

     

    优化的根据如下:

    网上的nginx配置优化的文章,大多建议woker_rlimit_nofile 、woker_connections、ulimit -n 的值保持一致。

     

    出现问题的nginx配置如下:

    worker_processes 32;
    worker_rlimit_nofile 1024000;
    
    events {
      worker_connections  1024000;
    }

    其实,这些参数的设置有个前提:

    并发总数:max_clients = worker_processes * worker_connections 
    nginx做反向代理的情况下,max_clients = (worker_processes * worker_connections)/ 4 # 一般都除以4, 经验所得。

    因并发受IO的约束,worker_connections 值的设置跟物理内存大小有关,max_clients 的值必须小于操作系统理论情况下可以打开的最大文件数

    而操作系统可以打开的最大文件数和内存大小成正比,查看32G内存的机器上,理论情况下,可以打开的最大文件数:
    #cat /proc/sys/fs/file-max
    3262366

    当max_clients < `cat /proc/sys/fs/file-max` 的值时,这样在操作系统可以承受的范围内。

    worker_connections 的值需根据 worker_processes 进程数和系统可以打开的最大文件总数 适当地进行设置,也就是要根据系统的CPU和内存进行配置。

    当然,实际的并发总数还会受 `ulimit -n` 值的限制。

     

    根据上述的nginx配置:

    max_clients = 32 * 1024000 = 32768000 远远大于 3262366 ,因此系统的CPU、内存资源才会被nginx进程耗尽。

     

    解决

    修改nginx配置:

    worker_processes 32;
    worker_rlimit_nofile 51200;
    
    events {
      worker_connections  51200;
    }

    重启nginx服务,woker process 正常生成,服务器负载下降到4-5 。

     

  • 相关阅读:
    MySQL练习
    [转]mysql和redis的区别
    python框架面试题联系
    国内外免费接收短信验证码
    ubuntu环境下docker的安装与操作
    Django商城项目笔记No.18商品部分-数据表创建
    Django商城项目笔记No.17用户部分-用户中心用户地址管理
    Django商城项目笔记No.16用户部分-用户中心收货地址
    Django商城项目笔记No.15用户部分-用户中心邮箱验证
    Django商城项目笔记No.14用户部分-用户中心邮箱绑定
  • 原文地址:https://www.cnblogs.com/hjqjk/p/5673484.html
Copyright © 2020-2023  润新知