php-fpm參數調優

關於php-fpm.conf參數調優,只對重要的參數進程調優.其它可參數前輩的.php

http://php.net/manual/zh/install.fpm.configuration.php (官方的)html

http://www.cnblogs.com/argb/p/3604340.htmlnginx

http://www.cnblogs.com/jonsea/p/5522018.html數據庫

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

http://blog.64mazi.com/299/(推薦閱讀)bash

關於emergency_restart_threshold 和emergency_restart_interval 參數,設置多少合適
額定內存爲4G,拿出一半內存作php使用,即2G,每一個php-fpm進程30m(經驗值)
則2g最多能夠承受2048/30~=68即設置爲
emergency_restart_threshold=60(60個進程數)
emergency_restart_interval=60s(60秒內出現60個進程則優雅的重進php-fpm服務)
pm表示使用那種方式,有兩個值能夠選擇,就是static(靜態)或者dynamic(動態)。在更老一些的版本中,dynamic被稱做apache-like。這個要注意看配置文件的說明。

下面4個參數的意思分別爲:

pm.max_children:靜態方式下開啓的php-fpm進程數量。
pm.start_servers:動態方式下的起始php-fpm進程數量。
pm.min_spare_servers:動態方式下的最小php-fpm進程數量。
pm.max_spare_servers:動態方式下的最大php-fpm進程數量。

若是dm設置爲static,那麼其實只有pm.max_children這個參數生效。系統會開啓設置數量的php-fpm進程。

若是dm設置爲dynamic,那麼pm.max_children參數失效,
後面3個參數生效。
系統會在php-fpm運行開始的時候啓動pm.start_servers個php-fpm進程,
而後根據系統的需求動態在pm.min_spare_servers和pm.max_spare_servers之間調整php-fpm進程數。

公式:

假定一個php-fpm進程爲30m計算,若4g內存,拿出一半作的php-fpm使用即2g
$mem=2048
pm = dynamic
pm.max_children = 100 ($mem/20)
pm.start_servers = 75 ($mem/30)min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.min_spare_servers = 50 ($mem/40)
pm.max_spare_servers = 50 ($mem/20)服務器

pm.max_children = 50 是最大可建立的子進程的數量。必須設置。這裏表示最多隻能50個子進程。併發

pm.start_servers = 20 隨着php-fpm一塊兒啓動時建立的子進程數目。默認值:min_spare_servers + (max_spare_servers - min_spare_servers) / 2。這裏表示,一塊兒啓動會有20個子進程。socket

pm.min_spare_servers = 10 
設置服務器空閒時最小php-fpm進程數量。必須設置。若是空閒的時候,會檢查若是少於10個,就會啓動幾個來補上。tcp

pm.max_spare_servers = 30 
設置服務器空閒時最大php-fpm進程數量。必須設置。若是空閒時,會檢查進程數,多於30個了,就會關閉幾個,達到30個的狀態。


實際上的內存消耗是max_children*max_requests*每一個請求使用內存
其它php優化
儘可能少安裝PHP模塊,最簡單是最好(快)的
socket鏈接FastCGI,/dev/shm是內存文件系統,socket放在內存中確定會快些
cat >> /etc/security/limits.conf <<EOF
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
EOF
增長 PHP-FPM 打開文件描述符的限制:
# vi $php_install_dir/etc/php-fpm.conf
rlimit_files = 51200

 如下摘自(麻子來了)http://blog.64mazi.com/299/

1、經常使用參數解釋:


1)pm = dynamic #對於專用服務器,pm能夠設置爲static。
#如何控制子進程,選項有static和dynamic。
若是選擇static,則由pm.max_children指定固定的子進程數。
若是選擇dynamic,則由pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers 參數決定.
2)pm.max_children 在同一時間最大的進程數 pm.max_children = 120 3)pm.start_servers php-fpm啓動時開啓的等待請求到來的進程數,默認值爲:min_spare_servers + (max_spare_servers - min_spare_servers) / 2 pm.start_servers = 80 4)pm.min_spare_servers 在空閒狀態下,運行的最小進程數,若是小於此值,會建立新的進程 pm.min_spare_servers = 60 5)pm.max_spare_servers 在空閒狀態下,運行的最大進程數,若是大於此值,會kill部分進程 pm.max_spare_servers = 120 6)pm.process_idle_timeout 空閒多少秒以後進程會被kill,默認爲10s pm.process_idle_timeout = 10s 7)pm.max_requests 每一個進程處理多少個請求以後自動終止,能夠有效防止內存溢出,若是爲0則不會自動終止,默認爲0#設置每一個子進程重生以前服務的請求數. 對於可能存在內存泄漏的第三方模塊來講是很是有用的.
若是設置爲 '0' 則一直接受請求. 等同於 PHP_FCGI_MAX_REQUESTS 環境變量. 默認值: 0. pm.max_requests = 500 8)pm.status_path 註冊的URI,以展現php-fpm狀態的統計信息 pm.status_path = /status 其中統計頁面信息有: pool 進程池名稱 process manager 進程管理器名稱(static, dynamic or ondemand) start time php-fpm啓動時間 start since php-fpm啓動的總秒數 accepted conn 當前進程池接收的請求數 listen queue 等待隊列的請求數 max listen queue 自啓動以來等待隊列中最大的請求數 listen queue len 等待鏈接socket隊列大小 idle processes 當前空閒的進程數 active processes 活動的進程數 total processes 總共的進程數(idle+active) max active processes 自啓動以來活動的進程數最大值 max children reached 達到最大進程數的次數 9)ping.path ping url,能夠用來測試php-fpm是否存活並能夠響應 ping.path = /ping 10)ping.response ping url的響應正文返回爲 HTTP 200 的 text/plain 格式文本. 默認值: pong. ping.response = pong 11)pid = run/php-fpm.pid #pid設置,默認在安裝目錄中的var/run/php-fpm.pid,建議開啓 12)error_log = log/php-fpm.log #錯誤日誌,默認在安裝目錄中的var/log/php-fpm.log 13)log_level = notice #錯誤級別. 可用級別爲: alert(必須當即處理), error(錯誤狀況), warning(警告狀況), notice(通常重要信息), debug(調試信息). 默認: notice. 14)emergency_restart_threshold = 60 emergency_restart_interval = 60s #表示在emergency_restart_interval所設值內出現SIGSEGV或者SIGBUS錯誤的php-cgi進程數若是超過 emergency_restart_threshold個,php-fpm就會優雅重啓。這兩個選項通常保持默認值。 15)process_control_timeout = 0 #設置子進程接受主進程複用信號的超時時間. 可用單位: s(秒), m(分), h(小時), 或者 d(天) 默認單位: s(秒). 默認值: 0. 16)daemonize = yes #後臺執行fpm,默認值爲yes,若是爲了調試能夠改成no。在FPM中,可使用不一樣的設置來運行多個進程池。 這些設置能夠針對每一個進程池單獨設置。 17)listen = 127.0.0.1:9000 #fpm監聽端口,即nginx中php處理的地址,通常默認值便可。可用格式爲: 'ip:port', 'port', '/path/to/unix/socket'. 每一個進程池都須要設置. 18)listen.backlog = -1 #backlog數,-1表示無限制,由操做系統決定,此行註釋掉就行。 19)listen.allowed_clients = 127.0.0.1 #容許訪問FastCGI進程的IP,設置any爲不限制IP,若是要設置其餘主機的nginx也能訪問這臺FPM進程,listen處要設置成本地可被訪問的IP。
默認值是any。每一個地址是用逗號分隔. 若是沒有設置或者爲空,則容許任何服務器請求鏈接 20)#unix socket設置選項,若是使用tcp方式訪問,這裏註釋便可。
listen.owner = www
listen.group = www
listen.mode = 0666
#啓動進程的賬戶和組
user = www
group = www
21)request_terminate_timeout = 0 #設置單個請求的超時停止時間. 
該選項可能會對php.ini設置中的'max_execution_time'由於某些特殊緣由沒有停止運行的腳本有用. 設置爲 '0' 表示 'Off'.當常常出現502錯誤時能夠嘗試更改此選項。

22)request_slowlog_timeout = 10s #當一個請求該設置的超時時間後,就會將對應的PHP調用堆棧信息完整寫入到慢日誌中. 設置爲 '0' 表示 'Off'

23)slowlog = log/$pool.log.slow #慢請求的記錄日誌,配合request_slowlog_timeout使用

24)rlimit_files = 1024 #設置文件打開描述符的rlimit限制. 默認值: 系統定義值默承認打開句柄是1024,可以使用 ulimit -n查看,ulimit -n 2048修改。

25)rlimit_core = 0 #設置核心rlimit最大限制值. 可用值: 'unlimited' 、0或者正整數. 默認值: 系統定義值.

26)chroot = #啓動時的Chroot目錄. 所定義的目錄須要是絕對路徑. 若是沒有設置, 則chroot不被使用.

27)chdir = #設置啓動目錄,啓動時會自動Chdir到該目錄. 所定義的目錄須要是絕對路徑. 默認值: 當前目錄,或者/目錄(chroot時)

28)catch_workers_output = yes #重定向運行過程當中的stdout和stderr到主要的錯誤日誌文件中.
若是沒有設置, stdout 和 stderr 將會根據FastCGI的規則被重定向到 /dev/null .
默認值: 空.

2、php對子進程的三種管理方式
static: 表示在php-fpm運行時直接fork pm.max_chindren個子進程 dynamic: 表示,運行時forkpm.start_servers個進程,隨着負載的狀況,動態的調整,最多不超過pm.max_children個進程。同時,保證閒置進程數很多於pm.min_spare_servers數量,不然新的進程會被建立,固然也不是無限制的建立,最多閒置進程不超過pm.max_spare_servers數量,超過則一些閒置進程被清理。 ondemand: 當有請求時,建立進程,啓動不建立,最多不超過pm.max_chindren進程數,當進程閒置會在pm.process_idle_timeout秒後被及時釋放。

 

3、重要參數的理解與設置

 

【重要一】 request_terminate_timeout = 120 #表示等待120秒後,結束那些沒有自動結束的php腳本,以釋放佔用的資源。 PHP運行在php-fpm模式下,php.ini配置的max_execute_time是無效的,
須要在php-fpm.conf中配置另一個配置項:request_terminate_timeout;如下是官方文檔的說明: set_time_limit()和max_execution_time隻影響腳本自己執行的時間。
(這兩個參數在php.ini中)任何發生在諸如使用system()的系統調用,流操做,數據庫操做等的腳本執行的最大時間不包括其中. 還能夠是如下狀況:
參考:http://zyan.cc/tags/request_terminate_timeout/1/
  1. $ctx = stream_context_create(array(  
  2.    'http' => array(  
  3.        'timeout' => 1 //設置一個超時時間,單位爲秒  
  4.        )  
  5.    )  
  6. );  
  7. file_get_contents("http://example.com/", 0, $ctx);  //設置超時時間
 下面4個參數的意思分別爲: pm.max_children:靜態方式下開啓的php-fpm進程數量。 pm.start_servers:動態方式下的起始php-fpm進程數量。 pm.min_spare_servers:動態方式下的最小php-fpm進程數量。 pm.max_spare_servers:動態方式下的最大php-fpm進程數量。 若是dm設置爲static,那麼其實只有pm.max_children這個參數生效。系統會開啓設置數量的php-fpm進程。 若是dm設置爲 dynamic,那麼pm.max_children參數失效,後面3個參數生效。 系統會在php-fpm運行開始 的時候啓動pm.start_serversphp-fpm進程,
而後根據系統的需求動態在pm.min_spare_servers pm.max_spare_servers之間調整php-fpm進程數。 好比說512MVPS,建議pm.max_spare_servers設置爲20。至於pm.min_spare_servers,則建議根據服 務器的負載狀況來設置,比較合適的值在5~10之間。 pm = dynamic模式很是靈活,也一般是默認的選項。
可是,dynamic模式爲了最大化地優化服務器響應,會形成更多內存使用,由於這種模式只會殺掉超出最大閒置進程數(pm.max_spare_servers)的閒置進程, 好比最大閒置進程數是30,而後網站經歷了一次訪問高峯,高峯期時共動態開啓了50個進程所有忙碌,0個閒置進程數,
接着過了高峯期,可能沒有一個請求,因而會有50個閒置進程,可是此時php-fpm只會殺掉20子進程,
始終剩下30個進程繼續做爲閒置進程來等待請求,這可能就是爲何過了高峯期後即使請求數大量減小服務器內存使用卻也沒有大量減小,
也多是爲何有些時候重啓下服務器狀況就會好不少,由於重啓後,php-fpm的子進程數會變成最小閒置進程數,而不是以前的最大閒置進程數。 第三種就是文章中提到的pm = ondemand模式,這種模式和pm = dynamic相反,把內存放在第一位,
他的工做模式很簡單,每一個閒置進程,在持續閒置了pm.process_idle_timeout秒後就會被殺掉,有了這個模式,
到了服務器低峯期內存天然會降下來,若是服務器長時間沒有請求,就只會有一個php-fpm主進程,固然弊端是, 遇到高峯期或者若是pm.process_idle_timeout的值過短的話,沒法避免服務器頻繁建立進程的問題,所以pm = dynamicpm = ondemand誰更適合視實際狀況而定。 【重要二】 pm.max_requests = 500 設置每一個子進程重生以前服務的請求數. 對於可能存在內存泄漏的第三方模塊來講是很是有用的. 若是設置爲 0 則一直接受請求.
等同於 PHP_FCGI_MAX_REQUESTS 環境變量. 默認值: 0.這段配置的意思是,當一個 PHP-CGI 進程處理的請求數累積到 500 個後,自動重啓該進程。 可是爲何要重啓進程呢? 通常在項目中,咱們多多少少都會用到一些 PHP 的第三方庫,這些第三方庫常常存在內存泄漏問題,若是不按期重啓 PHP-CGI 進程,勢必形成內存使用量不斷增加。
所以 PHP-FPM 做爲 PHP-CGI 的管理器,提供了這麼一項監控功能,對請求達到指定次數的 PHP-CGI 程進行重啓,保證內存使用量不增加。 【一些問題及網上解決辦法】 正是由於這個機制,在高併發的站點中,常常致使 502 錯誤,我猜想緣由是 PHP-FPM 對從 NGINX 過來的請求隊列沒處理好。
不過我目前用的仍是 PHP 5.3.2,不知道在 PHP 5.3.3 中是否還存在這個問題。 目前咱們的解決方法是,把這個值儘可能設置大些,儘量減小 PHP-CGI 從新 SPAWN 的次數,同時也能提升整體性能。
在咱們本身實際的生產環境中發現,內存泄漏並不明顯,所以咱們將這個值設置得很是大(204800)。你們要根據本身的實際狀況設置這個值,不能盲目 地加大。
相關文章
相關標籤/搜索