php-fpm優化,3種運行模式詳解

三種工做模式

ondemand,static,dynamic(內存優先、靜態池、服務優先)php

ondemand

php-fpm啓動的時候不會啓動worker進程,按需啓動worker,有連接進來後,纔會啓動服務器

listen = 127.0.0.1:9001
pm = ondemand 
pm.process_idle_timeout = 60
pm.max_children = 10

鏈接到來時(只有連接,不沒有數據也會建立,telnet也會建立),建立新worker進程,worker進程數的建立收max_children設置限制,也受限於全局的process.max設置(三種模式都受限此,下文中有全局配置項講解),若是空閒時間超過了process_idle_timeout的設置就會銷燬worker進程併發

  • 優勢:按流量需求建立,不浪費系統資源,
  • 缺點:由於php-fpm是短鏈接的,若是每次請求都先創建鏈接,大流量場景下會使得master進程變得繁忙,浪費cpu,不適合大流量模式
  • 不推薦使用此模式

dynamic

會初始化建立一部分worker,在運行過程當中,動態調整worker數量,最大worker數受pm.max_children和process.maxphp-fpm

listen = 127.0.0.1:9001
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 6
  1. 當空閒進程數小於min_spare_servers時,建立新的子進程,總子進程數小於等於pm.max_children,小於等於process.max
  2. 當空閒進程數大於max_spare_servers,會殺死啓動時間最長的子進程
  3. 若是子進程(idle狀態)數大於max_children,會打印warning日誌,結束處理
  4. process小於 max_children ,計算一個num,啓動num個worker
  5. 優勢:動態擴容,不浪費系統資源
  6. 缺點:全部worker都在工做,新的請求到來須要等待建立worker進程,最長等待1s(內部存在一個1s的定時器,去查看,建立進程),頻繁啓停進程消耗cpu,請求數穩定,不須要頻繁銷燬

static

啓動固定大小數量的worker,也有1s的定時器,用於統計進程的一些狀態信息,例如空閒worker個數,活動worker個數性能

pm.max_children = 10   #必須配置這個參數,並且只有這個參數有效
  1. 優勢:不用動態判斷負載,提高性能
  2. 缺點:若是配置成static,只須要考慮max_children數量,數量取決於cpu的個數和應用的響應時間,一次啓動固定大小進程浪費系統資源

模式選擇

  1. 靜態適合大內存機器,動態適合小內存服務器,2g,ondemand模式適合微小的內存,2g如下
  2. 進程數不是越多越好,進程數增多會增長進程管理開銷以及進程上下文切換,併發執行數也不會超過cpu核數,cpu密集型,pm.max_children不能超過cpu內核數,若是不是能夠將pm.max_children的值設置大於cpu核數
  3. 動態創建進程個數spa

    • N+20% 到 M/m之間
    • N是cpu核數,M是內存,m是每一個php進程內存數
  4. 靜態進程個數日誌

    • M/(m*1.2)
    • pm.max_requests, 設置最大請求數,達到這個數量之後,會自動長期worker進程,繁殖內存意外增加

其餘配置講解

# 全局設置
process.max = 10 #最大進程數

# www.conf
user = nobody # 進程發起的用戶和用戶組,nobody爲任意用戶,user必須設置,group不用
group = www

listen = [::]:9000

pm = dynamic   # 進程池管理器如何控制子進程數量,static,靜態,固定值  dynamic 動態 ondemand
pm.max_children = 16    # 同一時刻可以存活的最大子進程數
pm.start_servers = 4    # 啓動時啓動的子進程數
pm.min_spare_servers = 2   # 處於空閒 idle狀態的最小進程,若是空閒進程數量小於這個值,那麼相應的子進程會被建立, 能夠有效的減小建立的進程數,請求處理不過來,纔會按部就班的建立 
pm.max_spare_servers = 16   # 最大空想進程數,空閒子進程數超過這個值,那麼相應的子進程會被殺掉
catch_workers_output = yes  # worker進程的標準輸出和錯誤輸出會重定向到錯誤日誌中,沒有設置會輸出到/dev/null

;slowlog = xxx   # 默認關閉,慢日誌路徑
;request_slowlog_timeout = 0   # 腳本執行超過多久就記錄到日誌文件
相關文章
相關標籤/搜索