您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“如何解決Linux下php-fpm進程過多導致內存耗盡問題”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“如何解決Linux下php-fpm進程過多導致內存耗盡問題”這篇文章吧。
最近,發現個人博客的Linux服務器,數據庫服務經常掛掉,導致需要重啟,才能正常訪問,極其惡心,于是決心開始解決問題,解放我的時間和精力(我可不想經常出問題,然后人工重啟,費力費時)。
分析問題
發現問題以后,首先使用 free -m
指令查看當前服務器執行狀況:
可以看到我的服務器內存是2G的,但是目前可用內存只剩下70M,內存使用率高達92%,很有可能是內存使用率過高導致數據庫服務掛斷。
繼續看詳細情況,使用 top
指令:
然后再看指令輸出結果中詳細列出的進程情況,重點關注第10列內存使用占比:
發現CPU使用率不算高,也排除了CPU的問題,另外可以看到數據庫服務占用15.2%的內存,內存使用過高時將會擠掉數據庫進程(占用內存最高的進程),導致服務掛斷,所以我們需要查看詳細內存使用情況,是哪些進程耗費了這么多的內存呢?
使用指令:
ps auxw|head -1;ps auxw|sort -rn -k4|head -40
查看消耗內存最多的前40個進程:
查看第四列內存使用占比,發現除了mysql數據庫服務之外,php-fpm服務池開啟了太多子進程,占用超過大半內存,問題找到了,我們開始解決問題:設置控制php-fpm進程池進程數量。
解決問題
通過各種搜索手段,發現可以通過配置 pm.max_children
屬性,控制php-fpm子進程數量,首先,打開php-fpm配置文件,執行指令:
vi /etc/php-fpm.d/www.conf
找到 pm.max_children
字段,發現其值過大:
如圖, pm.max_children
值為50,每一個進程占用1%-2.5%的內存,加起來就耗費大半內存了,所以我們需要將其值調小,博主這里將其設置為25,同時,檢查以下兩個屬性:
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
再次查看內存使用情況, 使用內存降低很多:
之后經過多次觀察內存使用情況,發現此次改進后,服務器內存資源消耗得到很大緩解。
ps:查看php-fpm開啟的進程數以及每個進程的內存限制
1.通過命令查看服務器上一共開了多少的 php-cgi 進程
ps -fe |grep "php-fpm"|grep "pool"|wc -l
2.查看已經有多少個php-cgi進程用來處理tcp請求
netstat -anp|grep "php-fpm"|grep "tcp"|grep "pool"|wc -l
3.linux+nginx+php環境中,每個php-fpm進程的內存限制
設置方法:
編輯php-fpm.conf配置文件
php_admin_value[memory_limit] = 128M(我服務器上的配置文件在/etc/php5/fpm/pool.d/www.conf 這個文件是被包含在php-fpm.conf里的) 后邊的數字可以隨便更改:32M,64M,128M,256M,512M,這個設置可根據你的服務器內存大小和你的需求來寫,修改后要加載一下php-fpm服務。
以上是“如何解決Linux下php-fpm進程過多導致內存耗盡問題”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。