摘要:是實(shí)現(xiàn)的進(jìn)程管理器用于替換的大部分附加功能,適用于高負(fù)載網(wǎng)站。能夠創(chuàng)建的最大子進(jìn)程數(shù)量,它在使用多個(gè)配置的進(jìn)程池的時(shí)候,控制全局的子進(jìn)程數(shù)量。同時(shí)根據(jù)進(jìn)程池的數(shù)量來看一個(gè)進(jìn)程管理器的子進(jìn)程數(shù)量限制。
PHP-FPM
先來了解一些名詞概念:
CGI是Common Gateway Interface(通用網(wǎng)管協(xié)議),用于讓交互程序和Web服務(wù)器通信的協(xié)議。它負(fù)責(zé)處理URL的請(qǐng)求,啟動(dòng)一個(gè)進(jìn)程,將客戶端發(fā)送的數(shù)據(jù)作為輸入,由Web服務(wù)器收集程序的輸出并加上合適的頭部,再發(fā)送回客戶端。
FastCGI是基于CGI的增強(qiáng)版本的協(xié)議,不同于創(chuàng)建新的進(jìn)程來服務(wù)請(qǐng)求,使用持續(xù)的進(jìn)程和創(chuàng)建的子進(jìn)程來處理一連串的進(jìn)程,這些進(jìn)程由FastCGI服務(wù)器管理,開銷更小,效率更高。
PHP-FPM是PHP實(shí)現(xiàn)的FastCGI Process Manager(FastCGI進(jìn)程管理器), 用于替換PHP FastCGI的大部分附加功能,適用于高負(fù)載網(wǎng)站。支持的功能如:
平滑停止/啟動(dòng)的高級(jí)進(jìn)程管理功能
慢日志記錄腳本
動(dòng)態(tài)/靜態(tài)子進(jìn)程產(chǎn)生
基于php.ini的配置文件
PHP-FPM在5.4之后已經(jīng)整合進(jìn)入PHP源代碼中,提供更好的PHP進(jìn)程管理方式,可以有效控制內(nèi)存和進(jìn)程,平滑重載PHP配置。如果需要使用,在./configure的時(shí)候帶上-enable-fpm參數(shù)即可,使用PHP-FPM來控制FastCGI進(jìn)程:
// 支持start/stop/quit/restart/reload/logrotate參數(shù) // quit/reload是平滑終止和平滑重新加載,即等現(xiàn)有的服務(wù)完成 ./php-fpm --startPHP-FPM 配置
PHP-FPM配置文件為php-fpm.conf,在這個(gè)配置文件中我們需要了解一些參數(shù)。下面所有的子進(jìn)程均指php-fpm進(jìn)程,可以在終端通過ps aux | grep php查看到。
顯示php-fpm: pool www的代表work子進(jìn)程(實(shí)際處理請(qǐng)求)
顯示php-fpm: process master的代表master主進(jìn)程(負(fù)責(zé)管理work子進(jìn)程)
全局配置先看PHP-FPM最重要的全局配置部分:
emergency_restart_threshold如果在emergency_restart_interval設(shè)定的時(shí)間內(nèi)收到該參數(shù)設(shè)定次數(shù)的SIGSEGV或SIGBUS退出的信號(hào),則FPM會(huì)重新啟動(dòng)。默認(rèn)值為0,表示關(guān)閉該功能。
emergency_restart_interval設(shè)定平滑重啟的間隔時(shí)間,有助于解決加速器中共享內(nèi)存的使用問題??捎脝挝?b>s(默認(rèn))/m/h/d,默認(rèn)值為0, 表示關(guān)閉。
process.maxFPM能夠創(chuàng)建的最大子進(jìn)程數(shù)量,它在使用多個(gè)pm = dynamic配置的php-fpm pool進(jìn)程池的時(shí)候,控制全局的子進(jìn)程數(shù)量。默認(rèn)值為0,代表著無限制。
進(jìn)程池配置PHP-FPM的配置其余部分是一個(gè)名為Pool Definitions的區(qū)域,這個(gè)區(qū)域的配置設(shè)置每個(gè)PHP-FPM進(jìn)程池,進(jìn)程池中是一系列相關(guān)的子進(jìn)程。這部分開頭都是[進(jìn)程池名稱],如[www]。
此時(shí)可以解釋看到ps aux | grep php中顯示的是php-fpm: pool www。
pmpm指的是process manager,指定進(jìn)程管理器如何控制子進(jìn)程的數(shù)量,它為必填項(xiàng),支持3個(gè)值:
static: 使用固定的子進(jìn)程數(shù)量,由pm.max_children指定
dynamic:基于下面的參數(shù)動(dòng)態(tài)的調(diào)整子進(jìn)程的數(shù)量,至少有一個(gè)子進(jìn)程
pm.max_chidren: 可以同時(shí)存活的子進(jìn)程的最大數(shù)量
pm.start_servers: 啟動(dòng)時(shí)創(chuàng)建的子進(jìn)程數(shù)量,默認(rèn)值為min_spare_servers + max_spare_servers - min_spare_servers) / 2
pm.min_spare_servers: 空閑狀態(tài)的子進(jìn)程的最小數(shù)量,如果不足,新的子進(jìn)程會(huì)被自動(dòng)創(chuàng)建
pm.max_spare_servers: 空閑狀態(tài)的子進(jìn)程的最大數(shù)量,如果超過,一些子進(jìn)程會(huì)被殺死
ondemand: 啟動(dòng)時(shí)不會(huì)創(chuàng)建子進(jìn)程,當(dāng)新的請(qǐng)求到達(dá)時(shí)才創(chuàng)建。會(huì)使用下面兩個(gè)參數(shù):
pm.max_children
pm.process_idle_timeout 子進(jìn)程的空閑超時(shí)時(shí)間,如果超時(shí)時(shí)間到?jīng)]有新的請(qǐng)求可以服務(wù),則會(huì)被殺死
pm.max_requests每一個(gè)子進(jìn)程的最大請(qǐng)求服務(wù)數(shù)量,如果超過了這個(gè)值,該子進(jìn)程會(huì)被自動(dòng)重啟。在解決第三方庫(kù)的內(nèi)存泄漏問題時(shí),這個(gè)參數(shù)會(huì)很有用。默認(rèn)值為0,指子進(jìn)程可以持續(xù)不斷的服務(wù)請(qǐng)求。
PHP-FPM配置優(yōu)化PHP-FPM管理的方式是一個(gè)master主進(jìn)程,多個(gè)pool進(jìn)程池,多個(gè)worker子進(jìn)程。其中每個(gè)進(jìn)程池監(jiān)聽一個(gè)socket套接字。具體的圖示:
其中的worker子進(jìn)程實(shí)際處理連接請(qǐng)求,master主進(jìn)程負(fù)責(zé)管理子進(jìn)程:
1. `master`進(jìn)程,設(shè)置1s定時(shí)器,通過`socket`文件監(jiān)聽 2. 在`pm=dynamic`時(shí),如果`idle worker`數(shù)量<`pm.min_spare_servers`,創(chuàng)建新的子進(jìn)程 3. 在`pm=dynamic`時(shí),如果`idle worker`數(shù)量>`pm.max_spare_servers`,殺死多余的空閑子進(jìn)程 4. 在`pm=ondemand`時(shí),如果`idle worker`空閑時(shí)間>`pm.process_idle_timeout`,殺死該空閑進(jìn)程 5. 當(dāng)連接到達(dá)時(shí),檢測(cè)如果`worker`數(shù)量>`pm.max_children`,打印`warning`日志,退出;如果無異常,使用`idle worker`服務(wù),或者新建`worker`服務(wù)保障基本安全
我們?yōu)榱吮苊?b>PHP-FPM主進(jìn)程由于某些糟糕的PHP代碼掛掉,需要設(shè)置重啟的全局配置:
; 如果在1min內(nèi)有10個(gè)子進(jìn)程被中斷失效,重啟主進(jìn)程 emergency_restart_threshold = 10 emergency_restart_interval = 1m進(jìn)程數(shù)調(diào)優(yōu)
每一個(gè)子進(jìn)程同時(shí)只能服務(wù)一次連接,所以控制同時(shí)存在多少個(gè)進(jìn)程數(shù)就很重要,如果過少會(huì)導(dǎo)致很多不必要的重建和銷毀的開銷,如果過多又會(huì)占用過多的內(nèi)存,影響其他服務(wù)使用。
我們應(yīng)該測(cè)試自己的PHP進(jìn)程使用多少內(nèi)存,一般來說剛啟動(dòng)時(shí)是8M左右,運(yùn)行一段時(shí)間由于內(nèi)存泄漏和緩存會(huì)上漲到30M左右,所以你需要根據(jù)自己的預(yù)期內(nèi)存大小設(shè)定進(jìn)程的數(shù)量。同時(shí)根據(jù)進(jìn)程池的數(shù)量來看一個(gè)進(jìn)程管理器的子進(jìn)程數(shù)量限制。
測(cè)試平均PHP子進(jìn)程占用的內(nèi)存:$ps auxf | grep php | grep -v grep work 26829 0.0 0.0 715976 4712 ? Ss Jul11 0:00 php-fpm: master process (./etc/php-fpm.conf) work 21889 0.0 0.0 729076 29668 ? S 03:12 0:20 \_ php-fpm: pool www work 21273 0.0 0.0 728928 31380 ? S 03:25 0:21 \_ php-fpm: pool www work 15114 0.0 0.0 728052 29084 ? S 03:40 0:19 \_ php-fpm: pool www work 17072 0.0 0.0 728800 34240 ? S 03:54 0:22 \_ php-fpm: pool www work 22763 0.0 0.0 727904 20352 ? S 11:29 0:04 \_ php-fpm: pool www work 38545 0.0 0.0 727796 19484 ? S 12:34 0:01 \_ php-fpm: pool www // 共占用的內(nèi)存數(shù)量 $ps auxf | grep php | grep -v grep | grep -v master | awk "{sum+=$6} END {print sum}" 162712 // 所有的子進(jìn)程數(shù)量 $ ps auxf | grep php | grep -v grep | grep -v master | wc -l 6
可以看到第6列,每一個(gè)子進(jìn)程的內(nèi)存占用大概在19-34M之間(單位為KB)。平均的內(nèi)存占用為162712KB/6 = 27.1M。
查看服務(wù)器總的內(nèi)存大小$ free -g total used free shared buffers cached Mem: 157 141 15 0 4 123 -/+ buffers/cache: 13 143 Swap: 0 0 0
可以看出我的服務(wù)器總得內(nèi)存大小是157G(-g采用了G的單位)。
進(jìn)程數(shù)限制此時(shí)如果我們分配全部的內(nèi)存給PHP-FPM使用,那么進(jìn)程數(shù)可以限制在157000/27 = 5814,但是由于我的服務(wù)器同時(shí)服務(wù)了很多內(nèi)容,所以我們可以向下調(diào)整到512個(gè)進(jìn)程數(shù):
process.max = 512 pm = dynamic pm.max_children = 512 pm.start_servers = 16 pm.min_spare_servers = 8 pm.max_spare_serveres = 30防止內(nèi)存泄漏
由于糟糕的插件和庫(kù),內(nèi)存泄漏時(shí)有發(fā)生,所以我們需要對(duì)每一個(gè)子進(jìn)程服務(wù)的請(qǐng)求數(shù)量做限制,防止無限制的內(nèi)存泄漏:
pm.max_requests = 1000重啟
如果上面的配置都按照你的實(shí)際需求和環(huán)境配置好了,不要忘記重啟PHP-FPM服務(wù)。
參考資料PHP手冊(cè)-FastCGI: http://php.net/manual/zh/inst...
維基百科-CGI:https://zh.wikipedia.org/wiki...
維基百科-FastCGI:https://zh.wikipedia.org/wiki...
博客園 php-fpm進(jìn)程數(shù)優(yōu)化:https://www.cnblogs.com/52fhy...
簡(jiǎn)書 php-fpm進(jìn)程管理:https://www.jianshu.com/p/c9a...
PHP手冊(cè) php-fpm.conf:http://php.net/manual/zh/inst...
《Modern PHP》 第七章 PHP-FPM
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29020.html
摘要:將環(huán)境變量和標(biāo)準(zhǔn)輸入發(fā)送到子進(jìn)程子進(jìn)程完成處理后將標(biāo)準(zhǔn)輸出和錯(cuò)誤信息從同一連接返回。當(dāng)子進(jìn)程關(guān)閉連接時(shí),請(qǐng)求便告知處理完成。定義一個(gè)子進(jìn)程最多處理的請(qǐng)求數(shù),達(dá)到這個(gè)值,進(jìn)程自動(dòng)退出。 一、SAPI比較 1. SAPI 服務(wù)器應(yīng)用程序編程接口,就是服務(wù)器與編程語(yǔ)言之間交互的接口。比如Linux命令行執(zhí)行一段PHP代碼,其實(shí)是Linux shell通過PHP SAPI傳入一組參數(shù),zend...
摘要:?jiǎn)?dòng)之后,會(huì)創(chuàng)建一個(gè)進(jìn)程,監(jiān)聽端口可配置,進(jìn)程又會(huì)根據(jù)去創(chuàng)建若干子進(jìn)程,子進(jìn)程用于處理實(shí)際的業(yè)務(wù)。如果選擇,則由指定固定的子進(jìn)程數(shù)。 FPM工作流程 fpm 全名是FastCGI進(jìn)程管理器,可以參考關(guān)于FastCGI的說明:CGI、FastCGI、PHP-CGI和PHP-FPM 概念區(qū)分fpm啟動(dòng)后會(huì)先讀php.ini,然后再讀取相應(yīng)的conf配置文件,conf配置可以覆蓋php.in...
摘要:是與之間數(shù)據(jù)交換的一種協(xié)議。當(dāng)收到這個(gè)請(qǐng)求后,會(huì)啟動(dòng)對(duì)應(yīng)的程序,這里就是的解析器。接下來解析器會(huì)解析文件,初始化執(zhí)行環(huán)境,然后處理請(qǐng)求,再以規(guī)定規(guī)定的格式返回處理后的結(jié)果,退出進(jìn)程,再把結(jié)果返回給瀏覽器。 CGI:是 Web Server 與 Web Application 之間數(shù)據(jù)交換的一種協(xié)議。FastCGI:同 CGI,是一種通信協(xié)議,但比 CGI 在效率上做了一些優(yōu)化。PHP-...
摘要:是與之間數(shù)據(jù)交換的一種協(xié)議。當(dāng)收到這個(gè)請(qǐng)求后,會(huì)啟動(dòng)對(duì)應(yīng)的程序,這里就是的解析器。接下來解析器會(huì)解析文件,初始化執(zhí)行環(huán)境,然后處理請(qǐng)求,再以規(guī)定規(guī)定的格式返回處理后的結(jié)果,退出進(jìn)程,再把結(jié)果返回給瀏覽器。 CGI:是 Web Server 與 Web Application 之間數(shù)據(jù)交換的一種協(xié)議。FastCGI:同 CGI,是一種通信協(xié)議,但比 CGI 在效率上做了一些優(yōu)化。PHP-...
摘要:是與之間數(shù)據(jù)交換的一種協(xié)議。當(dāng)收到這個(gè)請(qǐng)求后,會(huì)啟動(dòng)對(duì)應(yīng)的程序,這里就是的解析器。接下來解析器會(huì)解析文件,初始化執(zhí)行環(huán)境,然后處理請(qǐng)求,再以規(guī)定規(guī)定的格式返回處理后的結(jié)果,退出進(jìn)程,再把結(jié)果返回給瀏覽器。 CGI:是 Web Server 與 Web Application 之間數(shù)據(jù)交換的一種協(xié)議。FastCGI:同 CGI,是一種通信協(xié)議,但比 CGI 在效率上做了一些優(yōu)化。PHP-...
閱讀 2985·2023-04-26 02:29
閱讀 592·2019-08-30 15:54
閱讀 1672·2019-08-29 13:13
閱讀 609·2019-08-28 17:51
閱讀 2731·2019-08-26 13:58
閱讀 1543·2019-08-26 13:27
閱讀 2829·2019-08-26 11:39
閱讀 3454·2019-08-26 10:46