php-fpm 記憶體過高,CPU佔有率過高帶來的最佳化和調整

lixon166發表於2021-02-15

如果不是昨天我的論壇遭受到了NTP DDos攻擊,我也不會遇到這個問題.

首先,這些問題都是和php-fpm 的配置有關,如果你使用的是軍哥的LNMP,那麼這個配置檔案位於

/usr/local/php/etc/php-fpm.conf

首先先解決記憶體過高的問題,這個是由於php-fpm佔用了記憶體以後並沒有及時釋放造成的,但是我們可以透過配置檔案強制他釋放記憶體,可以在配置檔案裡面加上

pm.max_requests = 500

500這個值適用於大部分的伺服器配置,但是如果你的記憶體過大或者過小,可以適當增大或者減小這個值,取決於你的記憶體的實際使用率. 

既然說到了php-fpm 的配置,那麼就得好好的說下php-fpm 的 process management

php-fpm 的process management 有兩種工作方式,一種是static, 一種是dynamic, 對於小的cloud 或者vps 一般用static,但是其實大部分時間我們都在使用dynamic

pm = dynamic
pm.max_children = 160
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 40

和process management 有直接關係的是這四個引數, pm.max_children 在pm=static 的時候有用,在pm = dynamic 的時候, 剩下三個引數才開始起作用

這裡問題的關鍵在於,如何設定pm.max_children 的值

對於不同的php application,每個php-fpm instance 佔用的記憶體也不一樣,需要具體application 具體分析,但是這裡我們可以去個average , 30M

假設你的伺服器有8G的記憶體,其中的6GB 可以劃給php-fpm, 那麼

pm.max_children = 6000MB / 30MB =200

也就是說在這種情況下,200這個值是比較合適的. 這裡需要注意的是,賦予max_children 一個很高的值,並不代表會帶來高效能,也許會拖垮整個伺服器

剩下的三個引數,按照實際情況,設定的差不多就行了

你可以用如下的命令來實際檢視一下single php-fpm usage:

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

另外別忘了開啟php-fpm 的 slowlog,這樣方便你以後檢視日誌來進行debug

slowlog = /usr/local/php/var/log/slow.log

對於CPU 佔有率過高的問題,這個其實並不是php-fpm 的問題,而是你寫的php 程式碼的問題,這個時候可以透過設定pm.status_path 開檢視到底是哪個php application 佔用的cpu 資源

詳細可以參見這篇文章:



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69992808/viewspace-2757286/,如需轉載,請註明出處,否則將追究法律責任。

相關文章