關於 Apache + PHP 從 php_mod 切換至 php-fpm 在前面的博客中已經詳細描述了,這裏就不在重複了,傳送門:https://my.oschina.net/u/2470065/blog/712617php
FPM(FastCGI 進程管理器)用於替換 PHP FastCGI 的大部分附加功能,對於高負載網站是很是有用的。緩存
它的功能包括:bash
支持平滑中止/啓動的高級進程管理功能;服務器
能夠工做於不一樣的 uid/gid/chroot 環境下,並監聽不一樣的端口和使用不一樣的 php.ini 配置文件(可取代 safe_mode 的設置);php-fpm
stdout 和 stderr 日誌記錄;工具
在發生意外狀況的時候可以從新啓動並緩存被破壞的 opcode;優化
文件上傳優化支持;網站
"慢日誌" - 記錄腳本(不只記錄文件名,還記錄 PHP backtrace 信息,可使用 ptrace或者相似工具讀取和分析遠程進程的運行數據)運行所致使的異常緩慢;ui
fastcgi_finish_request() - 特殊功能:用於在請求完成和刷新數據後,繼續在後臺執行耗時的工做(錄入視頻轉換、統計處理等);spa
動態/靜態子進程產生;
基本 SAPI 運行狀態信息(相似Apache的 mod_status);
基於 php.ini 的配置文件。
php-fpm優化方法
php-fpm存在兩種方式,一種是直接開啓指定數量的php-fpm進程,再也不增長或者減小;
另外一種則是開始時開啓必定數量的php-fpm進程,當請求量變大時,動態的增長php-fpm進程數到上限,當空閒時自動釋放空閒的進程數到一個下限。
這兩種不一樣的執行方式,能夠根據服務器的實際需求來進行調整。
要用到的一些參數,分別是pm、pm.max_children、pm.start_servers、pm.min_spare_servers和 pm.max_spare_servers。
pm表示使用那種方式,有兩個值能夠選擇,就是static(靜態)或者dynamic(動態)。
下面4個參數的意思分別爲:
若是dm設置爲static,那麼其實只有pm.max_children這個參數生效。系統會開啓設置的數量個php-fpm進程。
若是dm設置爲dynamic,4個參數都生效。系統會在php-fpm運行開始時啓動pm.start_servers個php-fpm進程,而後根據系統的需求動態在pm.min_spare_servers和pm.max_spare_servers之間調整php-fpm進程數。
那麼,對於服務器,選擇哪一種執行方式比較好呢?事實上,跟Apache同樣,運行的PHP程序在執行完成後,或多或少會有內存泄露的問題。這也是爲何開始時一個php-fpm進程只佔用3M左右內存,運行一段時間後就會上升到20-30M的緣由了。(www. 腳本學堂)
因此,動態方式由於會結束掉多餘的進程,能夠回收釋放一些內存,因此推薦在內存較少的服務器或者VPS上使用。具體最大數量根據 內存/20M 獲得。
好比說512M的VPS,建議pm.max_spare_servers設置爲20(512*0.8/20)。至於pm.min_spare_servers,則建議根據服務器的負載狀況來設置,比較合適的值在5~10之間。
而後對於比較大內存的服務器來講,設置爲靜態的話會提升效率。
由於頻繁開關php-fpm進程也會有時滯,因此內存夠大的狀況下開靜態效果會更好。數量也能夠根據 內存/30M 獲得。
好比說2GB內存的服務器,能夠設置爲50;4GB內存能夠設置爲100等。
在實際壓測發現,每一個 php-fpm 大約須要使用 20M-40M 的內存,在空閒時大概有 7M 左右:
[root@iZ23s96w2paZ ~]# ps -ylC php-fpm --sort:rss | awk '{sum+=$8; ++n} END {print "Tot="sum"("n")";print "Avg="sum"/"n"="sum/n/1024"MB"}' Tot=741932(104) Avg=741932/104=6.96676MB
那麼 分配 10/16G 的內存給 PHP 使用, 因爲業務邏輯大都放在 PHP 層,php-fpm.conf 文件配置以下:
pm.start_servers=100 pm.min_spare_servers=100 pm.max_spare_servers=200 pm.max_children=500 //每一個children估計佔用20M內存, 10G合計500 pm.max_requests=500