php-FPM如果出現(xiàn)存存泄漏問題可能導(dǎo)致服務(wù)器內(nèi)存不足從而導(dǎo)致服務(wù)器資源用盡了,這樣就會(huì)導(dǎo)致網(wǎng)站無法訪問了,下面一起來看一篇避免PHP-FPM內(nèi)存泄漏導(dǎo)致內(nèi)存耗盡的配置。
對(duì)于PHP-FPM多進(jìn)程的模式,想要避免內(nèi)存泄漏問題很簡(jiǎn)單,就是要讓PHP-CGI在處理一定數(shù)量進(jìn)程后退出即可。
否則PHP程序或第三方模塊(如Imagemagick擴(kuò)展)導(dǎo)致的內(nèi)存泄漏問題會(huì)導(dǎo)致內(nèi)存耗盡或不足。
php-fpm.conf中有相關(guān)配置:
請(qǐng)自行按需求配置pm.max_requests = 1024
實(shí)際上還有另一個(gè)跟它有關(guān)聯(lián)的值max_children,這個(gè)是每次php-fpm會(huì)建立多少個(gè)進(jìn)程,這樣實(shí)際上的內(nèi)存消耗是max_children*max_requests*每個(gè)請(qǐng)求使用內(nèi)存。
另外一些粗暴的方法包括建立cron kill掉占用內(nèi)存過多的php-cgi,
- 檢查php進(jìn)程的內(nèi)存占用,殺掉內(nèi)存使用超額的進(jìn)程
一般情況下,如果php-cgi進(jìn)程占用超過1%的內(nèi)存,就得考慮一下是否要?dú)⒌羲恕R驗(yàn)槠胀ㄇ闆r下,php-cgi進(jìn)程一般占用0.2%或以下。
這里提供一個(gè)腳本供各位使用,就是放在cron任務(wù)里,每分鐘執(zhí)行一次。
使用crontab -e 命令,然后添加如下調(diào)度任務(wù)
* * * * * /bin/bash /usr/local/script/kill_php_cgi.sh
kill_php_cgi.sh腳本如下
#!/bin/sh
#如果是要?dú)⒌魀hp-fpm的進(jìn)程,下面的語句中php-cgi請(qǐng)改成php-fpm
pids=`ps -ef|grep php-cgi|grep -v "grep"|grep -v "$0"| awk '{print $2}'`
if [ "$pids" != "" ];then
for pid in $pids;
do
kill -9 $pid
done
fi
```
* 增加內(nèi)存,將PHP_FCGI_MAX_REQUESTS的值設(shè)置成跟你內(nèi)存總存儲(chǔ)量相對(duì)應(yīng)的值
* 優(yōu)化程序,降低處理每次請(qǐng)求占用的內(nèi)存大小
如果PHP-FPM能夠提供配置子進(jìn)程內(nèi)存超過指定大小就被kill,那就省事多了