限制php-cgi进程数量,php-fcgi进程数超过预设值问题的解决
現象:
某日和開發的同事調試服務器php狀態時候發現下面這種情況:
ps aux |grep php-fcgi |wc -l
602
表面上看是沒什么問題,可是我明明記得 php-fcgi我只開了300個啊!難道有人改過了?
立刻查看 php-fpm.conf 找到這一項
300
確實是300個啊~~,怎么會有600個?
ps aux |grep php-fcgi |more
www????? 11707? 0.0? 0.7 250192? 3888 ???????? S??? 17:07
www????? 11708? 0.0? 0.7 250192? 3888 ???????? S??? 17:07
www????? 11709? 0.0? 0.7 250192? 3888 ???????? S??? 17:07
www????? 11710? 0.0? 0.7 250192? 3888 ???????? S??? 17:07
www????? 11711? 0.0? 0.7 250192? 3888 ???????? S??? 17:07
狀態都正常啊,奇怪了。嘗試把 php-fcgi重啟一下
/usr/local/php-fcgi/sbin/php-fpm restart
Shutting down php_fpm . done
Starting php_fpm? done
再次查看
ps aux |grep php-fcgi |wc -l
602
還是多了300個.....奇怪了,這三百個是怎么來的呢?
因為我們的php和nginx是一起的,所以我又想到了nginx。
在訪問量不高的時候偷偷重啟了一下nginx
/etc/init.d/nginx restart
停止 nginx:?????????????????????????????????????????????? [確定]
Shutting down php_fpm? done
啟動 nginx:?????????????????????????????????????????????? [確定]
Starting php_fpm? done
再次查看,我倒.....真服了。我和開發的同事都一頭霧水
ps aux |grep php-fcgi |wc -l
602
這回不能簡單的考慮重啟服務了,需要想想到底是哪里出的問題,而且這是生產服務器不能隨便弄。
因為現在線上的服務都還算正常,這個問題我們就先放下了。
第二天,那個同事跟我說。那個問題他知道怎么解決了,而且也知道是什么原因造成的。我趕緊問清楚:
原來是這樣,最近因為測試比較頻繁,對nginx服務重啟次數較多。不知道哪次重啟時候失敗導致 nginx進程雖然停止了,
但是一起的300個php-fcgi卻沒有重啟,導致這些進程還留在內存里不能被釋放。需要強制手動殺掉所有的php-fcgi進程后再重啟php-fpm就可以了。
聽到這里我恍然大悟。馬上去服務器上操作,果然問題解決了,具體步驟如下
pkill php-cgi
再次查看
ps aux |grep php-fcgi |wc -l
1
好了沒有了,趕緊重啟,因為現在訪問網頁已經是 502了。
/usr/local/php-fcgi/sbin/php-fpm restart
Shutting down php_fpm warning, no pid file found - php-fpm is not running ?
Starting php_fpm? done
再次查看進程數
ps aux |grep php-cgi |wc -l
302
好了,正常了,呵呵
后來我在試驗機上面又測試了一下,果然重現了那個問題
[root@ime /]# /etc/init.d/nginx restart
停止 nginx:?????????????????????????????????????????????? [確定]
Shutting down php_fpm? done
啟動 nginx:?????????????????????????????????????????????? [確定]
Starting php_fpm? done
[root@ime /]# ps aux |grep php-cgi|wc -l
302
這時進程數是正常的,下面殺掉nginx進程
[root@ime /]# pkill nginx
[root@ime /]# lsof -i:80
[root@ime /]# ps aux |grep php-cgi|wc -l
302
這300個進程就傻乎乎的留在這里了,再次啟動nginx
[root@ime /]# /etc/init.d/nginx start
啟動 nginx:?????????????????????????????????????????????? [確定]
Starting php_fpm? done
[root@ime /]# lsof -i:80
COMMAND?? PID USER?? FD?? TYPE DEVICE SIZE NODE NAME
nginx?? 14072 root??? 8u? IPv4? 64090?????? TCP *:http (LISTEN)
nginx?? 14073? www??? 8u? IPv4? 64090?????? TCP *:http (LISTEN)
[root@ime /]# ps aux |grep php-cgi|wc -l
603
php-fcgi沒有去理會在內存中存在的進程,繼續開啟了300個...
我如果再重復這個過程呢?
[root@ime /]# pkill nginx
[root@ime /]# lsof -i:80
[root@ime /]# /etc/init.d/nginx start
啟動 nginx:?????????????????????????????????????????????? [確定]
Starting php_fpm? done
[root@ime /]# pkill nginx
[root@ime /]# lsof -i:80
[root@ime /]# ps aux |grep php-cgi|wc -l
904
900個... 繼續重復
[root@ime /]# /etc/init.d/nginx start
啟動 nginx:?????????????????????????????????????????????? [確定]
Starting php_fpm? done
[root@ime /]# ps aux |grep php-cgi|wc -l
954
[root@ime /]# ps aux |grep php-cgi|wc -l
1205
機器開始變慢了,估計再重復幾次機器就會掛掉了...
[root@ime /]# pkill php-cgi
[root@ime /]# ps aux |grep php-cgi|wc -l
5
[root@ime /]# ps aux |grep php-cgi|wc -l
5
[root@ime /]# ps aux |grep php-cgi|wc -l
1
[root@ime /]# /etc/init.d/nginx restart
停止 nginx:?????????????????????????????????????????????? [確定]
Shutting down php_fpm warning, no pid file found - php-fpm is not running ?
啟動 nginx:?????????????????????????????????????????????? [確定]
Starting php_fpm? done
[root@ime /]# ps aux |grep php-cgi|wc -l
302
好了,恢復正常....
看來需要修改一下 php-fpm的啟動腳本了
總結
以上是生活随笔為你收集整理的限制php-cgi进程数量,php-fcgi进程数超过预设值问题的解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python怎么用数据修改,如何更改数据
- 下一篇: docker php伪静态无效,dock