《我是程序媛》系列——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)象)。

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)

原理

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

原理

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)度等信息。

原理

配置項(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 解釋器。
完
