我们运营的中型网站每天可获得数十万次综合浏览量。直到上周末,我们在虚拟机上运行的负载通常低于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。
那么,我们的下一步应该是什么?是否有任何我们忽略/不了解的分析方法?
答案 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)
我无法向你保证的另一种选择会带来任何好处,但这不仅值得付出努力。是阅读新版本的详细更改日志,并查看可能会对您产生远程影响的更改内容。
通过更改日志已经不止一次地拯救了我。特别是当一些配置选项已经改变并且某些东西被弃用时。最糟糕的情况是它会给你一些关于下一步的信息