Apache 產生大量 httpd 程序
我正在執行一台 CentOS 6.7 機器(16 GB vRAM,8 個 vCPU)和一個簡單的 Web 伺服器設置(Apache/2.2.15、PHP/5.3.3、MySQL/5.1.66),託管一個中等數量的線上商店頁面展示次數(每天大約 2,000 ~ 4,000 次)。
該伺服器在過去 3 年中執行平穩,無需更改其配置。現在,從上週開始 - 不知何故一夜之間 - Apache/HTTP 在很短的時間(大約 30 分鐘)後反複變得無法訪問。我檢查了一些參數,發現有很多 httpd 程序在執行。
ps axf | grep httpd | wc
顯示如下內容:387 2344 18354
而負載不是很令人興奮。
top
看起來像這樣:極少數的 httpd 程序會時不時地再次釋放,但總數幾乎在不斷增加。如果我執行 a
service httpd reload
,程序數會回落到 0 並在接下來的幾分鐘到幾小時內再次開始增加。過了一會兒,Apache 的日誌告訴我:[error] server reached MaxClients setting, consider raising the MaxClients setting
我這樣做了,我還調整了不同的進一步配置參數,但它沒有幫助。無論設置什麼值
MaxClients
,ServerLimit
Apache 都不會停止生成新的 httpd 程序,直到達到這些限制。在此之後,該網站將無法再訪問。根據AWStats,頁麵點擊量沒有增加。此外,PHP 應用程序沒有任何變化。除了在 30 分鐘後阻止所有請求的故障外,該網站的執行速度與往常一樣快。作為一個骯髒和臨時的解決方法,Cron 會每半小時重新載入一次 Apache。
在過去 3 年中,Prefork/Worker 設置如下:
<IfModule prefork.c> StartServers 4 MinSpareServers 5 MaxSpareServers 10 ServerLimit 128 MaxClients 128 MaxRequestsPerChild 600 </IfModule> <IfModule worker.c> StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>
我把它們提高到:
<IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 10 ServerLimit 640 MaxClients 640 MaxRequestsPerChild 1000 </IfModule> <IfModule worker.c> StartServers 4 MaxClients 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>
在此更改之後,Apache/HTTP 在大約 1 小時後變得不可用。
這怎麼會突然發生,我有哪些選擇可以進一步調查這種奇怪行為的起源?
拳頭,增加 prefork 參數只會使您的情況惡化。所以恢復之前的配置。
要排除任何 prefork 問題/錯誤配置,請嘗試禁用它。情況是否有顯著變化?如果是這樣,你會發現你的問題。
如果不是,則問題與外部因素有關:例如,可能某些機器人/腳本針對您的網站,打開了許多連接(使用相關的 httpd 程序)。如果是這種情況,您應該能夠從 Apache 日誌文件中看到。
如果這還不夠,您可以啟用該
mod_status
模組以顯示詳細的統計資訊。然後,發出apachectl fullstatus
訪問這些統計資訊。有關更多詳細資訊,請參見此處和此處。