国产欧美日韩第一页|日本一二三不卡视频|在线精品小视频,亚洲第一免费播放区,metcn人体亚洲一区,亚洲精品午夜视频

Linux的php-fpm進程占用內(nèi)存問題

2020-10-01 14:36:06 5322


LNMP架構(gòu)中PHP是運行在FastCGI模式下,按照官方的說法,php-cgi會在每個請求結(jié)束的時候會回收腳本使用的全部內(nèi)存,但是并不會釋放給操作系統(tǒng),而是繼續(xù)持有以應(yīng)對下一次PHP請求。而php-fpm是FastCGI進程管理器,用于控制php的內(nèi)存和進程等。

一、分析判斷php-fpm內(nèi)存占用情況

當(dāng)云主機出現(xiàn)了卡頓的情況,首先查看一下內(nèi)存的占用情況,常用的命令就是Top、Glances、Free等,使用Glances命令,再按下m,就可以查看到當(dāng)前云主機進程內(nèi)存占用情況了,按照占用內(nèi)存由多到少排序(或者使用Top命令,按下M,效果是一樣的)。如下圖(點擊放大):

1哈.png



這是一張重啟后進程內(nèi)存占用情況圖,從前后對比中可以發(fā)現(xiàn):隨著開機時間的增長,php-fpm占用的內(nèi)存越來越大,最終php-fpm耗盡了云所有物理內(nèi)存。

哈哈.png

查看當(dāng)前php-fpm總進程數(shù),命令:ps -ylC php-fpm --sort:rss。其中RSS就是占用的內(nèi)存情況。如下圖:

哈哈哈.png

查看當(dāng)前php-fpm進程的內(nèi)存占用情況及啟動時間,命令如下:

ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'|grep www|sort -nrk5

從下圖可以看出當(dāng)前php-fpm所有進程平均每個進程占用了60-70MB的內(nèi)存,啟動時間,是當(dāng)天的話就是3:12,否則會顯示是X月X日。

4哈.png

查看當(dāng)前php-fpm進程平均占用內(nèi)存情況,一般來說一個php-fpm進程占用的內(nèi)存為30-40MB,本次查詢的結(jié)果是60MB,顯然是多了。命令如下:

ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

結(jié)果61M

二、熟悉php-fpm配置文件說明

php-fpm.conf就是php-fpm的配置文件,路徑一般在:/usr/local/php/etc,如下圖:

5哈.png

php-fpm.conf幾個重要的參數(shù)說明如下:

pm = dynamic #指定進程管理方式,有3種可供選擇:static、dynamic和ondemand。

pm.max_children = 16 #static模式下創(chuàng)建的子進程數(shù)或dynamic模式下同一時刻允許最大的php-fpm子進程數(shù)量。

pm.start_servers = 10 #動態(tài)方式下的起始php-fpm進程數(shù)量。

pm.min_spare_servers = 8 #動態(tài)方式下服務(wù)器空閑時最小php-fpm進程數(shù)量。

pm.max_spare_servers = 16 #動態(tài)方式下服務(wù)器空閑時最大php-fpm進程數(shù)量。

pm.max_requests = 2000 #php-fpm子進程能處理的最大請求數(shù)。

pm.process_idle_timeout = 10s

request_terminate_timeout = 120

pm三種進程管理模式說明如下:

pm = static,始終保持一個固定數(shù)量的子進程,這個數(shù)由pm.max_children定義,這種方式很不靈活,也通常不是默認的。

pm = dynamic,啟動時會產(chǎn)生固定數(shù)量的子進程(由pm.start_servers控制)可以理解成最小子進程數(shù),而最大子進程數(shù)則由pm.max_children去控制,子進程數(shù)會在最大和最小數(shù)范圍中變化。閑置的子進程數(shù)還可以由另2個配置控制,分別是pm.min_spare_servers和pm.max_spare_servers。如果閑置的子進程超出了pm.max_spare_servers,則會被殺掉。小于pm.min_spare_servers則會啟動進程(注意,pm.max_spare_servers應(yīng)小于pm.max_children)。

pm = ondemand,這種模式和pm = dynamic相反,把內(nèi)存放在第一位,每個閑置進程在持續(xù)閑置了pm.process_idle_timeout秒后就會被殺掉,如果服務(wù)器長時間沒有請求,就只會有一個php-fpm主進程。弊端是遇到高峰期或者如果pm.process_idle_timeout的值太短的話,容易出現(xiàn)504 Gateway Time-out錯誤,因此pm = dynamic和pm = ondemand誰更適合視實際情況而定。

三、解決php-fpm進程占用內(nèi)存大問題

3.1  調(diào)整管理模式

static管理模式適合比較大內(nèi)存的服務(wù)器,而dynamic則適合小內(nèi)存的服務(wù)器,你可以設(shè)置一個pm.min_spare_servers和pm.max_spare_servers合理范圍,這樣進程數(shù)會不斷變動。ondemand模式則更加適合微小內(nèi)存,例如512MB或者256MB內(nèi)存,以及對可用性要求不高的環(huán)境。

3.2  減少php-fpm進程數(shù)

如果你的云主機的內(nèi)存被占用耗盡,可以檢查一下你的php-fpm進程數(shù),按照php-fpm進程數(shù)=內(nèi)存/2/30來計算,1GB內(nèi)存適合的php-fpm進程數(shù)為10-20之間,具體還得根據(jù)你的PHP加載的附加組件有關(guān)系。

3.3  php-fpm配置示例

這里以1GB內(nèi)存的云配置php-fpm為演示,實際操作來看設(shè)置數(shù)值還得根據(jù)服務(wù)器本身的性能、PHP等綜合考慮。

pm = dynamic #dynamic和ondemand適合小內(nèi)存。

pm.max_children = 15 #static模式下生效,dynamic不生效。

pm.start_servers = 8 #dynamic模式下開機的進程數(shù)量。

pm.min_spare_servers = 6 #dynamic模式下最小php-fpm進程數(shù)量。

pm.max_spare_servers = 15 #dynamic模式下最大php-fpm進程數(shù)量。

四、解決php-fpm進程不釋放內(nèi)存問題

上面通過減少php-fpm進程總數(shù)來達到減少php-fpm內(nèi)存占用的問題,實際使用過程中發(fā)現(xiàn)php-fpm進程還存長期占用內(nèi)存而不釋放的問題。解決的方法就是減少pm.max_requests數(shù)。

最大請求數(shù)max_requests,即當(dāng)一個 PHP-CGI 進程處理的請求數(shù)累積到 max_requests 個后,自動重啟該進程,這樣達到了釋放內(nèi)存的目的了。以1GB內(nèi)存的云主機設(shè)置為例(如果你設(shè)置的數(shù)值沒有達到釋放內(nèi)存可以繼續(xù)調(diào)低):

pm.max_requests = 500

 

當(dāng)php-fpm進程達到了pm.max_requests設(shè)定的數(shù)值后,就會重啟該進程,從而釋放內(nèi)存。下圖是我測試后的效果,可以看出php-fpm進程被強制結(jié)束并釋放了內(nèi)存。

6哈.png

五、總結(jié)

對于大內(nèi)存以及對并發(fā)和可用性要求的話,建議使用static管理模式+最大的pm.max_children。如果是小內(nèi)存的服務(wù)器,建議使用dynamic或者ondemand模式,同時降低pm.start_servers和pm.max_spare_servers進程數(shù)。為什么我調(diào)整了參數(shù)沒有達到應(yīng)有的效果?根據(jù)經(jīng)驗,php-fpm配置文件參數(shù)不能一概而論,必須要結(jié)合服務(wù)器自身的性能、WEB動態(tài)內(nèi)容以及對可用性的要求來進行調(diào)整,內(nèi)存長期占用最好是再檢查一下是否有內(nèi)存泄露。如果你的php-fpm參數(shù)調(diào)整得過小,有可能出現(xiàn)502錯誤。


提交成功!非常感謝您的反饋,我們會繼續(xù)努力做到更好!

這條文檔是否有幫助解決問題?

非常抱歉未能幫助到您。為了給您提供更好的服務(wù),我們很需要您進一步的反饋信息:

在文檔使用中是否遇到以下問題: