Linux下php-fpm程式過多導致記憶體耗盡問題解決

熊建剛 發表於 2019-02-23

當個人部落格資料庫服務經常突然結束通話,造成無法訪問時我們能做什麼?本篇主題就是記錄博主針對這一現象時發現問題,分析問題,最後解決問題的過程。

歡迎訪問我的個人部落格

發現問題

最近,發現個人部落格的Linux伺服器,資料庫服務經常掛掉,導致需要重啟,才能正常訪問,極其噁心,於是決心開始解決問題,解放我的時間和精力(我可不想經常出問題,然後人工重啟,費力費時)。

分析問題

發現問題以後,首先使用free -m指令檢視當前伺服器執行狀況:

free -m
free -m

可以看到我的伺服器記憶體是2G的,但是目前可用記憶體只剩下70M,記憶體使用率高達92%,很有可能是記憶體使用率過高導致資料庫服務結束通話。

繼續看詳細情況,使用top指令:

top
top

然後再看指令輸出結果中詳細列出的程式情況,重點關注第10列記憶體使用佔比:

top
top

發現CPU使用率不算高,也排除了CPU的問題,另外可以看到資料庫服務佔用15.2%的記憶體,記憶體使用過高時將會擠掉資料庫程式(佔用記憶體最高的程式),導致服務結束通話,所以我們需要檢視詳細記憶體使用情況,是哪些程式耗費了這麼多的記憶體呢?

使用指令:

ps auxw|head -1;ps auxw|sort -rn -k4|head -40複製程式碼

檢視消耗記憶體最多的前40個程式:

ps -auxw
ps -auxw

檢視第四列記憶體使用佔比,發現除了mysql資料庫服務之外,php-fpm服務池開啟了太多子程式,佔用超過大半記憶體,問題找到了,我們開始解決問題:設定控制php-fpm程式池程式數量。

解決問題

通過各種搜尋手段,發現可以通過配置pm.max_children屬性,控制php-fpm子程式數量,首先,開啟php-fpm配置檔案,執行指令:

vi /etc/php-fpm.d/www.conf複製程式碼

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

www.conf
www.conf

如圖,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-fpm複製程式碼

再次檢視記憶體使用情況, 使用記憶體降低很多:

www.conf
www.conf

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