为什么 apache 会在一夜之间变慢?

jed*_*awk 6 linux performance apache-2.2

问候专家,

在我的专用 CentOS 5.4 服务器上,我为 apache 配置了大​​约十几个虚拟主机。我测试了几个,每个都在大约一秒钟内加载;相当快。平均负载小于 1。没问题。我正在运行静态 HTML 站点,一个使用 MySQL 5.0 的 WordPress 博客……这些不是高带宽站点;没有什么会给这台服务器带来压力。

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

# apachectl -k graceful
Run Code Online (Sandbox Code Playgroud)

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

检查 /server-status 时,不会发生很多事情;检查网络流量(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
Run Code Online (Sandbox Code Playgroud)

我想我可以设置一个每天优雅地反弹 apache 的 cronjob,但这似乎是一个快速而肮脏的解决方案。我宁愿找到原因并解决它。

更新 2009-10-28 14:38; 在五分钟内每 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
Run Code Online (Sandbox Code Playgroud)

奇怪的是,今天早上 apache 并不慢。昨天,我对启动的服务器数量、备用服务器数量、服务器最大数量等进行了一些调整。让我获取旧值并进行比较...

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

StartServers      20
MinSpareServers   20
MaxSpareServers  120
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
Run Code Online (Sandbox Code Playgroud)

从各方面来看,新值似乎都运行良好:

StartServers     30
MinSpareServers  30
MaxSpareServers  40
ServerLimit      50
MaxClients       50
MaxRequestsPerChild  4000
Run Code Online (Sandbox Code Playgroud)

我可能会继续稍微调整这些设置,但它们现在似乎运行良好。

今天早上 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
Run Code Online (Sandbox Code Playgroud)

平均水平实际上更低!并且服务器获得了比昨天更多的流量。Womble,看来你是对的!现在,宇宙中的一切都恢复了。

约翰·园丁,好主意!它的-o [filename]开关就是为了这个。谢谢你的提示!

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

wom*_*ble 7

根据您的free输出,我强烈怀疑您的 Apache 进程被大量埋没在交换中。的输出sar -W 1 0将确认(或反驳)这个假设(当机器运行缓慢时运行它)。

如果 Apache 进程实际上并非都在处理请求(如 mod_status 所示),您应该调整“备用”子进程的数量(使用 MaxSpareServers),以便更快地获取它们(因此不会消耗 RAM)。如果你真的需要你正在运行的孩子数量来为请求负载提供服务,你将需要更多的 RAM(我会直接再使用 1GB;RAM 很便宜,诊断时间不是)。

  • 为什么不通过 cron 定期运行命令,输出到文件,这样你也可以看到全天的趋势? (2认同)
  • 要确认这一点,请查看 dstat。dstat 可以告诉你很酷的事情,比如实时分页信息(即在最后一秒从交换中检索了多少)。尝试在早上运行 dstat,然后从您的服务器获取一个页面并查看发生了什么问题(例如磁盘、CPU、网络、分页)。 (2认同)