1. 程式人生 > 實用技巧 >php-fpm優化

php-fpm優化

php-fpm程序分配

在之前的文章中就說過了。在fasgcgi模式下,php會啟動多個php-fpm程序,來接收nginx發來的請求,那是不是程序越多,速度就越快呢?這可不一定!得根據我們的機器配置和業務量來決定。

我們先來看下,設定程序的配置在哪裡?

pm = static | dynamic | ondemand
  • 1
  • 2

pm可以設定成這樣3種,我們用的最多的就上前面2種。

pm = static 模式

pm = static表示我們建立的php-fpm子程序數量是固定的,那麼就只有pm.max_children = 50這個引數生效。你啟動php-fpm的時候就會一起全部啟動51(1個主+50個子)個程序,頗為壯觀。

pm = dynamic 模式

pm = dynamic模式,表示啟動程序是動態分配的,隨著請求量動態變化的。他由pm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers這幾個引數共同決定。

上面已經講過,這裡再重申一下吧:

pm.max_children = 50是最大可建立的子程序的數量。必須設定。這裡表示最多隻能50個子程序。

pm.start_servers = 20隨著php-fpm一起啟動時建立的子程序數目。預設值:min_spare_servers + (max_spare_servers - min_spare_servers) / 2。這裡表示,一起啟動會有20個子程序。

pm.min_spare_servers = 10
設定伺服器空閒時最小php-fpm程序數量。必須設定。如果空閒的時候,會檢查如果少於10個,就會啟動幾個來補上。

pm.max_spare_servers = 30
設定伺服器空閒時最大php-fpm程序數量。必須設定。如果空閒時,會檢查程序數,多於30個了,就會關閉幾個,達到30個的狀態。

到底選擇static還數dynamic?

很多人恐懼症來襲,不知道選什麼好?

一般原則是:動態適合小記憶體機器,靈活分配程序,省記憶體。靜態適用於大記憶體機器,動態建立回收程序對伺服器資源也是一種消耗。

如果你的記憶體很大,有8-20G,按照一個php-fpm程序20M算,100個就2G記憶體了,那就可以開啟static模式。如果你的記憶體很小,比如才256M,那就要小心設定了,因為你的機器裡面的其他的程序也算需要佔用記憶體的,所以設定成dynamic是最好的,比如:pm.max_chindren = 8, 佔用記憶體160M左右,而且可以隨時變化,對於一半訪問量的網站足夠了。

慢日誌查詢

我們有時候會經常飽受500,502問題困擾。當nginx收到如上錯誤碼時,可以確定後端php-fpm解析php出了某種問題,比如,執行錯誤,執行超時。

這個時候,我們是可以開啟慢日誌功能的。

  1. slowlog = /usr/local/var/log/php-fpm.log.slow
  2. request_slowlog_timeout = 15s
  • 1

當一個請求該設定的超時時間15秒後,就會將對應的PHP呼叫堆疊資訊完整寫入到慢日誌中。

php-fpm慢日誌會記錄下程序號,指令碼名稱,具體哪個檔案哪行程式碼的哪個函式執行時間過長:


  1. [21-Nov-201314:30:38][pool www]pid11877
  2. script_filename=/usr/local/lnmp/nginx/html/www.quancha.cn/www/fyzb.php
  3. [0xb70fb88c]file_get_contents()/usr/local/lnmp/nginx/html/www.quancha.cn/www/fyzb.php:2

通過日誌,我們就可以知道第2行的file_get_contents 函式有點問題,這樣我們就能追蹤問題了。