How Can We Help?
PHP-FPM 效能調校 on CentOS 7
目前在 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,在可以接受的範圍內