php-fpm 效能優化

在這個時代裡面最不缺的就是資源,連家用 Server 運算記憶體等等都是非常足夠,但為求穩定或是方便網站空間可能是租用,例如: GCP、AWS 等等

在這間空間內每個資源都是錢,包含運算、記憶體都是對小站台非常消耗銀彈,尤其是服務已經把記憶體吃滿後就無法在利用 yum 安裝其他程式,需要極度精簡化

以下調整皆針對系統資源非常缺乏做出發點思考

測試環境

  • CentOS 7
  • Nginx 1.12.1
  • php 7.3

解決辦法

調整 php-fpm 參數,預設路徑 /etc/php-fpm.d/www.conf

1)pm = dynamic

設定 static:專用的Server
設定 dynamic :非專用或記憶體少的設備,動態調整php-fpm線程多寡。
設定 ondemand:有需要時會開啟php-fpm,當超過pm.process_idle_timeout時間後會自動關閉,適合在記憶體極少可用部分小於200 MB 流量不多,每天少於500人次以下使用此設定。

控制子線程多寡,static固定數量由pm.max_children值控制,dynamic 動態控制由pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers四個參數決定,保持指定子線程動態調整,ondemand有使用才開,平常只保持主線程,最大數量由pm.max_children值控制。

2)pm.max_children

同一時間內最多線程數,不管是在 static、dynamic、ondemand模式下都適用。
例如GCP最小型號 f1-micro,總共0.6GB 記憶體扣除系統基礎開銷300 MB 後,300/30=10社就是能設定的最大值。

建議設定數值=可用記憶體量/30(請注意!!非設備的記憶體大小)

3)pm.start_servers

當php-fpm啟動後等待請求的線程數,預設值是:min_spare_servers + (max_spare_servers – min_spare_servers) / 2,可指定其他值

4)pm.min_spare_servers

空閒狀態下,運行最小數量,小於此值會自動開啟新的線程,在測試下每秒有100人訪問設定1,根據自己的流量及環境設定,但最小設定1。

5)pm.max_spare_servers

空閒狀態下,運行最大數量,平時常駐數字不會大於此設定,但同時有高峰訪問會自動開啟新的線程,最大不會超過pm.max_children 數值,當線程空閒下來後大於max_spare_servers數值的會自動關閉。

這也是小編server 因為高峰過後,server 一樣保持在pm.max_spare_servers 不會往下調整,記憶體越吃越多,重開以後就好改善的主因。

建議數值=可用記憶體量/60(請注意!!非設備的記憶體大小)

6)pm.process_idle_timeout

當子線程空閒多少秒後會被刪除,默認為10s,此值只有在dynamic、ondemand 兩個狀態會使用,dynamic會刪除直到數量到等於max_spare_servers,ondemand會刪除所有線程到只剩下主線程。
pm.process_idle_timeout = 10s

7)pm.max_requests

每個子程序在接受多少請求後自動重啟,可有效防止記憶體溢出,預設值等於0,如果等於0不會自動終止。

網路上部份設置較大52100、102400之類的,建議可以抓在1000左右,基礎服務量提高應先調整線程數為主要重點,雖然重啟會消耗資源跟風險比起來安全更重要。

如果是瞬間流量就是要調整此數值來對應,數字越大瞬間能接受的高峰量越高,調整線程數是每秒一次,超過一秒仍有需求後會另開新線程來輔助。

pm.max_requests = 1000

參考來源

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *