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

vic*_*ooi 7 tuning max-requests apache-2.2

我们有一个中等流量的站点(大约每天 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>
Run Code Online (Sandbox Code Playgroud)

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

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$
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以找出到底发生了什么?我对 Apache 的内部结构的理解不是那么好,但我认为我们不需要这么多并发进程来提供这样的页面,具有这种流量。我们确实继承了这个应用程序,所以我们对它的内部了解不多,但它是一个相当基本的CMS类型的站点,显示一些搜索结果,我认为它不需要这种咕噜声。

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

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

干杯,维克多

cag*_*nut 2

450 个孩子,每个 RSS 大小约为 10mb,潜在内存使用量超过 4GB。足以导致您的 c1.small 实例进行交换。对于 apache 服务器来说,交换几乎总是螺旋式下降。

我想说接下来我要检查的几件事是
- apache 错误日志是否提到命中 maxclients
- dmesg 或 /var/log/messages 是否提到 OOM 杀手
- 服务器是否交换
- 内存使用情况生长缓慢而稳定或尖峰/快速发生

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

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