How Can We Help?

PHP-FPM 效能調校 on CentOS 7

You are here:
< All Topics

目前在 GCloud 託管的網站經常會出現不明情況死機

進去使用 TOP 稍微檢查一下,發現記憶體的使用量非常大

使用下面語法檢查 PHP-FPM 每一個行程平均記憶體使用量,發現每個行程約用 170 MB

ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

使用下面語法檢查共有多少開啟的行程,可以發現有許多開啟中的行程

ps -ylC php-fpm --sort:rss

根據分析我們的網站同時上線人數並沒有很多,所以初步判定是設定上的問題

vim /etc/php-fpm.d/www.conf

pm.max_requests

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

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

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

pm.max_requests = 1000

修改完後重啟服務

systemctl restart php-fpm

修改這個參數後,同時開啟的行程只剩下 9 個,記憶體平均使用量只剩下 100MB

還需要再繼續觀察看看

 

2020.04.14

同時開啟的行程共有 35 個,每個消耗 123M,但網站線上只有三個人

再次調整設定

pm.max_requests = 1000
pm.max_spare_servers = 35

改成

pm.max_requests = 500
pm.max_spare_servers = 20

看看能否讓線程提早關閉,並減少閒置的線程

經過兩天的測試,同時開啟的行程剩下 15 個,平均每個消耗 88M

 

於 2020/06/28

經過兩天的測試,同時開啟的行程達到 20 個,平均每個消耗 84M,共消耗 1680 MB

試著再調整看看

pm.max_requests = 400
pm.max_spare_servers = 15

於 2020/07/02

同時開啟的行程達到 15 個,平均每個消耗 51M,共消耗 765MB

剩餘記憶體還有 1042M,在可以接受的範圍內

參考資料:

php-fpm 效能優化

Nginx 與 PHP-FPM 最佳化效能設定教學與技巧

Nginx 啟用 PHP-FPM 服務狀態監控網頁教學

Table of Contents