xhprof学习笔记

Posted on 2014-03-26 22:50  彭海波  阅读(219)  评论(0编辑  收藏  举报

一、简介

XHProf 是一个轻量级的分层性能测量分析器。 在数据收集阶段,它跟踪调用次数与测量数据,展示程序动态调用的弧线图。 它在报告、后期处理阶段计算了独占的性能度量,例如运行经过的时间、CPU 计算时间和内存开销。 函数性能报告可以由调用者和被调用者终止。 在数据搜集阶段 XHProf 通过调用图的循环来检测递归函数,通过赋予唯一的深度名称来避免递归调用的循环。

XHProf 包含了一个基于 HTML 的简单用户界面(由 PHP 写成)。 基于浏览器的用户界面使得浏览、分享性能数据结果更加简单方便。 同时也支持查看调用图。

XHProf 的报告对理解代码执行结构常常很有帮助。 比如此分层报告可用于确定在哪个调用链里调用了某个函数。

XHProf 对两次运行进行比较(又名 "diff" 报告),或者多次运行数据的合计。 对比、合并报告,很像针对单次运行的“平式视图”性能报告,就像“分层式视图”的性能报告。

更多额外文档可以在 » facebook xhprof 上找到。

 

二、安装/配置

1. 安装xhprof

  1. wget http://pecl.php.net/get/xhprof-0.9.2.tgz  
  2. tar zxvf  xhprof-0.9.2.tgz  
  3. cp ./xhprof-0.9.2.tgz ./www         //xhprof自身带有一个web版的分析页面,放到我的web服务器下面  
  4. cd xhprof-0.9.2/extension  
  5. /usr/local/php/bin/phpize  
  6. ./configure --enable-xhprof --with-php-config=/usr/local/php/bin/php-config  //php安装目录
  7. make && make install  

2. 安装graphviz,一个画图工具
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
tar zxf graphviz-2.24.0.tar.gz
cd graphviz-2.24.0
./configure
make && make install

遇到的错误
1)Error: either we can not find profile data for run_id 4d7f0bd99a12f or the threshold 0.01 is too small or you do not have ‘dot’ image generation utility installed.
解决绘图工具GOOGLE了半天找了一片文章说:xhprof绘制的是png图,系统(graphviz-2.24.0)不支持。才知道绘图的dot拓         展没装成功。我的操作系统是CENTOS5.5的,也就是dot 不支持PNG。

3. 配置

  1. [xhprof]  
  2.  extension=xhprof.so  
  3.  xhprof.output_dir=/home/zhangy/xhprof  //如果不加存放目录的话,默认是放在/tmp下面  
  4. 将解压后的xhprof_html和xhprof_lib两个文件复制到apache的www目录下,www目录为服务器设置的访问路径

三、XHProf测试

前面我们说过了,XHProf自身带有一个web版的测试工具,里面还有一个小例子。看一下这个例子,我做了一点修改和注释

  1. <?php  
  2. function bar($x) {  
  3.  if ($x > 0) {  
  4.  bar($x -1);  
  5.  }  
  6. }  
  7. function foo() {  
  8.  for ($idx = 0; $idx < 5; $idx++) {  
  9.  bar($idx);  
  10.  $x = strlen("abc");  
  11.  }  
  12. }  
  13.   
  14. //启动xhprof  
  15. xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);  
  16.   
  17. //调用foo函数,也是我们要分析的函数  
  18. foo();  
  19.   
  20. //停止xhprof  
  21. $xhprof_data = xhprof_disable();  
  22.   
  23. //取得统计数据  
  24. print_r($xhprof_data);  
  25.   
  26. $XHPROF_ROOT = realpath(dirname(__FILE__) . '/..');  
  27. include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";  
  28. include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";  
  29.   
  30. //保存统计数据,生成统计ID和source名称  
  31. $xhprof_runs = new XHProfRuns_Default();  
  32. $run_id = $xhprof_runs->save_run($xhprof_data"xhprof_foo"); //source名称是xhprof_foo  
  33.   
  34. //弹出一个统计窗口,查看统计信息  
  35. echo "<script language='javascript'>window.open('../xhprof_html/index.php?run=" . $run_id . "&source=xhprof_foo');</script>";  
  36. ?>  

运行程序,底部出现统计字样,点过去就可以看到性能分析了。按运行时间排序,很容易找出化时间最长的函数。
点[View Full Callgraph]图形化显示,最大的性能问题会用红色标出,其次是黄色,很明显。以下是部分的结果:

  1. [foo==>bar] => Array  
  2.  (  
  3.  [ct] => 5       //bar()这个函数被调用了5次  
  4.  [wt] => 63      //每次运行bar()所要的时间,不知道这个是不是平均值  
  5.  [cpu] => 0      //每次运行bar(),cpu运算时间  
  6.  [mu] => 2860    //每次运行bar(),php所使用内存的改变  
  7.  [pmu] => 0      //每次运行bar(),php在内存使用最高峰时,所使用内存的改变  
  8.  )  

 

Copyright © 2024 彭海波
Powered by .NET 8.0 on Kubernetes