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 。

 

posted @ 2016-07-15 14:36  hjqjk  阅读(11869)  评论(0编辑  收藏  举报