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

《我是程序媛》系列——php-fpm進程管理,感謝大表哥親情贊助時間,讀了php-fpm源碼。

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

圖1


ondemand

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

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


當(dāng)前pool的名字為test

原理


ondemand原理圖

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

2. worker的數(shù)量受限于pm.max_children配置,同時受限全局配置process.max(準(zhǔn)確的說,三種模式都受限于全局配置)

3.1秒定時器作用

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

配置項要求

1. pm.max_children> 0

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

優(yōu)缺點

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

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


dynamic

在php-fpm啟動時,會初始啟動一些worker,在運行過程中動態(tài)調(diào)整worker數(shù)量,worker的數(shù)量受限于pm.max_children配置,同時受限全局配置process.max

當(dāng)前pool的名字為test

原理

dynamic原理圖

1. 1秒定時器作用

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

idle > pm.max_spare_servers,關(guān)閉啟動時間最長的一個worker,結(jié)束本次處理

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

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

配置項要求

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

優(yōu)缺點

優(yōu)點:動態(tài)擴容,不浪費系統(tǒng)資源,master進程設(shè)置的1秒定時器對系統(tǒng)的影響忽略不計;

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


static

php-fpm啟動采用固定大小數(shù)量的worker,在運行期間也不會擴容,雖然也有1秒的定時器,僅限于統(tǒng)計一些狀態(tài)信息,例如空閑worker個數(shù),活動worker個數(shù),網(wǎng)絡(luò)連接隊列長度等信息。


當(dāng)前pool的名字為test

原理

配置項要求

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

優(yōu)缺點

如果配置成static,只需要考慮max_children的數(shù)量,數(shù)量取決于cpu的個數(shù)和應(yīng)用的響應(yīng)時間,我司配置的是50。

我司不考慮動態(tài)的增加減少那么十幾個或者幾十個worker,我們的內(nèi)存沒有緊張到這個程度,所以,我們一步到位,把worker數(shù)配置到支持最大流量,(哈哈,50也是隨便定的,足矣足矣呢)


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

此圖出自大表哥@要要

fastcgi與php-fpm的關(guān)系一句話解讀:fastcgi只是通信應(yīng)用協(xié)議,php-fpm就是實現(xiàn)了fastcig協(xié)議,并嵌入了一個 PHP 解釋器。


大表哥說fpm必須讓大象背上,設(shè)計能力有限,湊合看吧
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文github地址 1.PHP概述 1.1 PHP的歷史發(fā)展 1995年由Lerdorf創(chuàng)建PHP,高級腳本語言...
    10xjzheng閱讀 1,580評論 0 2
  • 在實際的開發(fā)和應(yīng)用中偶發(fā)的502,504讓人頭痛,下面轉(zhuǎn)發(fā)一個寫的比較全面的。 PHP-fpm PHP-FPM是一...
    daos閱讀 2,538評論 2 18
  • LAMP簡介 LAMP(Linux- Apache-MySQL-PHP)網(wǎng)站架構(gòu)是目前國際流行的Web框架,該框架...
    mx3閱讀 1,152評論 1 9
  • 1.LAMP介紹 ? LAM(M)P:L: linuxA: apache (httpd)M: mysql, mar...
    尛尛大尹閱讀 1,249評論 0 1
  • 我喜歡喝茶 喜歡喝茶就跟我喜歡喝酒一樣的喜歡 但我還沒遇上一個足夠我喜歡的姑娘
    老蔡兒閱讀 192評論 0 0

友情鏈接更多精彩內(nèi)容