高stream量的Drupal网站的Apache错误

我得到了一堆Apache的错误,我有问题追查。 他们在RHEL系统上运行一个非常高容量的Drupal网站。

  [Mon Sep 14 12:48:44 2009] [info] [client xx.xx.xxx.xx](70007)指定的超时已经过期:core_output_filter:将数据写入networking
 [2009年9月14日星期一12:50:19] [info] [client xx.xxx.xx.xx](104)通过peer重置连接:core_output_filter:将数据写入networking
 [Mon Sep 14 12:51:28 2009] [info] [client xx.xxx.xx.xx](32)Broken pipe:core_output_filter:将数据写入networking 

偶尔(每24到36小时)会有一个负载峰值,网站将变得完全没有反应。 平均负载从正常的1-1.5升到200.正在运行的大多数httpd进程将显示为“D” – 死锁 – 让服务器回到“交互式”的唯一方法是三- 手指敬礼或等到你得到一个提示和killall -9 httpd

很明显,这个网站不能被取下来做一堆的工作。 我已经检查了Apache的configuration,并且(再次),据我所知,EnableMMAP和EnableSendFile被禁用。 这些文件位于NFS v3挂载点上,但NFS服务器,mysql服务器和其他任何软件都不报告错误。 没有适当的系统日志或dmesg。 该网站的负载也太高,以协调各个请求,并由此产生错误。

在这一点上,我想networking硬件错误,我宁愿把网站上的第二台机器。 任何人有任何想法之前,我这样做?

这是一个野驴猜测,但你有没有检查Drupal创build多less磁盘临时表?

我已经看到这个原因iowait(负载)的问题。

mysqladmin -u root -p ext -ri 30 | grep Created_tmp_disk

第一次运行会告诉你有多less磁盘临时表是自上次重新启动MySQL以来创build的。 然后它会告诉你在30秒的时间窗口中创build了多less个(直到你从Control-C中取出)。

(创可贴)解决scheme是把MySQL的tmpdir放在一个基于RAM的文件系统上(例如tmpfs)。

我想我的build议是,这开始级联 – 你看到的消息只是放弃的连接。

干杯

总之,在你的Apacheconfiguration尝试以下内容:

启用MMAPclosures

发送文件closures

长久以来:

Apache显然是mmaps文件,并尝试使用Linux的sendfile( http://linux.die.net/man/2/sendfile )的性能,当它是可用的,但根据Apache文档这可能会导致networking文件系统的稳定性问题,如果它无法读取文件,请参阅:

http://httpd.apache.org/docs/2.0/mod/core.html#enablesendfile

他们在这里进入一些具体的信息:

http://httpd.apache.org/docs/2.0/faq/all_in_one.html#error.sendfile

您可以在这里find有关EnableMMAP和EnableSendfile指令的信息:

http://httpd.apache.org/docs/2.0/mod/core.html#enablemmap

我们通过全面切换到InnoDB,正确configuration密钥caching以及添加一堆memcache和其他内容,从而实现了网站的平衡。 我上面引用的所有错误显然是由于客户端取消了长时间运行的进程的请求而引起的,因为一旦我们调整了数据库,错误就消失了。

添加nginx来代理你的apache并直接提供静态内容。 甚至完全取代Apache。 这将会非常大的降低Apache负载。