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 。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM