Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Apache使用过多的CPU_Php_Mysql_Performance_Apache - Fatal编程技术网

Php Apache使用过多的CPU

Php Apache使用过多的CPU,php,mysql,performance,apache,Php,Mysql,Performance,Apache,我们经营一个中型网站,每天有几十万的浏览量。直到上周末,我们在虚拟机上运行的负载通常低于0.2。操作系统是Ubuntu 在部署最新版本的应用程序时,我们在部署之前还进行了apt get dist升级。部署之后,我们注意到CPU上的负载急剧增加(有时达到10并停止响应页面请求) 我们试图从PHP中转储整整一分钟的Xdebug评测数据,但仔细查看,只发现了一些稍慢的部分,但无法解释这一巨大飞跃 我们现在非常确定,我们网站的新版本中没有任何东西会引发这个问题,但我们无法确定。我们已经回滚了很多更改,但

我们经营一个中型网站,每天有几十万的浏览量。直到上周末,我们在虚拟机上运行的负载通常低于0.2。操作系统是Ubuntu

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

我们试图从PHP中转储整整一分钟的Xdebug评测数据,但仔细查看,只发现了一些稍慢的部分,但无法解释这一巨大飞跃

我们现在非常确定,我们网站的新版本中没有任何东西会引发这个问题,但我们无法确定。我们已经回滚了很多更改,但问题仍然存在

在查看进程时,我们看到单个Apache进程在一段比严格必要的更长的时间内使用了相当多的CPU。然而,当在受影响的进程上使用strace时,我们只能看到

accept(3,
在接收到新连接之前,它会挂起一段时间,因此我们无法看到问题的真正原因

堆栈是PHP5、Apache2(prefork)、MySQL 5.1。大多数东西都是通过Memcached运行的。我们试过APC和每个加速器


那么,我们下一步该做什么?是否有我们忽略/不知道的评测方法?

也许您以前在哪里使用worker MPM,现在却没有

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

我在这里找到了一个链接,它将向您展示如何使用


要了解worker MPM是什么,请参见。

我将使用dTrace来解决这个谜团。。。如果它在Solaris或Mac上运行。。。但是由于Linux没有它,你可能想试试他们的,但是我不能说任何关于它的可用性,因为我没有使用过它


使用dTrace,您可以在一天内轻松地嗅出罪犯,并希望使用Systemtap,这将是类似的

另一种选择,我不能保证您会做任何好事,但这是非常值得的。阅读新版本的详细更改日志,并查看可能会对您产生远程影响的更改

查看变更日志不止一次地救了我。尤其是当某些配置选项发生更改,某些配置被弃用时。最糟糕的情况是,它会给你一些线索,告诉你下一步该去哪里看

看到来自Apache进程的accept()调用一点也不奇怪——那就是Web服务器在等待一个新的请求

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

vmstat 1
将向您展示您的系统的功能。查看“交换”和“io”列。如果在“si”和“so”列中看到除“0”以外的任何内容,则系统正在交换,因为内存不足。考虑减少运行Apache的孩子的数量,或者在服务器中扔更多的RAM。< /P> 如果RAM不是问题,请查看“cpu”列。你对“我们”和“sy”专栏感兴趣。它们显示了用户进程或系统中CPU时间的百分比。较高的“us”数字指向Apache或您的脚本,或者服务器上的其他东西

运行

top
将向您显示哪些进程最活跃

你排除了你的数据库吗?我在生产灯堆栈上看到的意外高负载最常见的原因是数据库查询。您可能部署了新代码,其中包含昂贵的查询;或者,数据集中有足够的行,导致以前便宜的查询变得昂贵

在高负荷期间,请执行以下操作:

echo "show full processlist" | mysql | grep -v Sleep
查看是否存在长时间运行的查询,或者是否同时运行大量相同的查询。其他mysql工具将帮助您优化这些

您可能会发现为Apache配置和使用mod_status很有用,这将允许您查看每个Apache子级正在服务什么请求以及它已经服务了多长时间


最后,建立一些长期的统计监测。像zabbix这样的东西配置起来很简单,可以让您随着时间的推移监控资源使用情况,这样,如果事情进展缓慢,您就可以与历史基线进行比较,并且可以更好地了解问题开始的时间。

答案与Apache无关。如前所述,我们在一台虚拟机上。我们的用户会话非常大(每个活动用户500kB),所以我们有很多磁盘IO。磁盘几乎满了,这意味着Ubuntu花了很多时间移动东西(或者我们认为是这样)。扩展磁盘没有简单的方法(因为没有为VMWare正确设置磁盘)。这完全扼杀了性能,Apache和MySQL偶尔会使用100%的CPU(在很短的时间内),而且系统更新CPU使用率表的速度会非常慢,以至于似乎被卡住了

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


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

出于想法,我恐怕我认为您可能在旧版本的应用程序中使用了php4,而现在由于php5 APAPPCHE的升级以预工作模式运行。您的旧版本应用程序是否使用php4?可能有一个月了。我们在每次部署之前进行升级。但是,在出现此问题后,我们可能会停止这样做…:)从哪个版本到