我有一個基於 php、apache2 和 mysql 建置的 SAAS 產品,它託管在 AWS 上。我的生產在高峰時段非常非常慢,當我檢查伺服器狀態時,它說空閒工作人員為 0(零),我正在使用 mpm-prefork
Current Time: Monday, 24-Aug-2020 19:36:32 UTC
Restart Time: Friday, 14-Aug-2020 06:03:27 UTC
Parent Server Config. Generation: 12
Parent Server MPM Generation: 11
Server uptime: 10 days 13 hours 33 minutes 5 seconds
Server load: 1.17 1.07 0.95
Total accesses: 28851443 - Total Traffic: 824.8 GB
CPU Usage: u289.99 s50.68 cu0 cs0 - .0373% CPU load
31.6 requests/sec - 0.9 MB/second - 30.0 kB/request
256 requests currently being processed, 0 idle workers
以下是我的 mpm-prefork.conf 設定文件
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 450
MaxConnectionsPerChild 0
</IfModule>
ubuntu20.04 上的 TOP 指令給了我這個:
top - 20:03:58 up 143 days, 11:16, 1 user, load average: 0.48, 0.71, 0.83
Tasks: 369 total, 3 running, 317 sleeping, 0 stopped, 0 zombie
%Cpu(s): 15.9 us, 3.2 sy, 0.0 ni, 79.9 id, 0.0 wa, 0.0 hi, 1.0 si, 0.0 st
KiB Mem : 7865072 total, 1023492 free, 2752320 used, 4089260 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 4755856 avail Mem
根據詳細信息,我可以看到 1 GB 內存仍然可用。那麼閒置工人數為零嗎?另外,為什麼當我將 MaxRequestWorkers 設定為 450 時,只有 256 個請求上的空閒工作執行緒為零。
答案1
對於 MPM 預叉,如果增加,MaxRequestWorkers
您還需要提高ServerLimit
。
對於非執行緒伺服器(即 prefork),MaxRequestWorkers 轉換為將啟動以服務請求的子程序的最大數量。預設值為256;要增加它,您還必須提高 ServerLimit。
https://httpd.apache.org/docs/2.4/mod/mpm_common.html#maxrequestworkers
答案2
使用 mpm_prefork,網頁伺服器會產生新進程來處理請求。每個進程一次只能處理一個請求。
在您的範例中,您的 Web 伺服器設定為至少有 5 個空閒伺服器進程等待處理請求,最多 10 個。
我會增加 StartServers、MinSpareServers 和 MaxSpareServers 值,以確保您有足夠的可用容量來應對負載峰值或重負載。
您可能還需要考慮更改為另一個多處理模組,具體取決於您需要服務的工作負載類型。
編輯:@tetech 的答案是正確的,但是您可能還想考慮調整這些值,因為這可以提高網頁伺服器的效能。