1.問題排查
前些日子阿里雲服務器一直報內存占用過高的問題,后來就沒了聲息。我近期工作也比較忙,隨便看了看業務還在正常運行,就沒深入了解。后來服務器也不報警,就沒管了。
后來續費上去看了看了,好家伙怪不得沒報警了。原來雲監控插件都掛掉了。估計是因為內存占用過高,系統自動kill掉了雲監控。在主機里面重新啟動了雲監控,內存直接就100%。
開始排除問題。
SSH登陸服務器,用free -m 再確認一下主機內存。
1核2G內存的機子,內存直接就滿了。這台機器上面部署着Nginx+PHP+Mysql服務,外加一個Dokcer,但是Docker並沒有運行。正常來說內存是綽綽有余的。只能使用top而后Shift+M按內存使用進行排序,再進一步排查。
發現是php-fpm開了太多線程了,直接擠爆了內存所致。
2.着手解決
找到 /etc/php-fpm.d/www.conf
,pm.max_children
默認是50,每一個進程占用1%-2.5%的內存,加起來就耗費大半內存了。所以我們根據需要修改為30。
pm.max_spare_servers
: 該值表示保證空閑進程數最大值,如果空閑進程大於此值,此進行清理 pm.min_spare_servers
: 保證空閑進程數最小值,如果空閑進程小於此值,則創建新的子進程;
這兩個值均不能不能大於 pm.max_children
值,通常設置 pm.max_spare_servers
值為 pm.max_children
值的60%-80%。
最后,重啟php-fpm
systemctl restart php-fpm
問題解決。