我们有一个中等流量的网站(每天大约有 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 左右,这样在您的请求一波一波地涌来时线程就不会消亡。