如何在Web中配置php-fpm調(diào)優(yōu)?

一、php-fpm.conf 主要配置參數(shù)

代縣ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

  • pm = dynamic; 表示使用哪種進(jìn)程數(shù)量管理方式

    dynamic 表示 php-fpm 進(jìn)程數(shù)是動態(tài)的,最開始是 pm.start_servers 指定的數(shù)量,如果請求較多,則會自動增加,保證空閑的進(jìn)程數(shù)不小于pm.min_spare_servers,如   果進(jìn)程數(shù)較多,也會進(jìn)行相應(yīng)清理,保證多余的進(jìn)程數(shù)不多于 pm.max_spare_servers;
    
    static 表示 php-fpm 進(jìn)程數(shù)是靜態(tài)的,進(jìn)程數(shù)自始至終都是 pm.max_children 指定的數(shù)量,不再增加或減少。
  • pm.max_children = 300; 靜態(tài)方式下開啟的php-fpm進(jìn)程數(shù)量
  • pm.start_servers = 20; 動態(tài)方式下的起始php-fpm進(jìn)程數(shù)量
  • pm.min_spare_servers = 5; 動態(tài)方式下的最小php-fpm進(jìn)程數(shù)量
  • pm.max_spare_servers = 35; 動態(tài)方式下的最大php-fpm進(jìn)程數(shù)量

    注意:數(shù)值設(shè)置,參考自己的實際硬件配置,可以參考 總內(nèi)存/30M 來計算。

如果 pm 設(shè)置為 static,那么其實只有 pm.max_children 這個參數(shù)生效。系統(tǒng)會開啟設(shè)置數(shù)量的 php-fpm 進(jìn)程。

如果 pm設(shè)置為 dynamic,那么 pm.max_children 參數(shù)失效,后面3個參數(shù)生效。系統(tǒng)會在 php-fpm 運行開始的時候啟動 pm.start_servers 個 php-fpm 進(jìn)程,然后根據(jù)系統(tǒng)的需求動態(tài)在 pm.min_spare_servers 和 pm.max_spare_servers 之間調(diào)整 php-fpm 進(jìn)程數(shù)。

1、pm 方式選擇

事實上,跟 Apache 一樣,運行的 PHP 程序在執(zhí)行完成后,或多或少會有內(nèi)存泄露的問題。這也是為什么開始的時候一個 php-fpm 進(jìn)程只占用 3M 左右內(nèi)存,運行一段時間后就會上升到 20-30M 的原因了。

對于內(nèi)存大的服務(wù)器(比如8G以上)來說,用靜態(tài)的 max_children 實際上更為妥當(dāng),因為這樣不需要進(jìn)行額外的進(jìn)程數(shù)目控制,會提高效率。因為頻繁開關(guān) php-fpm 進(jìn)程也會有時滯,所以內(nèi)存夠大的情況下開靜態(tài)效果會更好。數(shù)量也可以根據(jù) 總內(nèi)存/30M 得到,比如 8GB 內(nèi)存可以設(shè)置為100,那么 php-fpm 耗費的內(nèi)存就能控制在 2G-3G 的樣子。

如果內(nèi)存稍微小點,比如 1~2G,那么指定動態(tài)的進(jìn)程數(shù)量更加有利于服務(wù)器的穩(wěn)定。這樣可以保證 php-fpm 只獲取夠用的內(nèi)存,將不多的內(nèi)存分配給其他應(yīng)用去使用,會使系統(tǒng)的運行更加暢通。

對于小內(nèi)存的服務(wù)器來說,比如 256M 內(nèi)存的 vps,即使按照一個 20M 的內(nèi)存量來算,10個 php-cgi 進(jìn)程就將耗掉200M內(nèi)存,那系統(tǒng)的崩潰就應(yīng)該很正常了。

因此應(yīng)該盡量地控制 php-fpm 進(jìn)程的數(shù)量,大體明確其他應(yīng)用占用的內(nèi)存后,給它指定一個靜態(tài)的小數(shù)量,會讓系統(tǒng)更加平穩(wěn)一些。

或者使用動態(tài)方式,因為動態(tài)方式會結(jié)束掉多余的進(jìn)程,可以回收釋放一些內(nèi)存,所以推薦在內(nèi)存較少的服務(wù)器或VPS上使用,具體最大數(shù)量根據(jù) 總內(nèi)存/20M 得到。

比如說 512M 的 VPS,建議 pm.max_spare_servers 設(shè)置為 20。至于 pm.min_spare_servers,則建議根據(jù)服務(wù)器的負(fù)載情況來設(shè)置,比較合適的值在 5~10 之間。

總結(jié):內(nèi)存小的建議用動態(tài)(pm = dynamic),內(nèi)存大的建議用靜態(tài)(pm = static)。

2、pm.max_children 設(shè)置多大

這個值原則上是越大越好,php-cgi的進(jìn)程多了就會處理的很快,排隊的請求就會很少。

設(shè)置”max_children” 也需要根據(jù)服務(wù)器的性能進(jìn)行設(shè)定。

計算方式如下:

一般來說一臺服務(wù)器正常情況下每一個php-cgi所耗費的內(nèi)存在20M~30M左右,因此我的”max_children”我設(shè)置成40個,20M*40=800M也就是說在峰值的時候所有PHP-CGI所耗內(nèi)存在800M以內(nèi),低于我的有效內(nèi)存2Gb。

而如果我 的”max_children”設(shè)置的較小,比如5-10個,那么php-cgi就會“很累“,處理速度也很慢,等待的時間也較長,占用的CPU也很高。

如果長時間沒有得到處理的請求就會出現(xiàn) 504 Gateway Time-out 這個錯誤,而正在處理的很累的那幾個php-cgi如果遇到了問題就會出現(xiàn) 502 Bad gateway 這個錯誤。

max_children較好的設(shè)置方式根據(jù)req/s(吞吐率,單位時間里服務(wù)器處理的最大請求數(shù),單位req/s)來設(shè)置,若程序是 100 req/s 的處理能力,那么就設(shè)置 100比較好,這是動態(tài)來調(diào)整的。

3、request_terminate_timeout 設(shè)置多大

計算方式如下:

如果你的服務(wù)器性能足夠好,且寬帶資源足夠充足,PHP腳本沒有循環(huán)或BUG的話你可以直接將”request_terminate_timeout”設(shè) 置成0s。0s的含義是讓PHP-CGI一直執(zhí)行下去而沒有時間限制。

而如果你做不到這一點,也就是說你的PHP-CGI可能出現(xiàn)某個BUG,或者你的寬帶不夠充足或者其他的原因?qū)е履愕腜HP-CGI能夠假死那么就建議你給”request_terminate_timeout”賦一個值,這個值可以根 據(jù)你服務(wù)器的性能進(jìn)行設(shè)定。

一般來說性能越好你可以設(shè)置越高,20分鐘-30分鐘都可以。由于我的服務(wù)器PHP腳本需要長時間運行,有的可能會超過10分鐘因此我設(shè)置了900秒,這樣不會導(dǎo)致PHP-CGI死掉而出現(xiàn)502 Bad gateway這個錯誤。

二、配置 php 慢日志,用于監(jiān)控

1、開啟slow log方法

如果你使用php-fpm來管理php的話,你可以通過如下方法開啟:

首先打開 php-fpm.conf 配置文件。

vim /usr/local/php/etc/php-fpm.conf

PHP 5.3.3 之前設(shè)置如下:

<value name="request_slowlog_timeout">5s</value>
< value name="slowlog">logs/php-fpm-slowlog.log</value>

PHP 5.3.3 之后設(shè)置以下如下:

request_slowlog_timeout = 5s
slowlog = /usr/local/php/var/log/php-fpm-slowlog.log
request_terminate_timeout = 10s

說明:

  • request_slowlog_timeout 是腳本超過多長時間,就可以記錄到日志文件;
  • slowlog 是日志文件的存儲路徑;
  • request_terminate_timeout 將執(zhí)行時間太長的進(jìn)程直接終止;

2、slow log使用

開啟后,如果有腳本執(zhí)行超過指定的時間,就會在指定的日志文件中寫入類似如下的信息:

[06-Dec-2017 20:05:31]  [pool www] pid 22271
script_filename = /home/wwwroot/default/tz/tz.php
[0x00007f75e662a398] preg_match_all() /home/wwwroot/default/tz/tz.php:453
[0x00007f75e6627f08] sys_linux() /home/wwwroot/default/tz/tz.php:410

由于我把slow log日志放在 /usr/local/php/var/log/php-fpm-slowlog.log 這里,只需要查看此日志即可!

vim /usr/local/php/var/log/php-fpm-slowlog.log  

4、slow log 分析

下面是一張日志圖片,來做一個簡單的分析

說明:

  • script_filename 是入口文件;
  • session_start、session、run、start、sleep : 說明是執(zhí)行這個方法的時候超過執(zhí)行時間的。
  • 每行冒號后面的數(shù)字是行號。

開啟后,在錯誤日志文件(php-fpm.log)中也有相關(guān)記錄。如下:

[06-Dec-2017 20:59:53] NOTICE: finished trace of 31450
[06-Dec-2017 20:59:56] WARNING: [pool www] child 31437, script '/home/wwwroot/default/tz/tz.php' (request: "GET /tz/tz.php") executing too slow (1.047562 sec), logging
[06-Dec-2017 20:59:56] NOTICE: child 31437 stopped for tracing
[06-Dec-2017 20:59:56] NOTICE: about to trace 31437
[06-Dec-2017 20:59:56] NOTICE: finished trace of 31437
[06-Dec-2017 21:00:05] WARNING: [pool www] child 31448, script '/home/wwwroot/default/tz/tz.php' (request: "GET /tz/tz.php") executing too slow (1.013736 sec), logging
[06-Dec-2017 21:00:05] NOTICE: child 31448 stopped for tracing
[06-Dec-2017 21:00:05] NOTICE: about to trace 31448
[06-Dec-2017 21:00:05] NOTICE: finished trace of 31448
[06-Dec-2017 21:00:10] WARNING: [pool www] child 31481, script '/home/wwwroot/default/TTTTT_GAME/index.php' (request: "GET /TTTTT_GAME/index.php") executing too slow (1.134845 sec), logging
[06-Dec-2017 21:00:10] WARNING: [pool www] child 31478, script '/home/wwwroot/default/TTTTT_GAME/index.php' (request: "GET /TTTTT_GAME/index.php") executing too slow (1.169301 sec), logging
[06-Dec-2017 21:00:10] WARNING: [pool www] child 31475, script '/home/wwwroot/default/TTTTT_GAME/index.php' (request: "GET /TTTTT_GAME/index.php") executing too slow (1.009847 sec), logging
[06-Dec-2017 21:00:10] WARNING: [pool www] child 31468, script '/home/wwwroot/default/TTTTT_GAME/index.php' (request: "GET /TTTTT_GAME/index.php") executing too slow (1.019848 sec), logging
[06-Dec-2017 21:00:10] WARNING: [pool www] child 31455, script '/home/wwwroot/default/TTTTT_GAME/index.php' (request: "GET /TTTTT_GAME/index.php") executing too slow (1.147848 sec), logging
[06-Dec-2017 21:00:10] WARNING: [pool www] child 31451, script '/home/wwwroot/default/TTTTT_GAME/index.php' (request: "GET /TTTTT_GAME/index.php") executing too slow (1.076841 sec), logging
[06-Dec-2017 21:00:10] WARNING: [pool www] child 31447, script '/home/wwwroot/default/TTTTT_GAME/index.php' (request: "GET /TTTTT_GAME/index.php") executing too slow (1.119846 sec), logging
[06-Dec-2017 21:00:10] WARNING: [pool www] child 31443, script '/home/wwwroot/default/TTTTT_GAME/index.php' (request: "GET /TTTTT_GAME/index.php") executing too slow (1.177849 sec), logging
[06-Dec-2017 21:00:10] WARNING: [pool www] child 31436, script '/home/wwwroot/default/TTTTT_GAME/index.php' (request: "GET /TTTTT_GAME/index.php") executing too slow (1.092818 sec), logging
[06-Dec-2017 21:00:10] WARNING: [pool www] child 31433, script '/home/wwwroot/default/TTTTT_GAME/index.php' (request: "GET /TTTTT_GAME/index.php") executing too slow (1.162842 sec), logging
[06-Dec-2017 21:00:10] NOTICE: child 31433 stopped for tracing
[06-Dec-2017 21:00:10] NOTICE: about to trace 31433
[06-Dec-2017 21:00:10] ERROR: failed to ptrace(PEEKDATA) pid 31433: Input/output error (5)
[06-Dec-2017 21:00:10] NOTICE: finished trace of 31433
[06-Dec-2017 21:00:10] NOTICE: child 31436 stopped for tracing
[06-Dec-2017 21:00:10] NOTICE: about to trace 31436

三、配置 php-fpm 進(jìn)程可打開的最大文件句柄數(shù)

rlimit_files = 1024

默認(rèn)1024,此值可以不需要配置

四、php-fpm占用cpu和內(nèi)存過高100% 解決辦法

服務(wù)器php-fpm突然占用cpu和內(nèi)存過高,它的服務(wù)器配置是4核8G內(nèi)存。由于php-fpm占用cpu過高從而導(dǎo)致經(jīng)常出現(xiàn)“502 Bad gateway”。

服務(wù)器環(huán)境:LNMP一鍵安裝包,

用了“雅黑探針”來查看服務(wù)器的性能情況,結(jié)果如下:

當(dāng)然,除了用探針之外,如果你在服務(wù)器下用系統(tǒng)命令:top也是可以查看的:

1、CPU 指標(biāo)解釋

Cpu(s):  0.0%us,  0.5%sy,  0.0%ni, 99.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

  • us:用戶空間占用CPU百分比
  • sy:內(nèi)核空間占用CPU百分比
  • ni:用戶進(jìn)程空間內(nèi)改變過優(yōu)先級的進(jìn)程占用CPU百分比
  • id:空閑CPU百分比
  • wa:等待輸入輸出的CPU時間百分比
  • hi:硬件中斷
  • si:軟件中斷
  • st:實時

解決辦法如下:

多查看日志,根據(jù)日志來做解決,最后就是再查看配置文件,是否需要配置調(diào)優(yōu)?

由于有一些步驟不太好表達(dá)出來,大家請簡單的看一下邏輯吧,需要你懂很多方面的東西才能夠明白它。此文中有鏈接的地方請大家一定要看一下,否則你是不能夠明白的。

2、查看它的php-fpm.conf配置

從上面配置文件可以看出,它采用的是動態(tài),默認(rèn)的啟動進(jìn)程數(shù)是4個,最大的是6個,最小的是4個。

3、查看linux平均負(fù)載

從上面可以看出,6 個 php-fpm 進(jìn)程占用的 cpu 空間都很高,平均負(fù)載(load average)情況如下:

1分鐘平均負(fù)載:2.32;

5分鐘平均負(fù)載:2.18;

15分鐘平均負(fù)載:3.95;

可以說它現(xiàn)在的平均負(fù)載接近了它的cpu總核數(shù):4;需要考慮服務(wù)器配置升級!

4、Linux 平均負(fù)載 Load Average

1、 Load Average

系統(tǒng)負(fù)載(System Load)是系統(tǒng)CPU繁忙程度的度量,即有多少進(jìn)程在等待被CPU調(diào)度(進(jìn)程等待隊列的長度)。

平均負(fù)載(Load Average)是一段時間內(nèi)系統(tǒng)的平均負(fù)載,這個一段時間一般取1分鐘、5分鐘、15分鐘。

2、查看Load Average

top命令,w命令,uptime等命令都可以查看系統(tǒng)負(fù)載;

3、Load Average 的3個數(shù)值說明

我拿上圖中的 load average:1.97,2.14,2.99 來舉例:

  • 第一位1.97:表示最近1分鐘平均負(fù)載
  • 第二位2.14:表示最近5分鐘平均負(fù)載
  • 第三位2.99:表示最近15分鐘平均負(fù)載

4、Load Average 值的含義

1、單核處理器

(例如:1個1核cpu)

假設(shè)我們的系統(tǒng)是單CPU單內(nèi)核的,把它比喻成是一條單向馬路,把CPU任務(wù)比作汽車。

當(dāng)車不多的時候,load <1;

當(dāng)車占滿整個馬路的時候 load=1;

當(dāng)馬路都站滿了,而且馬路外還堆滿了汽車的時候,load>1;

2、多核處理器

(例如:2個cpu或一個2核的cpu)

我們經(jīng)常會發(fā)現(xiàn)服務(wù)器Load > 1但是運行仍然不錯,那是因為服務(wù)器是多核處理器(Multi-core)。

假設(shè)我們服務(wù)器一個CPU是2核,那么將意味我們擁有2條馬路,我們的Load = 2時,所有馬路都跑滿車輛。

提示:

芯片廠商往往在一個CPU內(nèi)部,包含多個CPU核心,這被稱為多核CPU。

在系統(tǒng)負(fù)荷方面,多核CPU與多個CPU效果類似,所以考慮系統(tǒng)負(fù)荷的時候,必須考慮這臺電腦有幾個CPU、每個CPU有幾個核心。然后,把系統(tǒng)負(fù)荷除以總的核心數(shù),只要每個核心的負(fù)荷不超過1.0,就表明電腦正常運行。

3、查看服務(wù)器 cpu 信息

cat /proc/cpuinfo  

4、查看服務(wù)器 cpu 總核心數(shù)

grep 'model name' /proc/cpuinfo | wc -l 
或
grep -c 'model name' /proc/cpuinfo  

5、Load Average 警惕值(單核)

Load < 0.7時:系統(tǒng)很閑,馬路上沒什么車,要考慮多部署一些服務(wù)

0.7 < Load < 1時:系統(tǒng)狀態(tài)不錯,馬路可以輕松應(yīng)對

Load == 1時:系統(tǒng)馬上要處理不多來了,趕緊找一下原因

Load > 1時:馬路已經(jīng)非常繁忙了,進(jìn)入馬路的每輛汽車都要無法很快的運行

6、Load Average 關(guān)鍵值(單核)

通常我們先看15分鐘load,如果load很高,再看1分鐘和5分鐘負(fù)載,查看是否有下降趨勢。

1分鐘負(fù)載值 > 1,那么我們不用擔(dān)心,但是如果15分鐘負(fù)載都超過1,我們要趕緊看看發(fā)生了什么事情。所以我們要根據(jù)實際情況查看這三個值。

現(xiàn)在相信大家都知道,"load average"一共返回三個平均值:1分鐘系統(tǒng)負(fù)荷、5分鐘系統(tǒng)負(fù)荷,15分鐘系統(tǒng)負(fù)荷;

如果只有1分鐘的系統(tǒng)負(fù)荷大于1.0,其他兩個時間段都小于1.0,這表明只是暫時現(xiàn)象,問題不大。

如果15分鐘內(nèi),平均系統(tǒng)負(fù)荷大于1.0(調(diào)整CPU核心數(shù)之后),表明問題持續(xù)存在,不是暫時現(xiàn)象。所以,你應(yīng)該主要觀察"15分鐘系統(tǒng)負(fù)荷",將它作為電腦正常運行的指標(biāo)。

7、結(jié)合具體情況具體分析(單核)

  • 1分鐘Load>1,5分鐘Load<1,15分鐘Load<1:短期內(nèi)繁忙,中長期空閑,初步判斷是一個“抖動”,或者是“擁塞前兆”
  • 1分鐘Load>1,5分鐘Load>1,15分鐘Load<1:短期內(nèi)繁忙,中期內(nèi)緊張,很可能是一個“擁塞的開始”
  • 1分鐘Load>1,5分鐘Load>1,15分鐘Load>1:短、中、長期都繁忙,系統(tǒng)“正在擁塞”
  • 1分鐘Load<1,5分鐘Load>1,15分鐘Load>1:短期內(nèi)空閑,中、長期繁忙,不用緊張,系統(tǒng)“擁塞正在好轉(zhuǎn)”

184 total :184個總進(jìn)程數(shù)

4 running:4個正在運行的進(jìn)程數(shù)

143 sleeping:180個睡眠的進(jìn)程數(shù)

0 stoppe:0個停止的進(jìn)程數(shù)

0 zombie:0個凍結(jié)進(jìn)程數(shù)

5、更改 php-fpm.conf 配置文件 來做調(diào)優(yōu)

由于服務(wù)器是8G內(nèi)存,按理說應(yīng)該可以啟動 200 個左右的 php-fpm 進(jìn)程,于是我修改如下:

除了以上配置測試了之外,我還把“pm = dynamic”修改成了“pm= static”配置來做測試,結(jié)果都不理想,具體結(jié)果向下看:

6、再一次查看linux平均負(fù)載

從上面配置可以看出來,每一個php-fpm雖然占用的cpu空間少了,但是總量依然還是接近100%。

而且平均負(fù)載(load average)情況如下:

1分鐘平均負(fù)載:289.73;

5分鐘平均負(fù)載:264.27;

15分鐘平均負(fù)載:179.20;

可以說它現(xiàn)在的平均負(fù)載接遠(yuǎn)遠(yuǎn)超過了總cpu核數(shù):4;必須升級服務(wù)器配置。

之所以這么高,除了它本身服務(wù)器配置跟不上之外,還有一個就是我把pm.max_spare_servers設(shè)置成了512,如果一個線程占用20M內(nèi)存,則需要512*20;而它現(xiàn)在的服務(wù)器只有8G內(nèi)存4核CPU;因此這個負(fù)載才能達(dá)到了200多。這里也算是測試的一個小失誤吧!

正常情況下,一個線程占用內(nèi)存20~30M,8G內(nèi)存設(shè)置100~200就足夠了。

184 total :678個總進(jìn)程數(shù)

4 running:211個正在運行的進(jìn)程數(shù)

143 sleeping:327個睡眠的進(jìn)程數(shù)

0 stoppe:140個停止的進(jìn)程數(shù)

0 zombie:0個凍結(jié)進(jìn)程數(shù)

總結(jié):

因為失誤測試,我再重新把配置文件修改成:“pm= static”和 "pm.max_children =100",依然cpu和內(nèi)存還是占用很高,負(fù)載非常的高,這完全是沒有道理的。

試想一下:一個 4 核 8G 內(nèi)存的服務(wù)器,居然線程設(shè)置越大,CPU占用越高(設(shè)置在內(nèi)存最大允許范圍),設(shè)置越小 CPu 占用越小,這是不正常的。最主要的是,php-fpm線程雖然小,占用cpu空間少了,但是出現(xiàn)502的次數(shù)就多了。從而更加說明了目前的服務(wù)器目前的配置支撐不了現(xiàn)有的業(yè)務(wù)。

現(xiàn)在我朋友向總部申請了8核16G內(nèi)存的服務(wù)器,申請成功后,默認(rèn)開始啟動設(shè)置的線程是100,最大線程是200;現(xiàn)在已經(jīng)恢復(fù)正常,如下圖:

從這里也可以說明,有時候出問題并不是你自己的原因,就是服務(wù)器硬件配置跟不上的原因。

分享題目:如何在Web中配置php-fpm調(diào)優(yōu)?
分享路徑:http://muchs.cn/article18/gpgpgp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計、自適應(yīng)網(wǎng)站網(wǎng)站設(shè)計微信小程序、網(wǎng)站策劃、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)