Apache-2.4

apache2 伺服器中的零空閒工作人員導致性能問題

  • August 25, 2020

我有一個基於 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 個請求的空閒工作人員為零。機器中的最大 RAM 為 8GB

使用 MPM prefork,如果你增加MaxRequestWorkers你也需要增加ServerLimit.

對於非執行緒伺服器(即 prefork),MaxRequestWorkers 轉換為將啟動以服務請求的最大子程序數。預設值為 256;要增加它,您還必須提高 ServerLimit。

https://httpd.apache.org/docs/2.4/mod/mpm_common.html#maxrequestworkers

使用 mpm_prefork,網路伺服器會產生新的程序來處理請求。每個程序一次只能處理一個請求。

在您的範例中,您的網路伺服器設置為至少有 5 個空閒伺服器程序等待處理請求,最多 10 個。鑑於您正在處理超過 250 個同時請求,可能是您的網路伺服器無法快速生成新程序足夠。

我會增加 StartServers、MinSpareServers 和 MaxSpareServers 值,以確保您有足夠的可用容量來應對負載高峰或重負載。

您可能還需要考慮根據需要服務的工作負載類型更改為另一個多處理模組。

編輯:@tetech 的答案是正確的,但是您可能還希望考慮調整這些值,因為這可以提高網路伺服器的性能。

引用自:https://serverfault.com/questions/1031399