來源:不言 發(fā)布時(shí)間:2018-12-15 16:14:43 閱讀量:1091
這篇文章主要介紹了關(guān)于php-fpm的進(jìn)程數(shù)管理 ,有著一定的參考價(jià)值,現(xiàn)在分享給大家,有需要的朋友可以參考一下
PHP-FPM
先來了解一些名詞概念:
CGI
是Common Gateway Interface(通用網(wǎng)管協(xié)議)
,用于讓交互程序和Web服務(wù)器通信的協(xié)議。它負(fù)責(zé)處理URL的請求,啟動(dòng)一個(gè)進(jìn)程,將客戶端發(fā)送的數(shù)據(jù)作為輸入,由Web服務(wù)器收集程序的輸出并加上合適的頭部,再發(fā)送回客戶端。
FastCGI
是基于CGI
的增強(qiáng)版本的協(xié)議,不同于創(chuàng)建新的進(jìn)程來服務(wù)請求,使用持續(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ì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)程:
1 2 3 |
|
PHP-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í)際處理請求)
顯示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)存的使用問題。可用單位s(默認(rèn))/m/h/d
,默認(rèn)值為0, 表示關(guān)閉。
process.max
FPM
能夠創(chuàng)建的最大子進(jìn)程數(shù)量,它在使用多個(gè)pm = dynamic
配置的php-fpm pool
進(jìn)程池的時(shí)候,控制全局的子進(jìn)程數(shù)量。默認(rèn)值為0,代表著無限制。
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
。
pm
pm
指的是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)新的請求到達(dá)時(shí)才創(chuàng)建。會(huì)使用下面兩個(gè)參數(shù):
pm.max_children
pm.process_idle_timeou
t 子進(jìn)程的空閑超時(shí)時(shí)間,如果超時(shí)時(shí)間到?jīng)]有新的請求可以服務(wù),則會(huì)被殺死
pm.max_requests
每一個(gè)子進(jìn)程的最大請求服務(wù)數(shù)量,如果超過了這個(gè)值,該子進(jìn)程會(huì)被自動(dòng)重啟。在解決第三方庫的內(nèi)存泄漏問題時(shí),這個(gè)參數(shù)會(huì)很有用。默認(rèn)值為0,指子進(jìn)程可以持續(xù)不斷的服務(wù)請求。
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í)際處理連接請求,master
主進(jìn)程負(fù)責(zé)管理子進(jìn)程:
1 2 3 4 5 |
|
我們?yōu)榱吮苊?code style="margin: 0px 5px; padding: 2px 6px; background: rgb(243, 243, 243); border: 1px solid rgb(222, 217, 217); font-size: 0.92857em; border-radius: 4px;">PHP-FPM主進(jìn)程由于某些糟糕的PHP代碼掛掉,需要設(shè)置重啟的全局配置:
1 2 3 |
|
每一個(gè)子進(jìn)程同時(shí)只能服務(wù)一次連接,所以控制同時(shí)存在多少個(gè)進(jìn)程數(shù)就很重要,如果過少會(huì)導(dǎo)致很多不必要的重建和銷毀的開銷,如果過多又會(huì)占用過多的內(nèi)存,影響其他服務(wù)使用。
我們應(yīng)該測試自己的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ù)量限制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
可以看到第6列,每一個(gè)子進(jìn)程的內(nèi)存占用大概在19-34M之間(單位為KB)。平均的內(nèi)存占用為162712KB/6 = 27.1M
。
1 2 3 4 5 |
|
可以看出我的服務(wù)器總得內(nèi)存大小是157G(-g采用了G的單位)。
此時(shí)如果我們分配全部的內(nèi)存給PHP-FPM
使用,那么進(jìn)程數(shù)可以限制在157000/27 = 5814
,但是由于我的服務(wù)器同時(shí)服務(wù)了很多內(nèi)容,所以我們可以向下調(diào)整到512個(gè)進(jìn)程數(shù):
1 2 3 4 5 6 |
|
由于糟糕的插件和庫,內(nèi)存泄漏時(shí)有發(fā)生,所以我們需要對每一個(gè)子進(jìn)程服務(wù)的請求數(shù)量做限制,防止無限制的內(nèi)存泄漏:
1 |
|
如果上面的配置都按照你的實(shí)際需求和環(huán)境配置好了,不要忘記重啟PHP-FPM
服務(wù)。