当 Google 爬虫访问网站时,Apache 因内存/CPU 过载而崩溃

当 Google 爬虫访问网站时,Apache 因内存/CPU 过载而崩溃

我有一个流量较低的网站,每天的点击量不到 500 次。它有 6G 内存,而且利用率很低,平均使用率为 5%。但是,一旦 googlebot 与我的网络服务器/apache 建立连接,内存和 CPU 使用率就会在几秒钟内飙升,服务器变得无法访问 - 网站、ssh 和所有其他服务。

当我对端口 80 执行 lsof 时,这是我在网站崩溃前几秒看到的内容。

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

Google Bot 的抓取速度设置为较慢。

Apache 配置是:

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

错误日志显示:

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

答案1

当负载突然增加时,我的工作就是主动阻止服务器上的 Googlebot 和其他爬虫程序;我当然不同意这种做法,而且在我看来,当我们不得不阻止它时,这表明服务器总体上出现了更糟糕的问题,尽管我们托管着数千个不同的网站;而你似乎有自己的服务器。

这让我相信,正如 Rilindo 所猜测的那样,您的配置存在问题。您提供的示例配置至少有一项非常突出:

MaxRequestsPerChild 100 

您是否知道这会导致 Apache 快速终止子进程并创建新进程?在大多数情况下,默认值为 10000。我首先将其设置为 10000,然后看看结果如何。

我还看到您正在使用 suphp;除非您的系统上有许多不同的用户,并且安全性是一个问题,否则我建议您改用 mod_php。mod_php 是一个 Apache 模块,允许 Apache 处理 PHP,而不是让单独的 PHP 可执行文件处理工作。这允许通过 Apache 共享和线程化内存和 CPU 时间(假设您使用的是线程 MPM,例如 worker 或 event),这意味着总体负载减少。

如果由于安全问题而无法使用 mod_php,那么我建议切换到 mod_fcgid;它几乎是 suphp 的替代品,但速度更快。

答案2

我猜您想知道是否要阻止 GoogleBot,您可以通过添加 robots.txt 和采取此处的其他措施来实现:

http://www.google.com/support/webmasters/bin/answer.py?answer=9370

但是,对于 6 GB 的机器来说,256 台服务器的数量相当少。事实上,如果您运行的网站大部分都是静态文件,那么最糟糕的情况就是您的服务器数量最多只有 256 台。

您是否正在运行 PHP/mySQL 或某些 MVC Web 应用程序(例如 Ruby on Rails、Django 或某种 CMS 网站)?如果是,您可能需要再次查看该网站。该网站可能存在一些问题,这些问题只有在 GoogleBot 生成的大量连接中才会暴露出来。

相关内容