设为首页 收藏本站
查看: 1752|回复: 0

[经验分享] 使用XHProf查找PHP性能瓶颈

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-2-28 09:36:52 | 显示全部楼层 |阅读模式
XHProf是facebook 开发的一个测试php性能的扩展。
安装Xhprof扩展$ wget http://pecl.php.net/get/xhprof-0.9.4.tgz$ tar -zxvf xhprof-0.9.4.tgz$ cd xhprof-0.9.4$ cd extension/$ phpize$ ./configure$ make$ sudo make install
修改php.ini
[xhprof]extension=xhprof.soxhprof.output_dir=/tmp
配置中xhprof.output_dir指定了生成的profile文件存储的位置,我们将其指定为/tmp。
对PHP进行性能分析
在XHProf扩展中,一共提供了四个函数用于对PHP进行性能分析。
xhprof_enable/xhprof_sample_enable函数用于开始XHProf性能分析,区别在于前者功能更加强大,而后者则是是以简单模式启动性能分析(简单记录了函数的调用栈信息),开销比较小。
xhprof_disable/xhprof_sample_disable函数用于停止性能分析,并返回分析的数据。
需要特别说明的函数是xhprof_enable,其他函数都是不需要提供参数的,而该函数则可以接受两个可选的参数,用于改变该工具的行为。
void xhprof_enable ([ int $flags = 0 [, array $options ]] )
  • flags 该参数用于为剖析结果添加额外的信息,该参数的值使用以下宏,如果需要提供多个值,使用|进行分隔。

    • XHPROF_FLAGS_NO_BUILTINS 跳过所有的内置函数
    • XHPROF_FLAGS_CPU 添加对CPU使用的分析
    • XHPROF_FLAGS_MEMORY 添加对内存使用的分析

  • options 数组形式提供可选参数,在此处提供ignored_functions选项需要忽略的函数

比如下面的例子,同时对内存和CPU进行分析,并且忽略对call_user_func和call_user_func_array函数的分析。
xhprof_enable(    XHPROF_FLAGS_MEMORY|XHPROF_FLAGS_CPU,    [        'ignored_functions'        => [            'call_user_func',            'call_user_func_array'        ]    ]);// 这里是PHP代码,比如业务逻辑实现等要被分析的代码部分....$xhprofData = xhprof_disable();// $xhprofData是数组形式的分析结果print_r($xhprofData);
注意,如果使用XHPROF_FLAGS_CPU选项对CPU占用也进行分析,在Linux环境下,会造成比较高的系统负载,因此不建议使用,而推荐只使用XHPROF_FLAGS_MEMORY,对内存的分析不会对系统造成太多负载。
形象化的查看分析结果
使用xhprof_disable完成性能分析并且获取到分析结果之后,我们通常不会直接输出结果,因为这样的结果是以数组形式组织的,看起来并不直观,幸运的是,xhprof提供了基于web的图形界面对分析结果进行查看。
在使用之前,请先确保服务器安装了graphviz工具,否则在生成监控图表的时候回出现以下错误:
failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '
这里提示找不到dot命令,所以需要先安装graphviz
$ sudo yum install graphviz
由于分析结果的查看工具是基于web的,因此,我们需要将xhprof安装包中的xhprof_html和xhprof_lib目录放到服务器的web目录下,让xhprof_html目录中的内容对外可以访问。
比如我的测试服务器环境是使用vagrant搭建的Cent OS,我见过这两个目录放到/vagrant/xhprof目录下:
[vagrant@localhost xhprof]$ pwd/vagrant/xhprof[vagrant@localhost xhprof]$ lsxhprof_html  xhprof_lib
web服务器使用的是Nginx,因此,在Nginx的配置文件nginx.conf中的配置如下:
server {    listen       80;    server_name  _;    root /vagrant;    ...
web服务器的根目录是/vagrant,因此访问地址为http://localhost/xhprof/xhprof_html/index.php.
当然,配置好环境之后,我们还是获取不到分析结果的,因为我们在代码中并没有将分析结果保存到xhprof.output_dir指定的目录中。
因此,我们需要修改我们的代码,是其能够将分析结果存放到xhprof.output_dir指定的目录中。
....$xhprofData = xhprof_disable();require '/vagrant/xhprof/xhprof_lib/utils/xhprof_lib.php';require '/vagrant/xhprof/xhprof_lib/utils/xhprof_runs.php';$xhprofRuns = new XHProfRuns_Default();$runId = $xhprofRuns->save_run($xhprofData, 'xhprof_test');echo 'http://localhost/xhprof/xhprof_html/index.php?run=' . $runId . '&source=xhprof_test';
变量$runId是本次请求生成分析结果的id,最后我们输出了一个链接地址,使用改地址就可以看到本次请求的分析结果。
xhprof_1.jpg
注意到中间的View Full Callgraph链接,通过该链接我们可以看到图形化的分析结果。
xhprof_2.jpg
图中红色的部分为性能比较低,耗时比较长的部分,我们可以根据根据哪些函数被标记为红色对系统的代码进行优化。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-42820-1-1.html 上篇帖子: php的Socket通信以及出现的错误 下篇帖子: PHP获得客户端IP
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表