Apache使用过多的CPU

时间:2008-10-06 10:01:18

标签: php mysql performance apache

我们运营的中型网站每天可获得数十万次综合浏览量。直到上周末,我们在虚拟机上运行的负载通常低于0.2。操作系统是Ubuntu。

在部署最新版本的应用程序时,我们在部署之前也进行了apt-get dist-upgrade。在我们部署之后,我们注意到CPU上的负载急剧上升(有时达到10并且停止响应页面请求)。

我们尝试从PHP中转储一整分钟的Xdebug性能分析数据,但仔细观察它只显示了一些有点慢的部分,但没有什么可以解释这个巨大的跳跃。

我们现在很确定我们网站新版本中的任何内容都没有触发问题,但我们无法确定。我们已经回滚了很多变化,但问题仍然存在。

在查看进程时,我们发现单个Apache进程在更长的时间内使用相当多的CPU而不是严格必要的。但是,在受影响的流程上使用strace时,除了

之外我们什么都看不到
accept(3,

它在收到新连接之前会挂起一段时间,所以我们实际上无法看到导致问题的原因。

堆栈是PHP 5,Apache 2(prefork),MySQL 5.1。大多数东西都通过Memcached运行。我们尝试过APC和eAccelerator。

那么,我们的下一步应该是什么?是否有任何我们忽略/不了解的分析方法?

5 个答案:

答案 0 :(得分:12)

答案最终与Apache无关。如上所述,我们在虚拟机上。我们的用户会话非常大(每个活动用户认为500kB),所以我们有很多磁盘IO。磁盘几乎已满,这意味着Ubuntu花了很多时间来处理事物(或者我们认为)。没有简单的方法来扩展磁盘(因为它没有为VMWare正确设置)。这完全破坏了性能,Apache和MySQL偶尔会使用100%的CPU(很短的时间),并且系统在更新CPU使用率表时会很慢,而且似乎卡在那里。

我们最终设置了一个新的VM(这也让我们有机会彻底记录服务器上的所有内容)。在新VM上,我们分配了大量磁盘空间,并将会话移动到内存中(使用memcached)。我们的负载在非高峰时使用时降至0.2,并且在接近峰值时使用(在2-CPU VM上)约为1。将会话移动到memcached会占用大量磁盘IO(我们经常使用大约2MB / s的磁盘IO,这非常糟糕)。

结论;有时你只需要重新开始... :)

答案 1 :(得分:5)

从Apache进程看到一个accept()调用并不常见 - 那就是等待新请求的web服务器。

首先,您要确定负载的参数是什么。像

这样的东西
vmstat 1

将向您显示系统的功能。查看'swap'和'io'列。如果在'si'和'so'列中看到除“0”以外的任何内容,则系统会因内存不足而进行交换。考虑减少运行Apache子节点的数量,或者在服务器中投入更多RAM。

如果RAM不是问题,请查看“cpu”列。您对'us'和'sy'列感兴趣。这些显示了在用户进程或系统中花费的CPU时间百分比。高'us'数字指向Apache或您的脚本 - 或者可能是服务器上的其他内容。

运行

top

将显示哪些进程最活跃。

您排除了数据库吗?我在生产LAMP堆栈上看到的意外高负载的最常见原因归结为数据库查询。您可能已经使用昂贵的查询部署了新代码;或者到了数据集中有足够行的地方,导致以前便宜的查询变得昂贵。

在高负荷期间,请执行

echo "show full processlist" | mysql | grep -v Sleep

查看是否存在长时间运行的查询,或者同时运行大量相同的查询。其他mysql工具将帮助您优化这些。

您可能会发现为Apache配置和使用mod_status很有用,这样您就可以看到每个Apache子服务器的服务请求以及服务时间。

最后,设置一些长期统计监控。像zabbix这样的东西很容易配置,并且可以让你随着时间的推移监控资源的使用情况,这样如果事情变得缓慢,你就会有历史基线来比较,以及更好的问题何时开始。

答案 2 :(得分:1)

也许你之前使用过工人MPM,现在你不是?

我知道PHP5不能与Worker MPM一起使用。在我的Ubuntu服务器上,PHP5只能与Prefork MPM一起安装。似乎PHP5模块与Apache的多线程版本不兼容。

我在此处找到了一个链接,告诉您如何使用mod_fcgid

获得更好的效果

要查看哪位工作人员MPM看到here

答案 3 :(得分:1)

我会使用dTrace来解决这个谜......如果它在Solaris或Mac上运行......但由于Linux没有它,你可能想尝试他们的Systemtap,但我可以'因为我没有使用它,所以要说明它的可用性。

使用dTrace,您可以轻松地在一天之内嗅出匪徒,并希望使用Systemtap它会是类似的

答案 4 :(得分:0)

我无法向你保证的另一种选择会带来任何好处,但这不仅值得付出努力。是阅读新版本的详细更改日志,并查看可能会对您产生远程影响的更改内容。

通过更改日志已经不止一次地拯救了我。特别是当一些配置选项已经改变并且某些东西被弃用时。最糟糕的情况是它会给你一些关于下一步的信息