我知道這個問題有點長,但我選擇描述我最終觀察到的每一個面向。
我使用的是Linux伺服器,使用的作業系統是Ubuntu 14.04,所有其餘設定定義如下。此 Web 伺服器用於為 PHP 建置的應用程式提供服務,資料庫透過 RDS 託管。平均高峰時伺服器上有近 200 個並發請求,最終記憶體利用率為 100%。由於這個應用程式變得非常慢或有時會回傳錯誤。因此,我按照下面列出的一些步驟來解決這個問題,並嘗試調整 apache 並限制它應對奇怪的情況。
作業系統
名稱=“Ubuntu”版本=“14.04.5 LTS”
伺服器配置
CPU:8 核心
RAM:15 GB
硬體供應商:AWS執行
個體類型:c4.2xlarge
Apache.Conf 參數 (2.4)
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
HostnameLookups Off
LogLevel warn
AllowOverride all(適用於應用程式的文檔根目錄)
使用的 MPM:預叉
MPM_PREFORK.CONF
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 256
MaxConnectionsPerChild 200
Mods_啟用
access_compat.load autoindex.load mime.load setenvif.load alias.conf deflate.conf mpm_prefork.conf socache_shmcb.load alias.load deflate.load mpm_prefork.load ssl.conf authn_ego.load dir.載入dir.載入協商.載入status.conf authz_core.load env.load php5.conf status.load authz_host.load filter.load php5.load authz_user.load headers.load rewrite.load autoindex.conf mime.conf setenvif.
平均 Apache 進程大小
使用的命令:
sudo ps -ylC apache2 | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Process Size (MB): "x/((y-1)*1024)}' <br/>
Apache 記憶體使用量 (MB):7227.66
平均進程大小 (MB):314.246
MaxRequestWorkers的計算
X = 我想分配給 Apache 的專用 RAM (13GB):13312 MB
Y = 我最近 15 天透過伺服器監控的平均進程大小:314.246
MaxRequestWorkers = X/Y = 40 大約
使用的 MPM:預叉
修改MPM_PREFORK.CONF
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 40
MaxConnectionsPerChild 8
現在,當apache啟動時,它將啟動5個startservers進程,每個startserver進程將啟動8個子連接,因此總共可以與伺服器建立40個並發連接。 MaxRequestWorkers 限制為 40,這不會超過 40 個並發請求,這將防止 DOS、DDOS 或透過佔用最大 13GB RAM 來保護伺服器停止運行,為伺服器留下 2GB RAM 可用空間。
我也不清楚 MaxConnectionsPerChild 參數,如果我使用錯誤,請糾正我。
PHP.INI 參數 (php5)
舊
輸出緩衝 = 4096
最大執行時間 = 60
記憶體限制 = -1
日誌錯誤 = 開
新的
output_buffering = 4096
max_execution_time = 60
memory_limit = 64M
log_errors = On
我仍然面臨的問題
更改 mpm_prefork_conf 後,記憶體利用率下降,但由於 MaxRequestWorkers 參數,伺服器向許多客戶端回應 503 錯誤。我試圖弄清楚為什麼我的每個 apache 進程都使用 315MB 的 RAM,我用 google 搜尋了大約 2 天,但無法找到進一步解決此問題的正確路徑。所以最後我把這個貼在這裡。我現在有兩個選擇。
最佳化apache平均進程限制,增加MaxRequestWorkers限制。
增加 RAM 並以相同的平均進程大小為客戶提供服務,我認為這不是一個正確的選擇。
請用正確的建議來指導我如何使用 php 識別和減少 apache 的平均進程大小。請僅真實回答。
答案1
我不認為你能得到比這更好的東西,我會採取使用 php-fpm 的路線,那麼非動態內容加載會更快並且消耗更少的內存,我發現了這個指南 (digitalocean.com),這提供了很好的建議。您可以檢查的一件事是更改 apache 中的 keepalive 時間,請參閱這裡
答案2
每個 apache 進程佔用的記憶體相當多。 Ubuntu 14.0.4 已於 2019 年停產。
您發布的配置中令人尖叫的事情是這樣的:
KeepAliveTimeout 5
將其變更為 1。
開始分析您的流量 - 確保所有靜態內容都是可快取的。
檢查你的 apache 設定 - 確保你沒有載入不使用的模組。
確保您已為 PHP 設定了預設 timeone 並且您的腳本沒有停用錯誤報告。檢查錯誤日誌並清除錯誤。嘗試在 Apache 中調整你的listenBacklog。
每個子項的最大連接數 8
為什麼?這是非常低的。 Apache 整體上非常穩定。您應該能夠將其增加到 100,以減少 Apache 需要分叉的次數,從而增加容量。如果變更此值會對應用程式錯誤率產生影響,請檢查您的持久資料庫連線是否編碼錯誤。如果它影響記憶體使用,請確保您的補丁是最新的。