基于在生产环境中使用php性能测试工具xhprof的详解


Posted in PHP onJune 03, 2013

xhprof 是facebook开源出来的一个php性能测试工具,也可以称之为profile工具,这个词不知道怎么翻译才比较达意。跟之前一直使用的xdebug相比,有很多类似之处。以前对xdebug有一些记录还可以供参考,但是它的缺点是对性能影响太大,即便是开启了profiler_enable_trigger参数,用在生产环境中也是惨不忍睹,cpu立刻就飙到high。
而xhprof就显得很轻量,是否记录profile可以由程序控制,因此,用在生产环境中也就成为一种可能。在它的文档上可以看到这样一种用法:
以万分之一的几率启用xhprof,平时悄悄的不打枪。

if (mt_rand(1, 10000) == 1) {
 xhprof_enable(XHPROF_FLAGS_MEMORY);
 $xhprof_on = true;
}

在程序结尾处调用方法保存profile
if ($xhprof_on) {
 // stop profiler
 $xhprof_data = xhprof_disable(); // save $xhprof_data somewhere (say a central DB)
 ...
}

也可以用register_shutdown_function方法指定在程序结束时保存xhprof信息,这样就免去了结尾处判断,给个改写的不完整例子:
if (mt_rand(1, 10000) == 1) {
 xhprof_enable(XHPROF_FLAGS_MEMORY);
 register_shutdown_function(create_funcion('', "$xhprof_data = xhprof_disable(); save $xhprof_data;"));
}

至于日志,我暂时用的是最土的文件形式保存,定期清除即可。
BTW:xhprof生成的图形方式profile真是酷毙了,哪段代码成为瓶颈,一目了然。
by phpe:下面是一个例图:

基于在生产环境中使用php性能测试工具xhprof的详解

关于改善xhprof使用情况的设想
自从去年将xhprof用在生产环境以来,对生产环境的程序调试,性能优化都带来很多便利。但是在使用过程中,还是有一些细节需要改善。
问题
xhprof的profile日志直接以文件形式保存在生产服务器上,需要定时清理,或者收集起来移动到查看日志的工具机上。
由于xhprof生成的profile是一个大数组,所以保存到文件时使用了标准的php serialize,日志文件偏大,一个不留神就容易占用很多服务器磁盘空间。
查看日志列表时,一个个点开查看比较费劲。
针对这几个问题,我有一些小小的设想。
日志存放
部署一个中央日志服务器,采用facebook的scribe来收集日志。生产环境的服务器产生的xhprof日志,都写入到scribe的客户端,由客户端自动同步到中央日志服务器的scribe上,不占用本地的存储空间。在代码上的改动也比较小,只要基于iXHProfRuns接口实现一个XhprofRuns类,调整save_run方法的存储方式即可。
更换序列化方法
xhprof默认是将profile信息用php原生的序列化方法处理后进行保存,而我在前两天比较过igbinary vs serialize vs json_encode的性能和占用字节数,这个测试里igbinary在各方面都有一定优势,尤其是占用存储空间会大幅度减小,所以我只要更换序列化方法为igbinary_serialize即可获得改善。
优化列表展示
我已经厌倦挨个查看profile日志的大图,费时费力还没有针对性。所以我现在的做法是,在profile日志的列表中将前1000个日志的总体执行时间直接输出到列表中,并且将执行时间过长的日志用红色粗体标识。做了这个小小的改动之后,当我想要去视察一下运行情况时,就把日志列表中那些红通通的链接点开看看就行了,真正的省时省力。
如何从xhprof日志文件中获取执行时间?简单的代码如下

/**
* 由xhprof日志获得执行时间
*
* @param string $log xhprof日志的文件路径
* @return int 执行时间
*/
function getSpentTime($log) {
  $profile = unserialize(file_get_contents($log));
  return $profile['main()']['wt'] / 1000;
}

PHP 相关文章推荐
PHP远程连接MYSQL数据库非常慢的解决方法
Jul 05 PHP
PHP令牌 Token改进版
Jul 18 PHP
PHP 异步执行方法,模拟多线程的应用分析
Jun 03 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
Apr 24 PHP
Yii调试SQL的常用方法
Jul 09 PHP
php使用glob函数快速查询指定目录文件的方法
Nov 15 PHP
ThinkPHP模版引擎之变量输出详解
Dec 05 PHP
PHP实现图片自动清理的方法
Jul 08 PHP
Yii操作数据库实现动态获取表名的方法
Mar 29 PHP
功能强大的PHP发邮件类
Aug 29 PHP
php实现生成code128条形码的方法详解
Jul 19 PHP
PHP缓存工具XCache安装与使用方法详解
Apr 09 PHP
php cli模式学习(PHP命令行模式)
Jun 03 #PHP
获取PHP警告错误信息的解决方法
Jun 03 #PHP
php cli 小技巧
Jun 03 #PHP
php中用加号与用array_merge合并数组的区别深入分析
Jun 03 #PHP
PHP在线生成二维码代码(google api)
Jun 03 #PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
Jun 03 #PHP
深入php-fpm的两种进程管理模式详解
Jun 03 #PHP
You might like
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
2011/12/25 PHP
推荐一款PHP+jQuery制作的列表分页的功能模块
2014/10/14 PHP
PHP使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
通过JS获取用户本地图片路径并显示的代码
2012/02/16 Javascript
js控制的遮罩层实例介绍
2013/05/29 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
EasyUI中的dataGrid的行内编辑
2017/06/22 Javascript
js中的事件委托或是事件代理使用详解
2017/06/23 Javascript
layui框架table 数据表格的方法级渲染详解
2018/08/19 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
win10系统中安装scrapy-1.1
2016/07/03 Python
Python如何实现MySQL实例初始化详解
2017/11/06 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
使用Python的Dataframe取两列时间值相差一年的所有行方法
2018/07/10 Python
Python 2.7中文显示与处理方法
2018/07/16 Python
对numpy下的轴交换transpose和swapaxes的示例解读
2019/06/26 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
opencv-python 提取sift特征并匹配的实例
2019/12/09 Python
如何把python项目部署到linux服务器
2020/08/26 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
购买澳大利亚最好的服装和内衣在线:BONDS
2016/10/14 全球购物
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
Yves Rocher捷克官方网站:植物化妆品的创造者
2019/07/31 全球购物
俄罗斯童装网上商店:BebaKids
2020/06/06 全球购物
国家励志奖学金获奖感言
2014/01/09 职场文书
高一家长会邀请函
2014/01/12 职场文书
中学生自我评价范文
2014/02/08 职场文书
餐厅总厨求职信
2014/03/04 职场文书
家长学校教学计划
2015/01/19 职场文书
婚礼庆典答谢词
2015/01/20 职场文书