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

ondemand
在php-fpm啟動的時候,不會給這個pool啟動任何一個worker,是按需啟動,當(dāng)有連接過來才會啟動。
配置文件(我的配置文件地址為:/usr/local/php/etc/php-fpm.conf)

原理

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

原理

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ò)連接隊列長度等信息。

原理

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