php-fcgi進程數超過預設值問題的解決

現象:
某日和開發的同事調試服務器php狀態時候發現下面這種情況:
ps aux |grep php-fcgi |wc -l
602
表面上看是沒什麼問題,可是我明明記得 php-fcgi我只開了300個啊!難道有人改過了?
立刻查看 php-fpm.conf 找到這一項
<value name="max_children">300</value>
確實是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的啓動腳本了

本文出自 “story的天空” 博客,請務必保留此出處http://storysky.blog.51cto.com/628458/282939

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章