剖析Apache + Mysql + PHP服务器 – 哪个是瓶颈?

如何分析Linux + Apache + Mysql + PHP服务器的速度?

我有一个运行在Ubuntu 8.04上的大量修改过的MediaWiki实例的服务器。 这有点迟缓 – 我还没有做任何优化,所以我相信有很多低洼的成果可以让它更快一点。

但为了优化你需要先测量。 如何找出哪些组件(Apache,Php,Mysql)占用了大量时间来为页面服务?

那么当你分析这样的事情来find瓶颈时,你需要一个一个的排除事情。 你需要一个基线来比较。 如果你安装了“ab”工具(它带有apache),你可以使用它。

为了得到你的基线,我build议至less得到几百个请求的平均值。 这是一个例子:

$ ab -n 400 http://yousite/ 

查看“每个请求的时间”行的结果,它看起来像这样:

 Time per request: 96.031 [ms] (mean) 

记下那个时间,因为这是基线。

要排除Apache作为罪魁祸首在您的服务器上创build一个静态页面(只保存一个页面,你认为缓慢/呆滞的HTML),并再次运行AB。

把一些PHP放到静态页面中。 它不一定是大量的,但它应该实际上做一些工作。 MediaWiki是相当不错的代码,所以如果你的系统有一个PHP瓶颈,那么我的钱就会把实际的PHP堆栈加载到内存中,然后再次执行testing。

看看这三个数字,看看下一步之间最大的跳跃。 我敢打赌,MySQL是三者中速度最慢的一个,但它很可能是你正在加载一个页面上的很多图像,放慢总的请求时间,在这种情况下,你可能想重新考虑devise的页。

Zombat和Frank Farmer在Stack Overflow 697802有几个很好的build议(我喜欢慢速查询build议,我自己)。 ab for apache对于testing你所做的改变也是非常有用的。

我们运行了一个很好的MediaWiki安装,我们很快注意到MediaWiki从一个memcached实例中受益匪浅。 否则,每次请求都要加载大量的语言文件和用户数据。

另外非常重要的是prefork模块的configuration..我大大减less了/etc/apache2/apache2.conf的特定部分中的数字..从那时起,我有大量的延迟,在那里页面将停滞长达一分钟在完成加载之前…使用drupal的trace和devel模块进行跟踪,以及使用xdebug进行分析使我无能为力。我设置了APC并对MYSQL conf进行了修改,但罪魁祸首实际上是prefork模块的值太小。那些到一个适度和充足的水平,现在服务器回来闪电快。 注意这些数字,如果你有莫名的高页面执行时间….

 <IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 # original values: # MaxSpareServers 10 # MaxClients 150 # far too conservative experimental values: # MaxSpareServers 5 # MaxClients 5 # good compromise: MaxSpareServers 10 MaxClients 20 MaxRequestsPerChild 0 </IfModule> 

这些值适用于512MiB RAM + 256MiB交换的虚拟主机环境。祝您好运,find您的服务器的最佳select;)