解決Linux下php-fpm進程過多導致內(nèi)存耗盡問題
最近,發(fā)現(xiàn)個人博客的Linux服務器,數(shù)據(jù)庫服務經(jīng)常掛掉,導致需要重啟,才能正常訪問,極其惡心,于是決心開始解決問題,解放我的時間和精力(我可不想經(jīng)常出問題,然后人工重啟,費力費時)。
分析問題
發(fā)現(xiàn)問題以后,首先使用 free -m 指令查看當前服務器執(zhí)行狀況:

可以看到我的服務器內(nèi)存是2G的,但是目前可用內(nèi)存只剩下70M,內(nèi)存使用率高達92%,很有可能是內(nèi)存使用率過高導致數(shù)據(jù)庫服務掛斷。
繼續(xù)看詳細情況,使用 top 指令:

然后再看指令輸出結(jié)果中詳細列出的進程情況,重點關注第10列內(nèi)存使用占比:

發(fā)現(xiàn)CPU使用率不算高,也排除了CPU的問題,另外可以看到數(shù)據(jù)庫服務占用15.2%的內(nèi)存,內(nèi)存使用過高時將會擠掉數(shù)據(jù)庫進程(占用內(nèi)存最高的進程),導致服務掛斷,所以我們需要查看詳細內(nèi)存使用情況,是哪些進程耗費了這么多的內(nèi)存呢?
使用指令:
ps auxw|head -1;ps auxw|sort -rn -k4|head -40
查看消耗內(nèi)存最多的前40個進程:

查看第四列內(nèi)存使用占比,發(fā)現(xiàn)除了mysql數(shù)據(jù)庫服務之外,php-fpm服務池開啟了太多子進程,占用超過大半內(nèi)存,問題找到了,我們開始解決問題:設置控制php-fpm進程池進程數(shù)量。
解決問題
通過各種搜索手段,發(fā)現(xiàn)可以通過配置 pm.max_children 屬性,控制php-fpm子進程數(shù)量,首先,打開php-fpm配置文件,執(zhí)行指令:
vi /etc/php-fpm.d/www.conf
找到 pm.max_children 字段,發(fā)現(xiàn)其值過大:

如圖, pm.max_children 值為50,每一個進程占用1%-2.5%的內(nèi)存,加起來就耗費大半內(nèi)存了,所以我們需要將其值調(diào)小,博主這里將其設置為25,同時,檢查以下兩個屬性:
pm.max_spare_servers : 該值表示保證空閑進程數(shù)最大值,如果空閑進程大于此值,此進行清理 pm.min_spare_servers : 保證空閑進程數(shù)最小值,如果空閑進程小于此值,則創(chuàng)建新的子進程;
這兩個值均不能不能大于 pm.max_children 值,通常設置 pm.max_spare_servers 值為 pm.max_children 值的60%-80%。
最后,重啟php-fpm
systemctl restart php-fpm
再次查看內(nèi)存使用情況, 使用內(nèi)存降低很多:

之后經(jīng)過多次觀察內(nèi)存使用情況,發(fā)現(xiàn)此次改進后,服務器內(nèi)存資源消耗得到很大緩解。
ps:查看php-fpm開啟的進程數(shù)以及每個進程的內(nèi)存限制
1.通過命令查看服務器上一共開了多少的 php-cgi 進程
ps -fe |grep "php-fpm"|grep "pool"|wc -l
2.查看已經(jīng)有多少個php-cgi進程用來處理tcp請求
netstat -anp|grep "php-fpm"|grep "tcp"|grep "pool"|wc -l
3.linux+nginx+php環(huán)境中,每個php-fpm進程的內(nèi)存限制
設置方法:
編輯php-fpm.conf配置文件
php_admin_value[memory_limit] = 128M(我服務器上的配置文件在/etc/php5/fpm/pool.d/www.conf 這個文件是被包含在php-fpm.conf里的) 后邊的數(shù)字可以隨便更改:32M,64M,128M,256M,512M,這個設置可根據(jù)你的服務器內(nèi)存大小和你的需求來寫,修改后要加載一下php-fpm服務。
總結(jié)
以上所述是小編給大家介紹的Linux下php-fpm進程過多導致內(nèi)存耗盡問題解決,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- Linux下用Valgrind做檢查(防止內(nèi)存泄露)
- jmeter在linux系統(tǒng)下運行及本地內(nèi)存調(diào)優(yōu)的方法詳解
- linux swap交換內(nèi)存擴容的方法
- Python3監(jiān)控windows,linux系統(tǒng)的CPU、硬盤、內(nèi)存使用率和各個端口的開啟情況詳細代碼實例
- Linux內(nèi)核私闖進程地址空間并修改進程內(nèi)存的方法
- 如何利用Bash腳本監(jiān)控Linux的內(nèi)存使用情況
- Linux系統(tǒng)查看CPU、機器型號、內(nèi)存等信息
- Linux中大內(nèi)存頁Oracle數(shù)據(jù)庫優(yōu)化的方法
- 詳解Linux內(nèi)核內(nèi)存管理架構
- Linux系統(tǒng)下利用C程序輸出某進程的內(nèi)存占用信息
- python監(jiān)控linux內(nèi)存并寫入mongodb(推薦)
- Linux內(nèi)存描述符mm_struct實例詳解
- Linux共享內(nèi)存實現(xiàn)機制的詳解
- Linux 下如何檢查內(nèi)存使用率
相關文章
php 實現(xiàn)銀聯(lián)商務H5支付的示例代碼
這篇文章主要介紹了php 實現(xiàn)銀聯(lián)商務H5支付的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-10-10
destoon文章模塊調(diào)用企業(yè)會員資料的方法
這篇文章主要介紹了destoon文章模塊調(diào)用企業(yè)會員資料的方法,非常實用的一個技巧,需要的朋友可以參考下2014-08-08
CI框架源碼解讀之URI.php中_fetch_uri_string()函數(shù)用法分析
這篇文章主要介紹了CI框架源碼解讀之URI.php中_fetch_uri_string()函數(shù)用法,結(jié)合實例形式分析了CI框架中URL路由機制的原理與相關的config配置文件設置方法,需要的朋友可以參考下2016-05-05
Laravel 5使用Laravel Excel實現(xiàn)Excel/CSV文件導入導出的功能詳解
這篇文章主要給大家介紹了關于在Laravel 5中如何使用Laravel Excel實現(xiàn)Excel/CSV文件導入導出功能的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下。2017-10-10

