php-fpm的最佳化

huxiaobai_001發表於2023-11-16

PHP-FPM是阻塞的單執行緒模型,PHP-FPM的每個程式只開啟一個執行緒,一個執行緒同時只能服務一個請求。

怎麼理解這句話呢?

這段話描述了 PHP-FPM(PHP FastCGI Process Manager)的執行模型和特性:

  1. 阻塞的單執行緒模型:PHP-FPM 使用阻塞的單執行緒模型,這意味著每個 PHP-FPM 程式只能同時處理一個請求。這與一些其他 Web 伺服器或應用伺服器採用的多執行緒或多程式模型有所不同。

  2. 每個程式只開啟一個執行緒:在 PHP-FPM 中,每個程式都只開啟一個執行緒來處理請求。這表示在同一時間內,一個 PHP-FPM 程式只能執行一個任務。執行緒是作業系統進行任務排程和執行的基本單元。

  3. 一個執行緒同時只能服務一個請求:由於 PHP-FPM 採用單執行緒模型,因此一個 PHP-FPM 程式在同一時刻只能服務一個請求。這表示當一個請求被處理時,其他請求需要等待,直到當前請求完成。

這種模型的優點是簡單、可靠,適用於處理中小規模的 Web 請求。每個 PHP-FPM 程式獨立執行,相互之間不會影響,這有助於隔離問題和提高穩定性。然而,對於高併發的場景,可能需要考慮採用其他更多執行緒或多程式的伺服器模型,以更有效地處理大量請求。

總體來說,這種單執行緒、單程式的模型使得 PHP-FPM 在很多情況下表現出色,特別是在共享主機環境或低到中等流量的網站中。

這也就意味著多個php-fpm程式是不是可以同時處理多個請求

多個 PHP-FPM 程式能夠同時處理多個請求。PHP-FPM 是一種程式管理器,每個 PHP-FPM 程式都可以獨立執行,並且能夠處理一個或多個請求。

在 PHP-FPM 的工作模式下,多個程式並行執行,每個程式都可以同時處理一個請求。這是透過多程式和多執行緒的機制實現的。每個 PHP-FPM 程式都有其獨立的資源和環境,因此它們不會相互干擾。這使得 PHP-FPM 能夠有效地應對併發請求,提高伺服器的效能和響應能力。

PHP-FPM 程式的數量可以透過配置檔案中的 pm.max_children 引數進行設定。這個引數決定了同時執行的 PHP-FPM 程式的最大數量。透過合理配置這個引數,你可以根據伺服器的硬體和效能需求來最佳化 PHP-FPM 的併發處理能力。

總體而言,PHP-FPM 的多程式模型使得它能夠有效地處理大量併發請求,是一個常用於 PHP 應用程式的高效能選項。

開過多的php-fpm程式會不會佔用太多的記憶體?

其實可以透過如下命令來檢視php-fpm佔用的總的記憶體大小:

ps aux |grep php-fpm|awk '{mem+=$6}END{print mem}'

如下圖所示:
php-fpm的最佳化

php-fpm當中也有進城池的概念:

這些引數在www.conf 配置檔案當中存在, 是 PHP-FPM 程式管理器中的一部分,透過調整它們的值,你可以最佳化 PHP-FPM 的效能和資源利用情況。下面詳細解釋這些引數的含義和最優設定大小:

  1. pm.max_children(最大子程式數):

    • 含義:指定 PHP-FPM 程式池中最大子程式的數量。
    • 最優設定:最優大小取決於伺服器的記憶體和效能。通常,你希望 pm.max_children 設定為能夠滿足同時處理的併發請求的數量,同時不會導致伺服器記憶體耗盡。計算方式可以根據伺服器記憶體和每個 PHP-FPM 程式的記憶體佔用來估算。在給定記憶體下,可用記憶體除以單個 PHP-FPM 程式的記憶體佔用,就是最大子程式數的一個合理估計。
  2. pm.start_servers(初始程式數):

    • 含義:指定 PHP-FPM 程式池啟動時初始子程式的數量。
    • 最優設定:通常,你希望 pm.start_servers 設定為一個較大的值,以確保在伺服器啟動時有足夠的程式來處理初始請求負載。
  3. pm.min_spare_servers(最小空閒程式數):

    • 含義:指定 PHP-FPM 程式池中最小空閒子程式的數量。
    • 最優設定:根據伺服器負載和效能需求,設定 pm.min_spare_servers 為確保在空閒時仍有足夠程式來處理請求。
  4. pm.max_spare_servers(最大空閒程式數):

    • 含義:指定 PHP-FPM 程式池中最大空閒子程式的數量。
    • 最優設定:根據伺服器負載和效能需求,設定 pm.max_spare_servers 為確保不會因過多空閒程式而浪費資源。
  5. pm.max_requests(最大多少次請求後子程式重生):

    • 含義:指定每個 PHP-FPM 子程式服務的最大請求數。當達到此次數時,該子程式將被重啟。
    • 最優設定:用於避免 PHP 程式長時間執行導致記憶體洩漏。設定適當的值,以確保 PHP 程式定期重啟,釋放記憶體資源。通常可根據應用的記憶體使用情況和負載來設定。

請注意,這些引數的最優值取決於具體的伺服器配置和應用程式需求。進行調整時,建議先進行效能測試,觀察伺服器的負載和效能表現,然後根據測試結果調整這些引數以達到最佳效能。

設定php-fpm程式池為動態調整模式:

php-fpm的最佳化

php-fpm的最佳化

透過命令可檢視一共起來了多少php-fpm程式的個數:

php-fpm的最佳化

我們來看一下php-fpm程式狀態監控

首先在www.conf 配置檔案當中找到pm.status_path 將其設定為:

pm.status_path = /phpstatus

然後配置nginx:

location /phpstatus {
    fastcgi_index  index.php;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

進行訪問即可拿到php-fpm的狀態資訊
php-fpm的最佳化
但是這些狀態資訊是什麼意思呢?

pool: www # 程式池名稱
process manager: dynamic # 程式管理方式
start time: 22/Jan/2016:15:49:00 +0800 # 啟動時間
start since: 375 # 執行時長
accepted conn: 7 # 當前程式池接受的請求數
listen queue: 0 # 請求等待佇列,如果不為 0 ,意味著 FPM 程式不足,需要增加
max listen queue: 0 # 最大等待佇列數量
listen queue len: 1024 # SOCKET 等待佇列長度
idle processes: 4 # 空閒程式數
active processes: 1 # 活躍的程式數
total processes: 5 # 總程式數
max active processes: 1 # 最大活躍程式數
max children reached: 0 # 達到最大程式數的次數,如果不為 0 ,意味著最大程式數不足,需要增加
slow requests: 0 # 慢請求數量,需要設定 slow logslow requests: 0 # 慢請求數量,需要設定 slow log

配置php-fpm的報錯日誌路徑

php-fpm 的日誌路徑是透過 PHP-FPM 的配置檔案中的 error_log 指令進行設定的。這個指令用於指定 PHP-FPM 程式的錯誤日誌路徑。以下是設定 php-fpm 日誌路徑的步驟:
找到 PHP-FPM 的配置檔案,通常是 usr/local/php/etc/php-fpm.conf 或者 usr/local/php/etc/php-fpm.d/www.conf(具體路徑可能因發行版而異)。
在配置檔案中找到 error_log 指令

CentOS 下編譯安裝 PHP8.0(nginx 版)

這樣我們就可以快速定位php-fpm的錯誤資訊了

如何記錄php-fpm的訪問日誌呢?

找到usr/local/php/etc/php-fpm.d/www.conf 配置檔案
CentOS 下編譯安裝 PHP8.0(nginx 版)

CentOS 下編譯安裝 PHP8.0(nginx 版)

因為我們在php-fpm.conf當中配置了error_log日誌的路徑是/usr/local/php/log 所以php-fpm.log 和這裡我們上圖當中的access訪問日誌的log都會在該目錄下被建立

CentOS 下編譯安裝 PHP8.0(nginx 版)

當你訪問php檔案的時候訪問日誌就會在www.access.log 當中被記錄下來 不過不建議開啟該日誌 直接去看nginx或者apache的日誌就行了

如何配置php-fpm慢查詢日誌呢?

比如你請求一個方法執行了5s是應該被php-fpm慢執行日誌記錄下來的,今天我們就來配置一下
還是找到php-fpm的www.conf 配置檔案

php-fpm的最佳化

因為我們在php-fpm.conf當中配置了error_log的路徑所以也會在同樣的路徑下生成慢執行日誌
然後我們在nginx當中的html當中寫一個index.php檔案 裡面sleep(5)睡眠5s
然後去請求一下可以看到在/usr/local/php/log目錄下就有了對應的慢執行日誌檔案

php-fpm的最佳化

我們看看裡面具體的內容是什麼?

php-fpm的最佳化

被記錄的一清二楚

增大php-fpm開啟檔案數量的限制

php-fpm的最佳化

單個php-fpm執行緒能開啟的檔案的數量設定為65535 讓每個php-fpm程式沒有硬體上的限制

如何設定每個php-fpm程式佔用的記憶體的大小?

直接在php.ini配置檔案當中設定即可

php-fpm的最佳化

如何設定每個php-fpm程式的超時時間?

直接在php.ini檔案當中設定即可

php-fpm的最佳化

本作品採用《CC 協議》,轉載必須註明作者和本文連結
胡軍

相關文章