国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

php-fpm進程數(shù)管理

hlcfan / 940人閱讀

摘要:是實現(xiàn)的進程管理器用于替換的大部分附加功能,適用于高負載網(wǎng)站。能夠創(chuàng)建的最大子進程數(shù)量,它在使用多個配置的進程池的時候,控制全局的子進程數(shù)量。同時根據(jù)進程池的數(shù)量來看一個進程管理器的子進程數(shù)量限制。

PHP-FPM

先來了解一些名詞概念:

CGICommon Gateway Interface(通用網(wǎng)管協(xié)議),用于讓交互程序和Web服務(wù)器通信的協(xié)議。它負責處理URL的請求,啟動一個進程,將客戶端發(fā)送的數(shù)據(jù)作為輸入,由Web服務(wù)器收集程序的輸出并加上合適的頭部,再發(fā)送回客戶端。

FastCGI是基于CGI的增強版本的協(xié)議,不同于創(chuàng)建新的進程來服務(wù)請求,使用持續(xù)的進程和創(chuàng)建的子進程來處理一連串的進程,這些進程由FastCGI服務(wù)器管理,開銷更小,效率更高。

PHP-FPMPHP實現(xiàn)的FastCGI Process Manager(FastCGI進程管理器), 用于替換PHP FastCGI的大部分附加功能,適用于高負載網(wǎng)站。支持的功能如:

平滑停止/啟動的高級進程管理功能

慢日志記錄腳本

動態(tài)/靜態(tài)子進程產(chǎn)生

基于php.ini的配置文件

PHP-FPM在5.4之后已經(jīng)整合進入PHP源代碼中,提供更好的PHP進程管理方式,可以有效控制內(nèi)存和進程,平滑重載PHP配置。如果需要使用,在./configure的時候帶上-enable-fpm參數(shù)即可,使用PHP-FPM來控制FastCGI進程:

// 支持start/stop/quit/restart/reload/logrotate參數(shù)
// quit/reload是平滑終止和平滑重新加載,即等現(xiàn)有的服務(wù)完成
./php-fpm --start
PHP-FPM 配置

PHP-FPM配置文件為php-fpm.conf,在這個配置文件中我們需要了解一些參數(shù)。下面所有的子進程均指php-fpm進程,可以在終端通過ps aux | grep php查看到。

顯示php-fpm: pool www的代表work子進程(實際處理請求)

顯示php-fpm: process master的代表master主進程(負責管理work子進程)

全局配置

先看PHP-FPM最重要的全局配置部分:

emergency_restart_threshold

如果在emergency_restart_interval設(shè)定的時間內(nèi)收到該參數(shù)設(shè)定次數(shù)的SIGSEGVSIGBUS退出的信號,則FPM會重新啟動。默認值為0,表示關(guān)閉該功能。

emergency_restart_interval

設(shè)定平滑重啟的間隔時間,有助于解決加速器中共享內(nèi)存的使用問題。可用單位s(默認)/m/h/d,默認值為0, 表示關(guān)閉。

process.max

FPM能夠創(chuàng)建的最大子進程數(shù)量,它在使用多個pm = dynamic配置的php-fpm pool進程池的時候,控制全局的子進程數(shù)量。默認值為0,代表著無限制。

進程池配置

PHP-FPM的配置其余部分是一個名為Pool Definitions的區(qū)域,這個區(qū)域的配置設(shè)置每個PHP-FPM進程池,進程池中是一系列相關(guān)的子進程。這部分開頭都是[進程池名稱],如[www]

此時可以解釋看到ps aux | grep php中顯示的是php-fpm: pool www

pm

pm指的是process manager,指定進程管理器如何控制子進程的數(shù)量,它為必填項,支持3個值:

static: 使用固定的子進程數(shù)量,由pm.max_children指定

dynamic:基于下面的參數(shù)動態(tài)的調(diào)整子進程的數(shù)量,至少有一個子進程

pm.max_chidren: 可以同時存活的子進程的最大數(shù)量

pm.start_servers: 啟動時創(chuàng)建的子進程數(shù)量,默認值為min_spare_servers + max_spare_servers - min_spare_servers) / 2

pm.min_spare_servers: 空閑狀態(tài)的子進程的最小數(shù)量,如果不足,新的子進程會被自動創(chuàng)建

pm.max_spare_servers: 空閑狀態(tài)的子進程的最大數(shù)量,如果超過,一些子進程會被殺死

ondemand: 啟動時不會創(chuàng)建子進程,當新的請求到達時才創(chuàng)建。會使用下面兩個參數(shù):

pm.max_children

pm.process_idle_timeout 子進程的空閑超時時間,如果超時時間到?jīng)]有新的請求可以服務(wù),則會被殺死

pm.max_requests

每一個子進程的最大請求服務(wù)數(shù)量,如果超過了這個值,該子進程會被自動重啟。在解決第三方庫的內(nèi)存泄漏問題時,這個參數(shù)會很有用。默認值為0,指子進程可以持續(xù)不斷的服務(wù)請求。

PHP-FPM配置優(yōu)化

PHP-FPM管理的方式是一個master主進程,多個pool進程池,多個worker子進程。其中每個進程池監(jiān)聽一個socket套接字。具體的圖示:

其中的worker子進程實際處理連接請求,master主進程負責管理子進程:

1. `master`進程,設(shè)置1s定時器,通過`socket`文件監(jiān)聽
2. 在`pm=dynamic`時,如果`idle worker`數(shù)量<`pm.min_spare_servers`,創(chuàng)建新的子進程
3. 在`pm=dynamic`時,如果`idle worker`數(shù)量>`pm.max_spare_servers`,殺死多余的空閑子進程
4. 在`pm=ondemand`時,如果`idle worker`空閑時間>`pm.process_idle_timeout`,殺死該空閑進程
5. 當連接到達時,檢測如果`worker`數(shù)量>`pm.max_children`,打印`warning`日志,退出;如果無異常,使用`idle worker`服務(wù),或者新建`worker`服務(wù)
保障基本安全

我們?yōu)榱吮苊?b>PHP-FPM主進程由于某些糟糕的PHP代碼掛掉,需要設(shè)置重啟的全局配置:

; 如果在1min內(nèi)有10個子進程被中斷失效,重啟主進程
emergency_restart_threshold = 10
emergency_restart_interval = 1m
進程數(shù)調(diào)優(yōu)

每一個子進程同時只能服務(wù)一次連接,所以控制同時存在多少個進程數(shù)就很重要,如果過少會導致很多不必要的重建和銷毀的開銷,如果過多又會占用過多的內(nèi)存,影響其他服務(wù)使用。

我們應(yīng)該測試自己的PHP進程使用多少內(nèi)存,一般來說剛啟動時是8M左右,運行一段時間由于內(nèi)存泄漏和緩存會上漲到30M左右,所以你需要根據(jù)自己的預(yù)期內(nèi)存大小設(shè)定進程的數(shù)量。同時根據(jù)進程池的數(shù)量來看一個進程管理器的子進程數(shù)量限制。

測試平均PHP子進程占用的內(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

// 所有的子進程數(shù)量
$ ps auxf | grep php | grep -v grep | grep -v master | wc -l 
6

可以看到第6列,每一個子進程的內(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的單位)。

進程數(shù)限制

此時如果我們分配全部的內(nèi)存給PHP-FPM使用,那么進程數(shù)可以限制在157000/27 = 5814,但是由于我的服務(wù)器同時服務(wù)了很多內(nèi)容,所以我們可以向下調(diào)整到512個進程數(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)存泄漏

由于糟糕的插件和庫,內(nèi)存泄漏時有發(fā)生,所以我們需要對每一個子進程服務(wù)的請求數(shù)量做限制,防止無限制的內(nèi)存泄漏:

pm.max_requests = 1000
重啟

如果上面的配置都按照你的實際需求和環(huán)境配置好了,不要忘記重啟PHP-FPM服務(wù)。

參考資料

PHP手冊-FastCGI: http://php.net/manual/zh/inst...

維基百科-CGI:https://zh.wikipedia.org/wiki...

維基百科-FastCGI:https://zh.wikipedia.org/wiki...

博客園 php-fpm進程數(shù)優(yōu)化:https://www.cnblogs.com/52fhy...

簡書 php-fpm進程管理:https://www.jianshu.com/p/c9a...

PHP手冊 php-fpm.conf:http://php.net/manual/zh/inst...

《Modern PHP》 第七章 PHP-FPM

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/29020.html

相關(guān)文章

  • 深入了解SAPI

    摘要:將環(huán)境變量和標準輸入發(fā)送到子進程子進程完成處理后將標準輸出和錯誤信息從同一連接返回。當子進程關(guān)閉連接時,請求便告知處理完成。定義一個子進程最多處理的請求數(shù),達到這個值,進程自動退出。 一、SAPI比較 1. SAPI 服務(wù)器應(yīng)用程序編程接口,就是服務(wù)器與編程語言之間交互的接口。比如Linux命令行執(zhí)行一段PHP代碼,其實是Linux shell通過PHP SAPI傳入一組參數(shù),zend...

    CoderBear 評論0 收藏0
  • PHP-FPM 配置說明

    摘要:啟動之后,會創(chuàng)建一個進程,監(jiān)聽端口可配置,進程又會根據(jù)去創(chuàng)建若干子進程,子進程用于處理實際的業(yè)務(wù)。如果選擇,則由指定固定的子進程數(shù)。 FPM工作流程 fpm 全名是FastCGI進程管理器,可以參考關(guān)于FastCGI的說明:CGI、FastCGI、PHP-CGI和PHP-FPM 概念區(qū)分fpm啟動后會先讀php.ini,然后再讀取相應(yīng)的conf配置文件,conf配置可以覆蓋php.in...

    luck 評論0 收藏0
  • (PHP7內(nèi)核剖析-1) CGI與FastCGI

    摘要:是與之間數(shù)據(jù)交換的一種協(xié)議。當收到這個請求后,會啟動對應(yīng)的程序,這里就是的解析器。接下來解析器會解析文件,初始化執(zhí)行環(huán)境,然后處理請求,再以規(guī)定規(guī)定的格式返回處理后的結(jié)果,退出進程,再把結(jié)果返回給瀏覽器。 CGI:是 Web Server 與 Web Application 之間數(shù)據(jù)交換的一種協(xié)議。FastCGI:同 CGI,是一種通信協(xié)議,但比 CGI 在效率上做了一些優(yōu)化。PHP-...

    rubyshen 評論0 收藏0
  • (PHP7內(nèi)核剖析-1) CGI與FastCGI

    摘要:是與之間數(shù)據(jù)交換的一種協(xié)議。當收到這個請求后,會啟動對應(yīng)的程序,這里就是的解析器。接下來解析器會解析文件,初始化執(zhí)行環(huán)境,然后處理請求,再以規(guī)定規(guī)定的格式返回處理后的結(jié)果,退出進程,再把結(jié)果返回給瀏覽器。 CGI:是 Web Server 與 Web Application 之間數(shù)據(jù)交換的一種協(xié)議。FastCGI:同 CGI,是一種通信協(xié)議,但比 CGI 在效率上做了一些優(yōu)化。PHP-...

    Salamander 評論0 收藏0
  • (PHP7內(nèi)核剖析-1) CGI與FastCGI

    摘要:是與之間數(shù)據(jù)交換的一種協(xié)議。當收到這個請求后,會啟動對應(yīng)的程序,這里就是的解析器。接下來解析器會解析文件,初始化執(zhí)行環(huán)境,然后處理請求,再以規(guī)定規(guī)定的格式返回處理后的結(jié)果,退出進程,再把結(jié)果返回給瀏覽器。 CGI:是 Web Server 與 Web Application 之間數(shù)據(jù)交換的一種協(xié)議。FastCGI:同 CGI,是一種通信協(xié)議,但比 CGI 在效率上做了一些優(yōu)化。PHP-...

    abson 評論0 收藏0

發(fā)表評論

0條評論

hlcfan

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<