php-fpm解讀-進(jìn)程管理的三種模式

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

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

圖1


ondemand

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

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


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

原理


ondemand原理圖

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

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

3.1秒定時(shí)器作用

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

配置項(xiàng)要求

1. pm.max_children> 0

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

優(yōu)缺點(diǎn)

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

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


dynamic

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

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

原理

dynamic原理圖

1. 1秒定時(shí)器作用

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

idle > pm.max_spare_servers,關(guān)閉啟動(dòng)時(shí)間最長(zhǎng)的一個(gè)worker,結(jié)束本次處理

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

idle < pm.max_children,計(jì)算一個(gè)num值,然后啟動(dòng)num個(gè)worker,結(jié)束本次處理

配置項(xiàng)要求

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]如果沒有配置,默認(rèn)pm.min_spare_servers + (pm.max_spare_servers - pm.min_spare_servers) / 2

優(yōu)缺點(diǎn)

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

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


static

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


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

原理

配置項(xiàng)要求

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

優(yōu)缺點(diǎn)

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

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


最后我們?cè)俳榻B下worker的工作流程

此圖出自大表哥@要要

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


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

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

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

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