Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
內容目錄
最近因為幫公司架設了 Freescout,架設完畢後,主要網站偶爾會出現記憶體不足的警訊,導致網站當機。由於在 php-fpm 的記錄檔裡面看到 php-fpm 的子程序數量超過負荷,因此著手開始研究 php-fpm.conf 內的設定。中間踩了一些雷(新手層級),所以先記錄下來,避免未來再犯。
這個是以前踩到的雷,更新完組態檔以後,直接重啟 php-fpm,導致關閉 php-fpm 後無法開啟。蠻雷的。
$ php-fpm -t
視情況可能會需要 php-fpm7.0
等標註 PHP 版本。
[global] #...略...# [www] #...上略...# user = www group = www pm = dynamic pm.max_children = 40 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 40 pm.max_requests = 1024 pm.process_idle_timeout = 10s request_terminate_timeout = 100 request_slowlog_timeout = 0 slowlog = var/log/slow.log php_admin_value[error_log] = /usr/local/php/var/log/php_errors.log php_admin_flag[log_errors] = on
PHP-FPM 的 pm 類型有三種:static、dynamic 與 ondemand。static 代表主機上 PHP-FPM 隨時佔用一定的記憶體資源,基本上用 VPS 的話就不需要考慮 static 了,因為你並不能確保主機商提供的記憶體跟價目表上的記憶體一樣。
dynamic 則會在 pm.min_spare_servers 與 pm.max_spare_servers 間,根據主機上全部網站的要求 (request) 狀態,決定啟用多少個 PHP-FPM 的執行程序。因此 pm.start_servers(起始的執行程序數量)不能小於 pm.min_spare_servers,而 pm.max_children 也不能大於 pm.max_spare_servers。
ondemand 是隨系統需求開啟、關閉 PHP-FPM 執行程序,如果記憶體小於 1GB 的話,建議就用這種方式就好。
2022-10-20 更新:
這次因為公司網站更新,把伺服器的 PHP 版本也更新後,發生了記憶體不足的問題,用 top -o %MEM
調查後,確認是 php-fpm 的問題。改成 ondemand 後狀況就有改善了,稍微記錄一下。
首先,需要先確定現有的 PHP-FPM 會佔用多少記憶體資源。
$ ps -ylC php-fpm --sort:rss
可以從 RSS 看到目前主機上,每個 PHP-FPM 執行程序需要佔用的記憶體容量,以目前公司網站為例,大概落在 120 MB 上下。
假設使用的主機提供 2GB (2048 MB) 的記憶體,那 PHP-FPM 的 pm.max_spare_servers 可以計算為:
2048/120 = 17
這次因為沒有先計算過,直接照本宣科,使用網路上教學的 2048/40 = 51 做設定,結果導致記憶體過載,算是這次踩到最大的新手雷。
這裡的參考了一下其他大部分的文章,發現大多數文章提供範例時,PHP-FPM 執行程序的記憶體大約落在 30MB 到 60MB 之間。公司網站使用的記憶題資源較多,是因應 WPML 的系統最低需求所做的調整。可以透過修改 php.ini 的 memory_limit 組態值,或是在 php-fpm.conf 中加入 php_admin_value[memory_limit] = OOM 修改。
由於公司的主機上面同時架設了多個網站,因此針對資源的切分還有需要加強的地方。接下來應該要研究一下如何分配不同程度的資源,給予不同的 vhost。