當個人部落格資料庫服務經常突然結束通話,造成無法訪問時我們能做什麼?本篇主題就是記錄博主針對這一現象時發現問題,分析問題,最後解決問題的過程。
發現問題
最近,發現個人部落格的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複製程式碼
再次檢視記憶體使用情況, 使用記憶體降低很多:
之後經過多次觀察記憶體使用情況,發現此次改進後,伺服器記憶體資源消耗得到很大緩解。