Linux下php-fpm進(jìn)程過多導(dǎo)致內(nèi)存耗盡問題解決
當(dāng)數(shù)據(jù)庫服務(wù)經(jīng)常突然掛斷,造成無法訪問時(shí)我們能做什么?本篇主題就是記錄針對(duì)這一現(xiàn)象時(shí)發(fā)現(xiàn)問題,分析問題,最后解決問題的過程。
發(fā)現(xiàn)問題
最近,發(fā)現(xiàn)個(gè)人博客的Linux服務(wù)器,數(shù)據(jù)庫服務(wù)經(jīng)常掛掉,導(dǎo)致需要重啟,才能正常訪問,極其惡心,于是決心開始解決問題,解放我的時(shí)間和精力(我可不想經(jīng)常出問題,然后人工重啟,費(fèi)力費(fèi)時(shí))。
分析問題
發(fā)現(xiàn)問題以后,首先使用free -m指令查看當(dāng)前服務(wù)器執(zhí)行狀況:

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

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

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

解決問題
通過各種搜索手段,發(fā)現(xiàn)可以通過配置pm.max_children屬性,控制php-fpm子進(jìn)程數(shù)量,首先,打開php-fpm配置文件,執(zhí)行指令:
vi?/etc/php-fpm.d/www.conf
找到pm.max_children字段,發(fā)現(xiàn)其值過大:

如圖,pm.max_children值為50,每一個(gè)進(jìn)程占用1%-2.5%的內(nèi)存,加起來就耗費(fèi)大半內(nèi)存了,所以我們需要將其值調(diào)小,博主這里將其設(shè)置為25,同時(shí),檢查以下兩個(gè)屬性:
pm.max_spare_servers: 該值表示保證空閑進(jìn)程數(shù)最大值,如果空閑進(jìn)程大于此值,此進(jìn)行清理pm.min_spare_servers: 保證空閑進(jìn)程數(shù)最小值,如果空閑進(jìn)程小于此值,則創(chuàng)建新的子進(jìn)程;
這兩個(gè)值均不能不能大于pm.max_children值,通常設(shè)置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)此次改進(jìn)后,服務(wù)器內(nèi)存資源消耗得到很大緩解。
(掃描二維碼,關(guān)注我的視頻號(hào))
