天天看點

nginx+php-fmp 記憶體不釋放

由于伺服器隻有600M的記憶體,上面跑了一個并發并不是很大的php應用,當運作一段時間後,發現記憶體不斷增長,其中一部分是PageCache的增長,這個可以通過echo 3 > /proc/sys/vm/drop_caches 指令來進行有效的釋放,另外一個應用記憶體的增長,且無法釋放,通過top命名(輸入命名後按m鍵可按程序占用記憶體大小的排序)檢視,發現大部分記憶體都被 php-fpm 占用,網上查了一下,大概的意思是說,處理每個php請求完成後,php-fpm會回收記憶體,但不會釋放給作業系統,進而導緻大量的記憶體被php-fpm 占用。網上也提到解決方法,就是調整php-fpm.conf中的pm.max_requests值,pm.max_requests的作用是發送多少個請求後會重新開機該線程,進而使其釋放占用的記憶體,預設0,即決不重新開機。在我的應用把該值設定為250,觀察一段時間後,發現還是有好幾個php-fpm占用記憶體的比例是2.8%左右,效果不理想,可能的原因是請求量大,還是無法達到這個閥值,将其設定為10的時候,發現php-fpm是會不斷的重新開機的。個人感覺這樣配置不是太好,所有還是把這個值置為250,同時用一個腳本來進行殺掉php-fpm,進而釋放他占用的記憶體,另外如果系統負載巨大,重新開機會導緻 cpu的使用率飙升。腳本如下:

#!/bin/bash

log=/home/www/scripts/php-fpm.log

echo `date "+%F %H:%M:%S"` >> $log

for PID in `ps aux|grep php-fpm|grep -v grep|awk '{if($4>=1)print $2}'`

do

    kill -9 $PID

    echo $PID >> $log

done

可以把腳本加到crontab中讓其定期執行.

另外記錄幾個長用的指令:

1、按順序列出記憶體占用率的程序     ps -A --sort -rss -o comm,pmem,pcpu |uniq -c |head -15

2、指令vmstat可以監控記憶體使用情況,作為對記憶體監控,我們比較關心swpd、free、si、so。一般系統不繁忙的狀态下,我們看到swpd,so的值不會持續很高,經常為0

3、通過pmap來檢視程序占用記憶體的詳細情況,例如,pmap 程序号

本文參考了:http://blog.csdn.net/zouyongjin/article/details/6642157和http://www.opsers.org/linux-home/server/php-fpm-on-analysis-of-system-resources.html