当谷歌爬虫访问网站时,Apache崩溃与内存/ CPU超载

我有一个网站stream量低,一天不到500次。 它具有6G的内存,并且使用率低,平均有5%被使用。 但是,一旦googlebotbuild立了一个连接到我的web服务器/ Apache,内存和CPU使用率在几秒钟内尖峰,服务器变得无法访问 – 网站,SSH和所有其他服务。

当我为端口80做lsof时,这是我在几秒钟内崩溃之前所看到的。

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

Google Bot设置为缓慢抓取速度。

Apacheconfiguration是:

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和其他抓取工具; 我当然不同意这个观点,在我看来,这是整个服务器的一个更糟糕的迹象,当我们不得不阻止它的时候,尽pipe我们拥有数千个不同的网站。 另一方面,你似乎有自己的服务器。

正如Rilindo所猜测的那样,这使我相信,你的configuration有问题。 你给的样品configuration至less有一个项目像拇指一样突出:

 MaxRequestsPerChild 100 

你知道这会导致Apache迅速杀死subprocess并创build新进程吗? 在大多数情况下,默认值是10000。 我会先把它设置为10000,看看你到底在哪里。

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

如果由于安全考虑使用mod_php不是一个选项,那么我build议切换到mod_fcgid; 这几乎是suphp的替代品,但速度更快。

我想你想知道,如果你想阻止GoogleBot,你可以通过添加一个robots.txt和其他措施在这里find:

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

但是,对于6台机器,256是相当低的。 事实上,如果你正在运行一个主要是静态文件的网站,可能会发生的最糟糕的情况是你最多只能在256个服务器上运行。

你正在运行一个PHP / mySQL或一些MVC Web应用程序,例如Ruby on Rails,Django或某种CMS站点? 如果是这样,你可能需要再看看该网站。 该网站可能有一些问题,只有大量的连接,如GoogleBot生成的连接。