PHP-FPM 調優:爲了高性能使用 pm static

讓咱們快速瞭解如何更好的設置 PHP-FPM,以實現高吞吐量和低延遲php

默認狀況下,大多數設置都將 PHP-FPM 的 PM(進程管理器)設置爲 dynamic,而且若是遇到內存不足的問題,還須要使用 ondemandlinux

讓咱們看一下 php.net 文檔中的選項,並介紹我最喜歡的設置 - static:緩存

  • pm = dynamic: 子進程的數量根據如下配置動態設置 pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers
  • pm = ondemand: 進程在請求時按需建立,而不是動態的,其中 pm.start_servers 進程數量在服務啓動時建立
  • pm = static: 子進程的數量由 pm.max_children 決定

PHP-FPM(PM)與 CPUFreq 的類似之處

這看起來有點偏離主題,但我但願將其結合到咱們的 PHP-FPM 調優主題中bash

咱們都遇到過 CPU 緩慢的問題,不管是筆記本,虛擬機仍是服務器。 服務器

你還記得 CPU 調頻嗎?(CPUFreq),它能夠在 linux 和 Windows 上使用,能夠將 CPU 頻率設置爲 ondemand 來提升性能和系統響應能力。php-fpm

如今,咱們來比較一下這些描述並尋找類似之處:性能

  • Governor = ondemand: 按需快速動態調整 CPU 頻率, 一有 cpu 計算量的任務,就會當即達到最大頻率運行,空閒時間增長就下降頻率
  • Governor = conservative: 按需快速動態調整 CPU 頻率, 比 ondemand 的調整更保守
  • Governor = performance: 老是運行於最大頻率

有關更多詳細信息,請參閱 CPUFreq 調控器選項的完整列表測試

有沒有注意類似之處呢 ?spa

使用 pm static 來實現最高性能

pm static 設置在很大程度上取決於您的服務器有多少空閒內存。
基本上,若是你的服務器內存很低,那麼 pm ondemanddynamic 多是更好的選擇。
若是您擁有足夠的內存,則能夠設置 pm static 來避免大部分 PM 開銷。
換句話說,當您進行數學運算時,應將 pm.static 設置爲服務器可運行的最大數量的進程數,它就不會有內存不足或緩存壓力的問題.net

1509365223linux_top_php-fpm-using-static-pm

在上面的截圖中,PHP-FPM 的配置爲 pm = staticpm.max_children = 100
它有 32GB的內存,在截圖期間,Google Analytics 中約有 200 個 「活躍用戶」(過去 60 秒)。
在這個級別上,約有 70% 的 PHP-FPM 進程仍然閒置。
這意味着 PHP-FPM 設置爲服務器資源的最大容量後,它不會去在乎當前流量,空閒進程會保持聯機狀態,等待流量高峯當即響應,而沒必要等到請求來了以後再建立進程

我將 pm.max_requests 設置的很是高,由於這是一個沒有 PHP 內存泄漏的生產服務器。
若是您對當前和未來的 PHP 代碼有 110% 的信心,能夠將 pm.max_requests = 0pm static 一塊兒使用

什麼時候使用 ondemand 和 dynamic

使用 pm dynamic,您可能會出現相似於下面的錯誤:

WARNING: [pool xxxx] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 4 idle, and 59 total children

您可能會嘗試調整 pm 配置,但仍然會看到一樣的錯誤
在這種狀況下,pm.min 過低,而且由於流量和峯值波動很大,使用 pm dynamic 可能難以調整

通常的建議是使用 pm ondemand。 然而,狀況會變的更糟,由於 ondemand 會在沒有流量時關閉空閒進程,而後最終會產生與流量波動很大同樣的開銷問題 (除非您設置空閒超時的時間很是很是的長)

可是,當您擁有多個 pm 進程池時,pm dynamic, 特別是 ondemand 是能夠爲您節省時間的

結論

當流量波動比較大的時候,,PHP-FPM 的 ondemanddynamic 會由於固有開銷而限制吞吐量。 您須要瞭解您的系統並設置 PHP-FPM 進程數,以匹配服務器的最大容量。
pm.max_children 開始,根據 pm dynamicondemand 的最大使用狀況去設置

您會注意到,在 pm static 模式下,由於您將全部內容都保存在內存中,因此隨着時間的推移,流量峯值會對 CPU 形成比較小的峯值,而且您的服務器負載和 CPU 平均值將變得更加平滑。 每一個須要手動調整的 PHP-FPM 進程數的平均大小會有所不一樣

附上一張 A/B 測試圖
1509365219php-fpm-pm-bench

最後但願這是一篇有用的文章 😁

本文由 Enda 翻譯至 PHP-FPM tuning: Using ‘pm static’ for Max Performance
其中有一些本身的見解在裏面,若是有錯誤歡迎糾正~ 謝謝

歡迎關注個人博客和專欄,不按期更新好文章
博客地址:https://www.phpyc.com/

相關文章
相關標籤/搜索