php-fpm解讀-進程管理的三種模式 及 worker進程、master進程詳解


php-fpm 和 單例設計模式  都是短連接

php-fpm進程管理一共有三種模式:ondemand、static、dynamic,我們可以在同一個fpm的master配置三種模式,看下圖1。php-fpm的工作模式和nginx類似,都是一個master,多個worker模型。每個worker都在accept本pool內的監聽套接字(linux已不存在驚群現象)。

圖1

 

ondemand

在php-fpm啟動的時候,不會給這個pool啟動任何一個worker,是按需啟動,當有連接過來才會啟動。

配置文件(我的配置文件地址為:/usr/local/php/etc/php-fpm.conf)

 

 
當前pool的名字為test

原理

 

ondemand原理圖

1. 從上圖可以看出,新建worker的觸發條件是連接的到來,而不是實際的請求(例如,只進行連接比如telnet,不發請求數據也會新建worker)

2. worker的數量受限於pm.max_children配置,同時受限全局配置process.max(准確的說,三種模式都受限於全局配置)

3.1秒定時器作用

找到空閑worker,如果空閑時間超過pm.process_idle_timeout大小,關閉。這個機制可能會關閉所有的worker。

配置項要求

1. pm.max_children> 0

2. pm.process_idle_timeout> 0,如果不設置,默認10s

優缺點

優點:按流量需求創建,不浪費系統資源(在硬件如此便宜的時代,這個優點略顯雞肋)

缺點:由於php-fpm是短連接的,所以每次請求都會先建立連接,建立連接的過程必然會觸發上圖的執行步驟,所以,在大流量的系統上master進程會變得繁忙,占用系統cpu資源,不適合大流量環境的部署

 

dynamic

在php-fpm啟動時,會初始啟動一些worker,在運行過程中動態調整worker數量,worker的數量受限於pm.max_children配置,同時受限全局配置process.max

 
當前pool的名字為test

原理

 
dynamic原理圖

1. 1秒定時器作用

檢查空閑worker數量,按照一定策略動態調整worker數量,增加或減少。增加時,worker最大數量<=max_children· <=全局process.max;減少時,只有idle >pm.max_spare_servers時才會關閉一個空閑worker。

idle > pm.max_spare_servers,關閉啟動時間最長的一個worker,結束本次處理

idle >= pm.max_children,打印WARNING日志,結束本次處理

idle < pm.max_children,計算一個num值,然后啟動num個worker,結束本次處理

配置項要求

1. pm.min_spare_servers/pm.max_spare_servers有效范圍(0,pm.max_children]

2. pm.max_children> 0

3. pm.min_spare_servers<=pm.max_spare_servers

4. pm.start_servers有效范圍[pm.min_spare_servers,pm.max_spare_servers]如果沒有配置,默認pm.min_spare_servers + (pm.max_spare_servers - pm.min_spare_servers) / 2

優缺點

優點:動態擴容,不浪費系統資源,master進程設置的1秒定時器對系統的影響忽略不計;

缺點:如果所有worker都在工作,新的請求到來只能等待master在1秒定時器內再新建一個worker,這時可能最長等待1s;

 

static

php-fpm啟動采用固定大小數量的worker,在運行期間也不會擴容,雖然也有1秒的定時器,僅限於統計一些狀態信息,例如空閑worker個數,活動worker個數,網絡連接隊列長度等信息。

 

 
當前pool的名字為test

原理

 
 

配置項要求

1、pm.max_children> 0 必須配置,且只有這一個參數生效

優缺點

如果配置成static,只需要考慮max_children的數量,數量取決於cpu的個數和應用的響應時間,我司配置的是50。

我司不考慮動態的增加減少那么十幾個或者幾十個worker,我們的內存沒有緊張到這個程度,所以,我們一步到位,把worker數配置到支持最大流量,(哈哈,50也是隨便定的,足矣足矣呢)每開啟一個php-fpm進程要占用近30M左右的內存

 

最后我們再介紹下worker的工作流程

此圖出自大表哥@要要

fastcgi與php-fpm的關系一句話解讀:fastcgi只是通信應用協議,php-fpm就是實現了fastcig協議,並嵌入了一個 PHP 解釋器。

 

 

worker進程、master進程詳解

kill掉master和worker進程
(1)將pm設置為static,max_children設置為1,重啟php-fpm,此時worker進程只有一個

(2)從瀏覽器訪問服務器上的一個php文件,確保能夠訪問
(3)kill掉master進程

kill 12734

 

(4)查看

ps aux | grep php-fpm

結論:服務器無法訪問php文件

kill掉master進程,留下worker進程

kill -9 master進程號

因為我這時候用的php7.2版本,centos7,無法實現只kill掉master進程,留下worker進程(在其他的版本中中是可以實現的,如php7.1)。因為我一旦kill掉master進程后,worker進程也掛掉了。

下面貼出我在其他地方看到的測試圖片

可以看到只留下了worker進程,master進程被kill掉了
然后服務器訪問php資源,可以訪問到
結論(敲黑板 重點 面試會問到):master只是負責監聽管理工作,並不是很多人認為的把客戶端發來的請求分給worker進程處理,而是由worker進程負責客戶端的請求監聽和處理

kill掉worker進程,留下master進程

kill master進程號

可以看到一旦kill掉worker進程后,會重啟一個新的worker進程。因此客戶端請求肯定會得到響應處理。這進一步驗證了的上面的結論,master進程負責監聽子進程的狀態,子進程掛掉之后,會發信號給master進程,然后master進程重新啟一個新的worker進程。



鏈接:https://www.jianshu.com/p/c9a028c834ff


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM