PHP+FPM導致內存耗光的問題

轉自:http://blog.csdn.net/zouyongjin/article/details/6642157

nginxphp-fpm配置過程中最大問題是內泄漏出問題:服務器的負載不大,但是內存佔用迅速增加,很快吃掉內存接着開始吃交換分區,系統很快掛掉!

google了一天,終於發現些有用的東西,其實根據官方的介紹,php-cgi不存在內存泄漏,每個請求完成後php-cgi會回收內存,但是不會釋放給操作系統,這樣就會導致大量內存被php-cgi佔用。

官方的解決辦法是降低PHP_FCGI_MAX_REQUESTS的值,我用的是php-fpm,對應的php-fpm.conf中的就是max_requests,該值的意思是發送多少個請求後會重啓該線程,我們需要適當降低這個值,用以讓php-fpm自動的釋放內存,不是大部分網上說的51200等等,實際上還有另一個跟它有關聯的值max_children,這個是每次php-fpm會建立多少個進程,這樣實際上的內存消耗是max_children*max_requests*每個請求使用內存,根據這個我們可以預估一下內存的使用情況,就不用再寫腳本去kill了。

下面其實是重啓腳本的過程,並不是什麼很嚴重的事情,但是我們要小心,不是說一直重啓就是好的,因爲重啓會導致cpu的使用率飆升,系統負載巨大,所以還是平衡上面的數據比較重要。

其他解決辦法:

1.檢查php進程的內存佔用,殺掉內存使用超額的進程

一般情況下,如果php-cgi進程佔用超過1%的內存,就得考慮一下是否要殺掉它了。因爲普通情況下,php-cgi進程一般佔用0.2%或以下。

這裏提供一個腳本供各位使用,就是放在cron任務裏,每分鐘執行一次。

使用crontab -e 命令,然後添加如下調度任務

* * * * * /bin/bash /usr/local/script/kill_php_cgi.sh

 kill_php_cgi.sh腳本如下

#!/bin/sh
# This script is used to kill php-cgi process that takes large memory size
# If a php-cgi process uses 1% or more memory, then it will be killed.

PIDS=`ps aux|grep php-cgi|grep -v grep|awk '{if($4>=1)print $2}'`

for PID in $PIDS
do
#echo `date +%F....%T` >> /usr/local/php/logs/phpkill.log
#echo $PID >> /usr/local/php/logs/phpkill.log
kill -9  $PID
done

順便檢查PHP-FPM參數

一般來說,如果設置不當,可能導致fpm出現[WARNING] fpm_children_bury(), line 215: child 20883 (pool default) exited on signal 11 SIGSEGV 之類的錯誤。

可以輸入命令ulimit -n,看看ulimit設置是多少,默認是1024,也許你改成了65535,但都沒關係,你只要保證這個值與php-fpm.conf裏的設置相同就可以了。

<value name="rlimit_files">65535</value>


發佈了20 篇原創文章 · 獲贊 9 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章