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 -40n

查看消耗內存最多的前40個進程:

查看第四列內存使用佔比,發現除了mysql資料庫服務之外,php-fpm服務池開啟了太多子進程,佔用超過大半內存,問題找到了,我們開始解決問題:設置控制php-fpm進程池進程數量。

解決問題

通過各種搜索手段,發現可以通過配置pm.max_children屬性,控制php-fpm子進程數量,首先,打開php-fpm配置文件,執行指令:

vi /etc/php-fpm.d/www.confn

找到pm.max_children欄位,發現其值過大:

如圖,pm.max_children值為50,每一個進程佔用1%-2.5%的內存,加起來就耗費大半內存了,所以我們需要將其值調小,博主這裡將其設置為25,同時,檢查以下兩個屬性:

  1. pm.max_spare_servers: 該值表示保證空閑進程數最大值,如果空閑進程大於此值,此進行清理
  2. pm.min_spare_servers: 保證空閑進程數最小值,如果空閑進程小於此值,則創建新的子進程;

這兩個值均不能不能大於pm.max_children值,通常設置pm.max_spare_servers值為pm.max_children值的60%-80%。

最後,重啟php-fpm

systemctl restart php-fpmn

再次查看內存使用情況, 使用內存降低很多:

之後經過多次觀察內存使用情況,發現此次改進後,伺服器內存資源消耗得到很大緩解。


推薦閱讀:

PHP易錯面試題收集-持續更新
PHP 新手該如何學習使用開發框架,有案例嗎?
十個超級有用的PHP代碼片段
PHP開發微博,需要注意哪些問題?或者是需要用到哪些技術便於開發?

TAG:Linux | PHP | 内存管理 |