我们经营一个中型网站,每天获得几十万个网页浏览量.直到上周末,我们在虚拟机上的负载通常低于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.
那么,下一步应该是什么呢?有没有我们忽视/不知道的分析方法?
答案最终不是 – Apache相关.如前所述,我们在虚拟机上.我们的用户会话很大(每个活跃用户需要500kB),所以我们有很多磁盘IO.磁盘几乎已经满了,这意味着Ubuntu花了很多时间移动(我们认为).没有简单的方法来扩展磁盘(因为它没有为VMWare设置正确).这完全丧失了性能,Apache和MysqL偶尔会使用100%的cpu(在很短的时间内),并且系统会如此缓慢地更新似乎被卡在那里的cpu使用率.
我们最终设置了一个新的虚拟机(这也使我们有机会彻底地记录服务器上的所有内容).在新的VM上,我们分配了大量的磁盘空间,并将会话移入内存(使用memcached).在非高峰使用情况下,我们的负载下降到0.2,在高峰使用情况下(在2 cpu虚拟机上)约为1.将会话移动到memcached中占用大量磁盘IO(我们不断使用大约2MB / s的磁盘IO,这是非常糟糕的).
结论;有时你只需要重新开始…