Apache2 PHP 站点 - 达到 MaxClients 限制 - 诊断?

Apache2 PHP 站点 - 达到 MaxClients 限制 - 诊断?

我们有一个中等流量的网站(每天大约有 20,000 次点击量),在 Apache 2.2、Ubuntu 9.10 服务器上运行 PHP/MySQL 应用程序,来自 Amazon EC2 c1.small 实例(1.7 Gb RAM)。

我们遇到了网站反复无响应的问题。作为一个卑鄙的黑客,我将 MaxClients/ServerLimit 设置为 450。

<IfModule mpm_prefork_module>
KeepAlive           On
KeepAliveTimeout     7
StartServers          5
MinSpareServers       5
MaxSpareServers      10
MaxClients          450
ServerLimit         450
MaxRequestsPerChild   0
</IfModule>

该网站似乎比以前运行的时间更长,但仍然死机。检查进程列表,我有(第三列是物理内存,第四列是虚拟大小):

xxxxxxxxx@domU-XXXXXXXXX:/etc/apache2$ ps -eo pid,user,rss,vsz,args | grep apache
 2333 root     11092  39084 /usr/sbin/apache2 -k start
 3704 www-data 11060  41292 /usr/sbin/apache2 -k start
 3826 www-data 10016  39844 /usr/sbin/apache2 -k start
 3954 www-data 11976  41612 /usr/sbin/apache2 -k start
 4061 www-data 11844  41668 /usr/sbin/apache2 -k start
 4064 www-data 10988  40676 /usr/sbin/apache2 -k start
 4084 www-data 11804  41428 /usr/sbin/apache2 -k start
 4086 www-data 10192  39828 /usr/sbin/apache2 -k start
 4099 www-data 11876  41748 /usr/sbin/apache2 -k start
 4100 www-data 10980  40668 /usr/sbin/apache2 -k start
 4102 www-data  8952  39724 /usr/sbin/apache2 -k start
 4107 www-data 11856  41860 /usr/sbin/apache2 -k start
 4108 www-data  9952  39604 /usr/sbin/apache2 -k start
 4109 www-data     0      0 [apache2] <defunct>
 4114 www-data  7172  39724 /usr/sbin/apache2 -k start
 4115 www-data 10968  40668 /usr/sbin/apache2 -k start
 4122 www-data 11888  41844 /usr/sbin/apache2 -k start
 4123 www-data 11584  41444 /usr/sbin/apache2 -k start
 4124 www-data  7036  39596 /usr/sbin/apache2 -k start
 4125 www-data  6744  39084 /usr/sbin/apache2 -k start
 4126 www-data  9532  39552 /usr/sbin/apache2 -k start
 4127 www-data 10112  39812 /usr/sbin/apache2 -k start
 4128 www-data  6600  39084 /usr/sbin/apache2 -k start
 4129 www-data  6736  39084 /usr/sbin/apache2 -k start
 4130 www-data  7004  39596 /usr/sbin/apache2 -k start
 4131 www-data  6740  39084 /usr/sbin/apache2 -k start
 4132 www-data 11616  41596 /usr/sbin/apache2 -k start
 4134 www-data  7024  39588 /usr/sbin/apache2 -k start
 4135 www-data 11808  41516 /usr/sbin/apache2 -k start
 4136 www-data  7008  39460 /usr/sbin/apache2 -k start
 4137 www-data  6988  39460 /usr/sbin/apache2 -k start
 4139 1003       796   3040 grep --color=auto apache
victorhooi@domU-12-31-39-02-B6-34:/etc/apache2$

有没有一种简单的方法可以找出到底发生了什么?我对 Apache 内部的了解不是很好,但我认为我们不需要这么多并发进程来提供这样的页面,而且流量也很大。我们确实继承了该应用程序,所以我们对它的内部情况了解不多,但这是一个相当基本的 CMS 类型网站,显示了一些搜索结果,我认为它不需要这种繁琐的工作。

我确实对该网站运行了 ab,得到的请求率相当糟糕(远低于每秒 50 个),但这可能是我设置选择不当造成的 —— 很多请求似乎都失败了。

我应该在哪里寻找有关正在发生的事情的信息,或者我可以尝试的任何故障排除技巧?

欢呼吧,维克多

答案1

450 个子节点,每个节点的 RSS 约为 10mb,潜在内存使用量超过 4GB。这足以导致您的 c1.small 实例进行交换。对于 Apache 服务器来说,交换几乎总是一个恶性循环。

我想说的是,接下来我要检查的几件事是
- apache 错误日志是否提到达到 maxclients
- dmesg 或 /var/log/messages 是否提到 OOM killer
- 服务器是否在交换
- 内存使用量增长是缓慢而稳定的还是突然/快速增长的

前两个只是查看 txt 文件。第三个你可以使用 cli,但图表会有所帮助,第四个你需要图表。设置 apache 的 mod_status(可能已经存在,只需取消注释)并将 munin/collectd/cacti 指向它。

如果您确认原因是内存耗尽和交换,那么您可以做很多事情。首先,您可以将 maxclients 降低到 150 左右。这样可以为其他内容和文件系统缓存留出一些空间(mysql 放在这里?如果是,留出更多空间)。RSS 是一个粗略的指标,可以像这样推断,这就是我们所得到的。一旦您对其进行了调整,请观察一段时间内的图表,看看您是否有上升或下降的空间。从那里您可以专注于 1.) 更精简的 apache 子项(更少的模块,收紧 php 配置)2.) 让 apache 做得更少(混合 cdn、替代 http 服务器和 http 代理选项)3.) 升级 $$$

答案2

您可能打开了与服务器的长连接,但超时时间较长。随着更多客户端继续连接,它们会占用越来越多的 Apache 进程。开启长连接后,每个客户端都可以与您的服务器建立 1 个(或更多)连接。

查看此处了解更多信息: http://httpd.apache.org/docs/1.3/misc/perf-tuning.html

答案3

我将一系列性能调优技巧整合到http://www.anchor.com.au/hosting/dedicated/improving-server-capacity最近在工作中使用它;它对我最近应用它的机器来说效果很好。除此之外,如果这是一个更广泛的机器性能问题,可能不是 Apache 特有的,我还有一篇更深入的文章http://www.anchor.com.au/hosting/development/HuntingThePerformanceWumpus其中包括识别系统的哪个组件导致了问题。

答案4

您还可以尝试告诉 Apache 以 50 个进程(StartServers 50)启动,这样它在启动时就不必经历整个服务器扩展例程,尝试将最大备用服务器数量增加到 20 左右,这样在您的请求一波一波地涌来时线程就不会消亡。

相关内容