Linux下php-fpm進程過多致使內存耗盡問題解決

當我的博客數據庫服務常常忽然掛斷,形成沒法訪問時咱們能作什麼?本篇主題就是記錄博主針對這一現象時發現問題,分析問題,最後解決問題的過程。php

歡迎訪問個人我的博客mysql

發現問題

最近,發現我的博客的Linux服務器,數據庫服務常常掛掉,致使須要重啓,才能正常訪問,極其噁心,因而決心開始解決問題,解放個人時間和精力(我可不想常常出問題,而後人工重啓,費力費時)。linux

分析問題

發現問題之後,首先使用free -m指令查看當前服務器執行情況:sql

free -m
free -m

能夠看到個人服務器內存是2G的,可是目前可用內存只剩下70M,內存使用率高達92%,頗有多是內存使用率太高致使數據庫服務掛斷。shell

繼續看詳細狀況,使用top指令:數據庫

top
top

而後再看指令輸出結果中詳細列出的進程狀況,重點關注第10列內存使用佔比:bash

top
top

發現CPU使用率不算高,也排除了CPU的問題,另外能夠看到數據庫服務佔用15.2%的內存,內存使用太高時將會擠掉數據庫進程(佔用內存最高的進程),致使服務掛斷,因此咱們須要查看詳細內存使用狀況,是哪些進程耗費了這麼多的內存呢?服務器

使用指令:php-fpm

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

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

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

以後通過屢次觀察內存使用狀況,發現這次改進後,服務器內存資源消耗獲得很大緩解。

相關文章
相關標籤/搜索