php-fpm優化

一.php-fpm 進程設置php

php-fpm進程池開啓進程有兩種方式,一種是static,直接開啓指定數量的php-fpm進程,再也不增長或者減小;
另外一種則是dynamic,開始時開啓必定數量的php-fpm進程,當請求量變大時,動態的增長php-fpm進程數到上限,當空閒時自動釋放空閒的進程數到一個下限。html

動態適合小內存機器,靈活分配進程,省內存。靜態適用於大內存機器,動態建立回收進程對服務器資源也是一種消耗linux

 

幾個參數設置:數據庫

pm = dynamic //pm參數指定了進程管理方式,有兩種可供選擇:static或dynamic,從字面意思不難理解,爲靜態或動態方式 pm.max_children = 100 //static模式下建立的子進程數或dynamic模式下同一時刻容許最大的php-fpm子進程數量,pm.max_spare_servers的值只能小於等於pm.max_children pm.start_servers = 3 //動態方式下的起始php-fpm進程數量 pm.min_spare_servers = 1 //動態方式下服務器空閒時最小php-fpm進程數量 pm.max_spare_servers = 5 //動態方式下服務器空閒時最大php-fpm進程數量

 

參數設置建議:通常php-fpm進程佔用20~30m左右的內存就按30m算。若是單獨跑php-fpm,動態方式起始值可設置物理內存Mem/30M,因爲你們通常Nginx、MySQL都在一臺機器上,因而預留一半給它們,即php-fpm進程數爲$Mem/2/30。服務器

 

二.超時時間設置 max_execution_time(php.ini) 與 request_terminate_timeout(php-fpm)函數

 php腳本超時時間能夠在php.ini的max_execution_time和fpm.conf的request_terminate_timeout參數兩處進行設置.那麼這二者有什麼區別呢?php-fpm

當咱們設置php.ini的max_execution_time參數後,zend引擎處理腳本時,其內部會根據設定的時間定義一個定時器(setitimer),這是linux的API。spa

而fpm.confrequest_terminate_timeout的檢測是經過主進程遍歷定時事件fpm_pctl_heartbeat來判斷PHP腳本執行是否超時。

.net

php.ini中的max_execution_time:

 

這個值限定了腳本的最大執行時間(單位是秒) 日誌

set_time_limit()函數和配置指令max_execution_time隻影響腳本自己執行的時間。任何發生在諸如使用system()的系統調用,流操做,數據庫操做等的腳本執行的最大時間不包括其中,當該腳本已運行。在測量時間是實值的Windows中,狀況就不是如此了。

php-fpm.conf中的request_terminate_timeout

 

 

設置單個請求的超時停止時間。該選項可能會對 php.ini 設置中的 max_execution_time 由於某些特殊緣由沒有停止運行的腳本有用。設置爲 ‘0’ 表示 ‘Off’。可用單位:s(秒),m(分),h(小時)或者 d(天)。默認單位:s(秒)。默認值:0(關閉)。

經過上面兩個說明及實驗驗證得出結論,max_execution_time=1,不必定1s後就會停止腳本,多是2s、3s甚至更長的時間;而request_terminate_timeout=4則就會在4s後停止腳本的執行。因此在配置超時時間的時候,最好兩個都配置,max_execution_time時間短一點,而request_terminate_timeout時間長一點

 

三.開啓慢日誌

開啓慢日誌的目的是爲了跟蹤分析那條php腳本執行的時間超過了設置的request_slowlog_timeout時長,若是超過這個設置時間,那麼該腳本就會被記錄下

 

slowlog = log/$pool.log.slow

request_slowlog_timeout = 2

 開啓php-fpm的慢日誌,時間閥值2秒;

 

四.php-fpm啓動、重啓、終止

 

PHP5.3.3後的php-fpm 再也不支持php-fpm 之前具備的 /usr/local/php/sbin/php-fpm(start|stop|reload)等命令,須要使用信號控制:

 

master進程能夠理解如下信號

INT, TERM 馬上終止
;

QUIT 平滑終止
;

USR1 從新打開日誌文件
;

USR2平滑重載全部worker進程並從新載入配置和二進制模塊 ;

 

 

先查看php-fpm的master進程號

ps aux|grep php-fpm

重啓php-fpm:

# kill -USR2 1392

上面方案通常是沒有生成php-fpm.pid文件時使用,若是要生成php-fpm.pid,使用下面這種方案:

上面master進程能夠看到,matster使用的是/usr/local/php/etc/php-fpm.conf這個配置文件,cat /usr/local/php/etc/php-fpm.conf 發現:

[global]
; Pid file
; Note: the default prefix is /usr/local/php/var
; Default Value: none
;pid = run/php-fpm.pid

 

pid文件路徑應該位於/usr/local/php/var/run/php-fpm.pid,因爲註釋掉,因此沒有生成,咱們把註釋去除,再kill -USR2 42891 重啓php-fpm,便會生成pid文件,下次就能夠使用如下命令重啓,關閉php-fpm了:

php-fpm 關閉:
kill -INT 'cat /usr/local/php/var/run/php-fpm.pid'
php-fpm 重啓:
kill -USR2 'cat /usr/local/php/var/run/php-fpm.pid'

 

 

參考:

https://www.zybuluo.com/phper/note/89081

http://blog.itpub.net/14184018/viewspace-1797411/

https://www.cnblogs.com/kenshinobiy/p/7470635.html

https://blog.csdn.net/wzx19840423/article/details/79071928

https://blog.csdn.net/mijar2016/article/details/53709777

相關文章
相關標籤/搜索