首頁  >  文章  >  後端開發  >  怎樣解決php-fpm在Linux下進程過多導致記憶體耗盡

怎樣解決php-fpm在Linux下進程過多導致記憶體耗盡

php中世界最好的语言
php中世界最好的语言原創
2017-12-20 14:11:521694瀏覽

我發現在個人部落格的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服務。


相信看了這些案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

相關閱讀:

java演算法中的關於二分查找與折半查找的實例詳解

javascript折半查找詳解_javascript技巧

javascript 折半查找字元在陣列中的位置(有序列表)_javascript技巧
#

以上是怎樣解決php-fpm在Linux下進程過多導致記憶體耗盡的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn