Linux

Google爬蟲訪問網站時,Apache 因記憶體/cpu 過載而崩潰

  • July 11, 2011

我有一個流量很低的網站,每天的點擊量不到 500 次。它有一個 6G 的記憶體,而且它的使用率很低,平均 5% 正在使用中。但是一旦 googlebot 與我的 webserver/apache 建立連接,記憶體和 cpu 使用率會在幾秒鐘內達到峰值,並且伺服器變得無法訪問 - 網站、ssh 和所有其他服務。

當我為埠 80 執行 lsof 時,這是我在網站幾秒鐘內崩潰之前看到的內容。

lsof -i:80 mywebsite:http->crawl-66-249-71-200.googlebot.com:43567(已建立)

Google Bot 設置為較慢的抓取速度。

阿帕奇配置是:

ServerLimit 256 
MaxClients 150 
MaxRequestsPerChild 100 
KeepAlive Off 
KeepAliveTimeout 5 
MaxKeepAliveRequests 100

錯誤日誌顯示:

Cannot allocate memory: couldn't create child process: /opt/suphp/sbin/suphp

當負載跳躍時,我的工作會主動阻止伺服器上的 Googlebot 和其他爬蟲;我當然不同意,而且在我看來,當我們不得不阻止它時,這通常表明伺服器的情況要糟糕得多,儘管我們託管著成千上萬個不同的網站;另一方面,您似乎擁有自己的伺服器。

正如 Rilindo 猜測的那樣,這讓我相信,您的配置有問題。您提供的範例配置至少有一項像拇指酸痛一樣突出:

MaxRequestsPerChild 100 

您是否知道這會導致 Apache 快速殺死子程序並創建新程序?在大多數情況下,預設值為 10000。我會先將它設置為 10000,然後看看它會帶給你什麼。

我還看到您正在使用 suphp; 除非您的系統上有很多不同的使用者,並且需要考慮安全性,否則我建議您改用 mod_php。mod_php 是一個 Apache 模組,它允許 Apache 處理 PHP,而不是讓一個單獨的 PHP 執行檔來處理工作。這允許記憶體和 CPU 時間通過 Apache 共享和執行緒化(假設您使用執行緒化的 MPM,例如工作者或事件),這意味著總體上減少了負載。

如果出於安全考慮不能使用 mod_php,那麼我建議切換到 mod_fcgid;它幾乎是 suphp 的替代品,但速度更快。

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