設置PHP最大連接數及php-fpm 高並發 參數調整


服務器中找到php-fpm.conf配置(有的會在引入的www.conf中)

[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice

[www]
listen = /tmp/php-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = static
pm.max_children = 200
pm.start_servers = 40
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests=1000
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.log

  

---------------------------------------------------------------------------

pm.max_children=30
pm.max_requests=500
pm.start_servers=4
pm.max_spare_servers=30

  

一. pm= static

首先說一下pm這個值   pm = dynamic 這個是php的進程數是動態的  會根據訪問量來確定來回增加

而在高負載的php環境下我推薦設置  pm= static php-fpm進程數固定

二.  pm.max_children=???

當用靜態模式下 進程數確定根據 pm.max_children來進進行確定    那么問題來了我的服務器應該設定多少php-fpm呢 ?

 

    從理論的角度上說php-fpm進程數越多越好,相當於一個酒店有很多個充足的服務員來為你服務肯定會比較爽啊 ,你也不需要等待。

     但是。。。。現實上總是殘酷的   php-fpm的進程數會受到你的內存大小的限制。一般情況下我們    進程數 =用機器內存(M)除以2  再除以20(M);

     當然這個也不是絕對的   你需要知道:

  1.  你可以分配給php多大內存 :你的服務器上是不是單純的php服務器  有沒有比較耗費內存的其他程序(mysql)。
  2.  你的每個php-fpm內存占多大 :內存占用多大要根據你的php代碼質量和處理的相關業務。當然你可以用命令去統計你的php-fpm平均占用內存大小。

        有人會問我如果設置不恰當會有什么狀況出現呢?

     當數值偏小時請求到nginx會無法分配到php-fpm進程 導致502錯誤

     

     當數值偏大如果沒有大訪問量還好  如果訪問量較大的話 內存都會被php占光了。導致系統響應緩慢   cpu-system  升高 系統不斷的去調整內存分配

          嚴重時會導致較高的 cup-wait 較高   內存不夠用了  直接寫磁盤  磁盤io直線增加 。cpu使用率也開始爆滿。(如圖所示)

    

    三.request_terminate_timeout

   計算方式如下:如果你的服務器性能足夠好,且寬帶資源足夠充足,PHP腳本沒有循環或BUG的話你可以直接將”request_terminate_timeout”設 置成0s。0s的含義是讓PHP-CGI一直執行下去而沒有時間限制。

   而如果你做不到這一點,也就是說你的PHP-CGI可能出現某個BUG,或者你的寬帶不夠充足或者其他的原因導致你的PHP-CGI能夠假死那么就建議你給”request_terminate_timeout”賦一個值,這個值可以根 據你服務器的性能進行設定。

一般來說性能越好你可以設置越高,20分鍾-30分鍾都可以。由於我的服務器PHP腳本需要長時間運行,有的可能會超過10分鍾因此我設置了900秒,這樣不會導致PHP-CGI死掉而出現502 Bad gateway這個錯誤。

 

四.pm.max_requests

        這個參數的含義是php-fpm工作進程處理完多少請求后自動重啟,主要目的就是為了控制請求處理過程中的內存溢出,使得內存占用在一個可接受的范圍內。比較適用於服務器搭載項目比較雜亂,有點請求會比較占用內存

        導致php-fpm占用比較大。在經過一定次數請求后會結束掉進程,釋放自己的內存。如果這個值太小就會導致所有的工作進程幾乎同時達到這個值並且進入需要重啟的狀態,當所有的工作進程都在同一時刻重啟就會發生在

  數秒內甚至更長的時間PHP將停止響應直到所有的進程均重啟完為止。這是不能接受的,所以我一般會把這個值設置為PHP啟動后第一批工作進程達到此值需要重啟時,第一個進程重啟與最后一個進程重啟之間的時間相差

  1分鍾以上,一般在壓力比較大的晚上這個差值將會擴大到5分鍾左右,此時對進程重啟對服務器的負面影響就可以忽略了。

下面補充幾個命令統計相關php-fpm 相關數據  

  

 

1、查看php-fpm的進程個數

ps -ef |grep "php-fpm"|grep "pool"|wc -l

2、查看每個php-fpm占用的內存大小

ps -ylC php-fpm --sort:rss

3.查看PHP-FPM在你的機器上的平均內存占用

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

4.查看單個php-fpm進程消耗內存的明細

pmap $(pgrep php-fpm) | less

 重啟php-fpm

1. 停止命令
 
 pkill php-fpm
 
2.重啟或啟動命令
 
php-fpm -R

或
/alidata/server/php/sbin/php-fpm

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM