Apache-2.2

Apache 產生大量 httpd 程序

  • April 25, 2016

我正在執行一台 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

我這樣做了,我還調整了不同的進一步配置參數,但它沒有幫助。無論設置什麼值MaxClientsServerLimitApache 都不會停止生成新的 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訪問這些統計資訊。有關更多詳細資訊,請參見此處此處

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