配置檔案:php-fpm.conf
開啟慢日誌功能的:
slowlog = /usr/local/var/log/php-fpm.log.slow
request_slowlog_timeout = 5s
當某個請求的時間超過了5秒,就會在慢日誌中記錄相應的記錄,注意上面的時間5s,不能忽略了單位,相應的還有其他單位,m分,h時
php-fpm慢日誌會記錄下程序號,指令碼名稱,具體哪個檔案哪行**的哪個函式執行時間過長:
[21-nov-2016 10:30:38] [pool www] pid 11877script_filename = /var/www/ceshi/c.php
[0xb70fb88c] sleep() /var/www/ceshi/c.php:2
通過日誌,我們就可以知道第2行的sleep 函式有點問題,這樣我們就能追蹤問題了。
pm = static
靜態,始終保持乙個固定數量的子程序,這個數由(pm.max_children)定義,這種方式很不靈活,也通常不是預設的。
pm = dynamic
動態,在更老一些的版本中,dynamic被稱作apache-like。子程序的數量在下面配置的基礎上動態設定:pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers。
啟動時,會產生固定數量的子程序(由pm.start_servers
控制)可以理解成最小子程序數,而最大子程序數則由pm.max_children
去控制,ok,這樣的話,子程序數會在最大和最小數範圍中變化,還沒有完,閒置的子程序數還可以由另2個配置控制,分別是pm.min_spare_servers
和pm.max_spare_servers
,也就是閒置的子程序也可以有最小和最大的數目,而如果閒置的子程序超出了pm.max_spare_servers
,則會被殺掉。
可以看到,pm = dynamic
模式非常靈活,也通常是預設的選項。但是,dynamic
模式為了最大化地優化伺服器響應,會造成更多記憶體使用,因為這種模式只會殺掉超出最大閒置程序數(pm.max_spare_servers
)的閒置程序,比如最大閒置程序數是30,最大程序數是50,然後**經歷了一次訪問高峰,此時50個程序全部忙碌,0個閒置程序數,接著過了高峰期,可能沒有乙個請求,於是會有50個閒置程序,但是此時php-fpm
只會殺掉20個子程序,始終剩下30個程序繼續作為閒置程序來等待請求,這可能就是為什麼過了高峰期後即便請求數大量減少伺服器記憶體使用卻也沒有大量減少,也可能是為什麼有些時候重啟下伺服器情況就會好很多,因為重啟後,php-fpm
的子程序數會變成最小閒置程序數,而不是之前的最大閒置程序數。
pm = ondemand
程序在有需求時才產生,與 dynamic 相反,pm.start_servers 在服務啟動時即啟動。
這種模式把記憶體放在第一位,他的工作模式很簡單,每個閒置程序,在持續閒置了pm.process_idle_timeout
秒後就會被殺掉,有了這個模式,到了伺服器低峰期記憶體自然會降下來,如果伺服器長時間沒有請求,就只會有乙個php-fpm
主程序,當然弊端是,遇到高峰期或者如果pm.process_idle_timeout
的值太短的話,無法避免伺服器頻繁建立程序的問題,因此pm = dynamic
和pm = ondemand
誰更適合視實際情況而定。
涉及到的引數:
如果pm設定為static,那麼其實只有pm.max_children這個引數生效。系統會開啟設定的數量個php-fpm程序。
如果pm設定為dynamic。系統會在php-fpm執行開始的時候啟動 pm.start_servers個php-fpm程序,然後根據系統的需求動態在pm.min_spare_servers和 pm.max_spare_servers之間調整php-fpm程序數。
引數說明:
pm.max_children int
pm 設定為 static 時表示建立的子程序的數量,pm 設定為 dynamic 時表示最大可建立的子程序的數量。必須設定。
該選項設定可以同時提供服務的請求數限制。類似 apache 的 mpm_prefork 中 maxclients 的設定和 普通php fastcgi中的 php_fcgi_children 環境變數。
pm.start_servers int
設定啟動時建立的子程序數目。僅在 pm 設定為 dynamic 時使用。預設值:min_spare_servers + (max_spare_servers - min_spare_servers) / 2。
pm.min_spare_servers int
設定空閒服務程序的最低數目。僅在 pm 設定為 dynamic 時使用。必須設定。
pm.max_spare_servers int
設定空閒服務程序的最大數目。僅在 pm 設定為 dynamic 時使用。必須設定。
pm.max_requests int
設定每個子程序重生之前服務的請求數。對於可能存在記憶體洩漏的第三方模組來說是非常有用的。如果設定為 '0' 則一直接受請求,等同於 php_fcgi_max_requests 環境變數。預設值:0。
那麼,對於我們的伺服器,選擇哪種執行方式比較好呢?事實上,跟apache一樣,我們執行的php程式在執行完成後,或多或少會有記憶體洩露的問題。這也是為什麼開始的時候乙個php-fpm程序只占用3m左右記憶體,執行一段時間後就會上公升到20-30m的原因了。所以,動態方式因為會結束掉多餘 的程序,可以**釋放一些記憶體,所以推薦在記憶體較少的伺服器或者vps上使用。具體最大數量根據 記憶體/20m 得到。比如說512m的vps,建議pm.max_spare_servers設定為20。至於pm.min_spare_servers,則建議根據伺服器的負載情況來設定,比較合適的值在5~10之間。
然後對於比較大記憶體的伺服器來說,設定為靜態的話會提高效率。因為頻繁開關php-fpm程序也會有時滯,所以記憶體夠大的情況下開靜態效果會更好。數量也可以根據 記憶體/30m 得到。比如說2gb記憶體的伺服器,可以設定為50;4gb記憶體可以設定為100等。
php fpm 程序管理的三種模式
php fpm程序管理一共有三種模式 ondemand static dynamic ondemand 在php fpm啟動的時候,不會給這個pool啟動任何乙個worker,是按需啟動,當有連線過來才會啟動。優缺點優點 按流量需求建立,不浪費系統資源 在硬體如此便宜的時代,這個優點略顯雞肋 缺點 ...
php fpm程序管理的三種模式
自 php fpm解讀 程序管理的三種模式 程式媛大麗 標明 以示尊重 感謝原作者的分享。php fpm程序管理一共有三種模式 ondemand static dynamic,我們可以在同乙個fpm的master配置三種模式,看下圖1。php fpm的工作模式和nginx類似,都是乙個master,...
三種工廠模式
本文介紹設計模式中的工廠模式。工廠模式,顧名思義,就是本來我們需要某樣東西,需要自己造,可有了工廠呢?我需要該東西時,只需告訴工廠,工廠就會生產該東西,一定程度上,把使用者和生產者分開了。解耦了。追本溯源,假設我們現在有乙個類a,類a裡需要類b的乙個物件,一般的處理是這樣,b b new b 但這樣...