生產環境 Apache 和 php 配置優化(二)

前言

    關於 Apache + PHP 從 php_mod 切換至 php-fpm 在前面的博客中已經詳細描述了,這裏就不在重複了,傳送門:https://my.oschina.net/u/2470065/blog/712617php

 

php-fpm

    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個參數的意思分別爲:

  1. pm.max_children:靜態方式下開啓的php-fpm進程數量,在動態方式下他限定php-fpm的最大進程數(這裏要注意pm.max_spare_servers的值只能小於等於pm.max_children)
  2. pm.start_servers:動態方式下的起始php-fpm進程數量。
  3. pm.min_spare_servers:動態方式空閒狀態下的最小php-fpm進程數量。
  4. pm.max_spare_servers:動態方式空閒狀態下的最大php-fpm進程數量。

    若是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
相關文章
相關標籤/搜索