《我是程序媛》系列——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逗爹,是按需啟動,當有連接過來才會啟動嚎于。
配置文件(我的配置文件地址為:/usr/local/php/etc/php-fpm.conf)
原理
1. 從上圖可以看出掘而,新建worker的觸發(fā)條件是連接的到來,而不是實際的請求(例如于购,只進行連接比如telnet袍睡,不發(fā)請求數(shù)據(jù)也會新建worker)
2. worker的數(shù)量受限于pm.max_children配置,同時受限全局配置process.max(準確的說肋僧,三種模式都受限于全局配置)
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 解釋器苍糠。
完