为什么apache在一夜之间放缓?

问候专家,

在我专用的CentOS 5.4服务器上,我configuration了十几个虚拟主机的Apache。 我testing了几个,每个在一秒钟内加载; 相当快。 平均负载小于1.没有问题。 我正在运行静态HTML网站,一个WordPress的博客与MySQL 5.0 …这些不是高带宽网站; 没有什么会强调这个服务器。

第二天早上,我开始工作,加载主站点,加载需要10到20秒。 我检查服务器上的平均负载,它徘徊在3左右,有时高达5,一旦看到它在8,从不低于2.在这一点上,我优雅地反弹阿帕奇:

# apachectl -k graceful 

花了大约半分钟,然后一切都很好。 所有的虚拟主机加载速度都不到一秒钟。 平均负荷迅速下降到1以下。

在检查/服务器状态时,并不是很多; 当检查净stream量( vnstat -lvnstat -h )时,没有使用大量的带宽。 两者在最后一天的开始时是可比较的。 但是,当我在早上检查时,apache比整天要慢很多。 一夜之间发生了什么事情,使Apache变得如此之慢,消耗了更多的系统资源?

 # httpd -V Server version: Apache/2.2.3 # uname -a Linux myserver.com 2.6.18-92.el5 #1 SMP Tue Jun 10 18:51:06 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux # free total used free shared buffers cached Mem: 1025576 1017292 8284 0 8208 43160 -/+ buffers/cache: 965924 59652 Swap: 2096472 361012 1735460 

我想我可以build立一个每天优雅地反弹阿帕奇的cronjob,但是这看起来像是一个快速和肮脏的解决scheme。 我宁愿find原因并解决这个问题。

UPDATE 2009-10-28 14:38; 5分钟内每10秒钟取样,平均值:

 $ sar -W 10 30 && date Linux 2.6.18-92.el5 (myserver.com) 10/28/2009 02:32:36 PM pswpin/s pswpout/s 02:32:46 PM 10.31 30.43 02:32:56 PM 2.30 32.93 02:33:06 PM 21.56 0.00 02:33:16 PM 1.80 0.00 02:33:26 PM 5.69 26.67 02:33:36 PM 0.10 0.00 02:33:46 PM 25.70 7.60 02:33:56 PM 10.61 7.11 02:34:06 PM 4.10 2.60 02:34:16 PM 0.70 0.00 02:34:26 PM 0.00 0.00 02:34:36 PM 0.00 0.00 02:34:46 PM 3.80 0.00 02:34:56 PM 0.00 0.00 02:35:06 PM 0.00 11.01 02:35:16 PM 7.70 30.30 02:35:26 PM 20.32 0.00 02:35:36 PM 1.60 0.00 02:35:46 PM 11.60 0.00 02:35:56 PM 2.50 0.00 02:36:06 PM 0.00 0.00 02:36:16 PM 3.60 0.00 02:36:26 PM 0.00 0.00 02:36:36 PM 0.00 0.00 02:36:46 PM 0.00 0.00 02:36:56 PM 445.20 56.60 02:37:06 PM 0.00 0.00 02:37:16 PM 0.00 0.00 02:37:26 PM 0.00 0.00 02:37:36 PM 0.00 0.00 Average: 19.31 6.84 Wed Oct 28 14:37:36 PDT 2009 

奇怪的是,阿帕奇今天早上并不慢。 我对昨天启动的服务器数量,服务器数量,最大服务器数量等做了一些调整。 让我得到旧的价值观,并比较…

来自/etc/httpd/conf/httpd.conf的原始值:

 StartServers 20 MinSpareServers 20 MaxSpareServers 120 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000 

从各方面来看,新的价值观似乎都很好:

 StartServers 30 MinSpareServers 30 MaxSpareServers 40 ServerLimit 50 MaxClients 50 MaxRequestsPerChild 4000 

我可能会继续稍微调整这些设置,但现在看起来确实很好。

Sar今天上午再次命令:

 $ sar -W 10 30 && date Linux 2.6.18-92.el5 (myserver.com) 10/29/2009 09:31:09 AM pswpin/s pswpout/s 09:31:19 AM 5.80 54.40 09:31:29 AM 62.10 0.00 09:31:39 AM 0.00 0.00 09:31:49 AM 0.00 0.00 09:31:59 AM 0.00 0.00 09:32:09 AM 3.30 0.00 09:32:19 AM 2.70 0.00 09:32:29 AM 0.00 0.00 09:32:39 AM 0.00 0.00 09:32:49 AM 0.00 0.00 09:32:59 AM 3.10 0.00 09:33:09 AM 5.80 0.00 09:33:19 AM 0.00 0.00 09:33:29 AM 0.00 0.00 09:33:39 AM 0.00 0.00 09:33:49 AM 0.00 0.00 09:33:59 AM 0.00 0.00 09:34:09 AM 0.00 0.00 09:34:19 AM 0.00 0.00 09:34:29 AM 0.00 0.00 09:34:39 AM 4.00 0.00 09:34:49 AM 0.10 0.00 09:34:59 AM 0.00 0.00 09:35:09 AM 4.80 0.00 09:35:19 AM 0.00 0.00 09:35:29 AM 291.29 0.00 09:35:39 AM 0.00 0.00 09:35:49 AM 0.80 0.00 09:35:59 AM 0.00 0.00 09:36:09 AM 0.00 0.00 Average: 12.78 1.81 Thu Oct 29 09:36:09 PDT 2009 

平均实际上更低! 而且服务器的stream量比昨天还多。 Womble,看来你是对的! 现在宇宙中的一切都好了。

John Gardeniers,好主意! 只是为了这个,就得到了-o [filename]开关。 谢谢你的提示!

Jeremy Visser, dstat是一个非常dstat工具! 谢谢你的提示! 它没有安装,只好yum install dstat

基于你的free输出,我强烈的怀疑你的Apache进程被埋在交换中。 sar -W 1 0的输出将确认(或驳斥)这个假设(当机器运行缓慢时运行)。

如果Apache进程并不是所有的实际服务请求(如mod_status所示),则应调整“备用”subprocess的数量(使用MaxSpareServers),以便更快地获得收益(因此不会耗费内存)。 如果你真的需要你运行的孩子的数量来服务请求负载,你将需要更多的内存(我会直接与另一个1GB去; RAM是便宜的,诊断时间不是)。

什么是消耗所有记忆的过程? 在任何apache重新启动之前尝试iostat / vmstat – 可能是一个I / O问题。

对于趋势监测,我build议使用munin / colectd(那些甚至非常有用的apache(对于你来说尤其是)插件)。