1. 程式人生 > >解決PHP-FPM程序數導致的伺服器記憶體耗盡

解決PHP-FPM程序數導致的伺服器記憶體耗盡

問題

最近部落格伺服器經常記憶體偏高,甚至記憶體佔滿,導致長時間持續報警,先檢視下監控資料
記憶體佔滿
最簡單粗暴也是馬上見效的方法是重啟服務,乾脆重啟伺服器,這個對於某些臨時程序導致的記憶體虛高可能有效,這裡顯然是不行,不要問我怎麼知道的。。。因為已經試過一次了,囧!趁著週末下午抽點時間解決下這個問題。

解決

檢視伺服器記憶體及程序狀況

14031 www       20   0  558712  42888  23616 S   0.0  1.1   0:05.37 php-fpm
14036 www       20   0  547752  41536  20504 S   0.0  1.1   0:04.36
php-fpm 14030 www 20 0 548040 40772 19436 S 0.0 1.1 0:04.29 php-fpm 14193 www 20 0 546488 38768 19024 S 0.0 1.0 0:01.80 php-fpm 14188 www 20 0 557020 36404 16932 S 0.0 0.9 0:01.91 php-fpm ...

php-fpm程序多達幾十個,導致佔用大量記憶體,考慮設定php-fpm程序相關引數:
配置檔案地址/usr/local/php/etc/php-fpm.conf
檢視原始pm程序相關配置:

pm = dynamic    # 靜態static,動態dynamic,按需ondemand
pm.max_children = 50    #靜態方式下開啟的php-fpm程序數量
pm.start_servers = 30   #動態方式下的起始php-fpm程序數量
pm.min_spare_servers = 20   #動態方式下的最小php-fpm程序數量
pm.max_spare_servers = 50   #動態方式下的最大php-fpm程序數量
pm.max_requests = 2048  #超過這個請求數量重生子程序
pm.process_idle_timeout = 10
s #按需方式下多長時間殺掉php-fpm子程序,直到master程序

修改後的配置:

pm = dynamic
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 10
pm.max_requests = 1024

剛開始檢視單個php-fpm程序佔用記憶體為80M多,重啟php-fpm後單個程序佔用記憶體42M左右,為何會相差如此之多確實有點納悶。。。

pm模式

pm的模式有三種:靜態static、動態dynamic、按需ondemand

static: 靜態模式,顧名思義,一旦設定好,不能更改,相關引數:pm.max_children
dynamic: 動態模式,相關引數:啟動程序數pm.start_servers,啟動後進程數在pm.min_spare_serverspm.max_spare_servers之間,超過pm.max_requests請求數重新生成子程序
ondemand:按需模式,相關引數:閒置程序持續pm.process_idle_timeout設定數後殺掉程序,直到master程序

總結:
static:適合流量相對穩定的場景
dynamic:適合流量浮動大的場景
ondemand:適合流量浮動大的場景,而且流量變化比較規律,否則由於pm.process_idle_timeout設定不準效果適得其反,過大會浪費資源,過小會導致頻繁殺死程序