PHP-FPM子進程數量應該如何設置?

首先,咱們關注下 PHP-FPM 的運行方式:php

static :表示在 `php-fpm` 運行時直接 `fork` 出 `pm.max_chindren` 個子進程,

dynamic:表示,運行時 `fork` 出 `start_servers` 個進程,隨着負載的狀況,動態的調整,最多不超過 `max_children` 個進程。

通常推薦用 static併發

  • 優勢是不用動態的判斷負載狀況,提高性能;php-fpm

  • 缺點是多佔用些系統內存資源。性能

PHP-FPM 子進程數量,是否是越多越好?code

固然不是,pm.max_chindren,進程多了,增長進程管理的開銷以及上下文切換的開銷。server

更核心的是,能併發執行的 php-fpm 進程不會超過 cpu 個數。進程

如何設置,取決於你的代碼內存

  • 若是代碼是 CPU 計算密集型的,pm.max_chindren 不能超過 CPU 的內核數。資源

  • 若是不是,那麼將 pm.max_chindren 的值大於 CPU 的內核數,是很是明智的。requests

國外技術大拿給出這麼個公式:

N + 20%M / m 之間。

N 是 CPU 內核數量。
M 是 PHP 能利用的內存數量。
m 是每一個 PHP 進程平均使用的內存數量。

適用於 dynamic 方式。

static方式:M / (m * 1.2)

固然,還有一種保險的方式,來配置 max_children。適用於 static 方式。

  • 先把 max_childnren 設置成一個比較大的值。
  • 穩定運行一段時間後,觀察 php-fpmstatus 裏的 max active processes 是多少
  • 而後把 max_children 配置比它大一些就能夠了。

pm.max_requests:指的是每一個子進程在處理了多少個請求數量以後就重啓。

這個參數,理論上能夠隨便設置,可是爲了預防內存泄漏的風險,仍是設置一個合理的數比較好。

相關文章
相關標籤/搜索