php-fpm進程管理的三種模式


轉載自 php-fpm解讀-進程管理的三種模式
—程序媛大麗
標明轉載以示尊重 感謝原作者的分享。

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

ondemand

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

配置文件(我的配置文件地址為:/usr/local/php/etc/php-fpm.conf)
當前pool的名字為test
當前pool的名字為test

原理
在這里插入圖片描述

  1. 從上圖可以看出,新建worker的觸發條件是連接的到來,而不是實際的請求(例如,只進行連接比如telnet,不發請求數據也會新建worker)
  2. worker的數量受限於pm.max_children配置,同時受限全局配置process.max(准確的說,三種模式都受限於全局配置)
  3. 秒定時器作用找到空閑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
當前pool的名字為test

原理

在這里插入圖片描述

  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也是隨便定的,足矣足矣呢)
最后我們再介紹下worker的工作流程
在這里插入圖片描述

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


免責聲明!

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



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