摘要:说明将部署在线上环境,在特定情况下进行性能分析,方便快捷的排查线上性能问题。通过参数指定及添加代码行触发进入性能分析,并将结果保存入。因为对性能的影响,只部署在一台机子上。
说明
将xhprof部署在线上环境,在特定情况下进行性能分析,方便快捷的排查线上性能问题。
通过参数指定及添加代码行触发进入性能分析,并将结果保存入MongoDB。
因为xhprof对性能的影响,只部署在一台机子上。
环境配置PHP 5.5.25
xhprof-0.9.4
xhprof:git@github.com:phacility/xhprof.git
核心入口文件/PATH/xhprof/config/inject.php
$clientIp, "path" => $path, "hostname" => $hostName ]; } } //主处理过程 if( !function_exists("xphrof_mainProcess") ){ function xphrof_mainProcess($cmdName=""){ if ( extension_loaded("xhprof") ) { //xhprof功能统一开关,紧急情况下使用 $xhprofMainSwitch = true; //true-开, false-关 //判断是否进入分析 $enable = xphrof_checkEnable($cmdName); if ( $xhprofMainSwitch && $enable ) { $pathData = xphrof_getUniqSign($cmdName); //开始性能分析 // XHPROF_FLAGS_NO_BUILTINS - 使得跳过所有内置(内部)函数 // XHPROF_FLAGS_CPU - 使输出的性能数据中添加 CPU 数据 // XHPROF_FLAGS_MEMORY - 使输出的性能数据中添加内存数据 xhprof_enable( XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU ); //注册,脚本执行完或exit后执行 register_shutdown_function(function() use ($pathData){ //xhprof的数据 $xhprofData = xhprof_disable(); //相应给客户端并结束请求 $returnClient = -1; if (function_exists("fastcgi_finish_request")) { $returnClient = fastcgi_finish_request(); } //当前环境数据及post、get数据 $envData = [ "env" => $_SERVER, "get" => $_GET, "post" => $_POST, "return_client" => intval($returnClient) ]; $XHPROF_ROOT = realpath(dirname(__FILE__) ."/.."); include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php"; include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs_mongo.php"; include_once $XHPROF_ROOT . "/xhprof_lib/service/MongoBaseSvc.php"; //加载配置文件 $xhprofConfig = include_once $XHPROF_ROOT . "/config/config.php"; $xhprofRuns = new XHProfRuns_Mongo($xhprofConfig); $xhprofRuns->save_run($xhprofData, $envData, $pathData); }); } } } } //默认启动一次-http,指定服务器才可执行 if( function_exists("php_uname") && in_array(php_uname("n"), [ "10.10.10.10", //测试开发服务器 "11.11.11.11" //线上执行服务器 ], true) ){ xphrof_mainProcess(); } //comand进入分析 if( !function_exists("xphrof_startProcess") ){ function xphrof_startProcess($cmdName=""){ xphrof_mainProcess($cmdName); } }加载入口文件方案
1. 在项目启动的配置文件中加载
//例如:bootstrap/autoload.php /* |-------------------------------------------------------------------------- | add xhprof config |-------------------------------------------------------------------------- | | inject xhprof config. | */ $xhprofFile = __DIR__."/../xhprof/config/inject.php"; if (file_exists($xhprofFile)) { require_once $xhprofFile; }
2. 在项目nginx的配置中加载
//在 nginx 的fastcgi配置处 set $xhprofconf "auto_prepend_file=/PATH/xhprof/config/inject.php"; fastcgi_param PHP_VALUE $xhprofconf;触发进入
对HTTP请求访问时增加参数:showyourbug=1
对CLI脚本代码中增加:xphrof_startProcess(__CLASS__);
MongoDB保存结构解析保存xhprof_disable()返回的数据、请求的环境变量及数据。可设置过期索引保存指定时长日志。
{ "ip" : "10.10.10.10", //访问客户端ip "path" : "http-", //资源标识,http-接口请求,cmd-artisan脚本执行 "hostname" : "machine_host_name", //执行机器名称 "run_id" : "5afe795c96a83", //唯一run_id "main" : { //整体数据 "ct" : NumberLong(1), "wt" : NumberLong(36), "cpu" : NumberLong(0), "mu" : NumberLong(1856), "pmu" : NumberLong(672) }, "xhprof_raw_data" : "a:2:{s:23:"main()==>xhprof_disable";a:5:{s:2:"ct";i:1;s:2:"wt";i:8;s:3:"cpu";i:0;s:2:"mu";i:840;s:3:"pmu";i:96;}s:6:"main()";a:5:{s:2:"ct";i:1;s:2:"wt";i:36;s:3:"cpu";i:0;s:2:"mu";i:1856;s:3:"pmu";i:672;}}", //原始数据体 "env_data" : { //相关环境日志 "env" : { //$_SERVER信息 "USER" : "nobody", "HOME" : "/", "FCGI_ROLE" : "RESPONDER", "SCRIPT_FILENAME" : "/PATH/public/index.php", ...... "REQUEST_TIME" : NumberLong(1526626652) }, "get" : { //$_GET信息 "showyourbug" : "1" }, "post" : [], //$_POST信息 "return_client" : NumberLong(-1) //fastcgi_finish_request相应客户端结果 }, "index_time" : ISODate("2018-05-18T06:57:32.000Z"), //过期索引,保留2天 "create_time" : "2018-05-18 14:57:32" //创建时间 }对线上性能的影响分析
测试接口
public function getHello(){ $ret = [ "errno" => 0, "errmsg" => "success" ]; return json_encode($ret); }
使用ab请求
ab -n 1000 -c 100 -X 10.10.10.10:80 http://hostname/hello ab -n 1000 -c 100 -X 10.10.10.10:80 http://hostname/hello?showyourbug=1
测试结果
批量请求对服务器影响:
| 测试类别 | Requests per second (#/sec) | 平均 | Time per request (ms) | 平均 |
| 仅测试接口 | 49.23,50.02,49.41 | 49.55 | 20.312,19.992,20.239 | 20.181 |
| 加载配置(未进入) | 46.74,45.48,45.21 | 45.81 (-8.76%) | 21.397,21.987,22.118 | 21.834 (-8.19%) |
| 加载配置(进入) | 10.72,10.48,11.46 | 10.88 (-78%) | 93.281,95.452,87.259 | 91.99 (-355.82%) |
对单个请求影响:
| 测试类别 | Time per request (ms) | 平均 |
| 仅测试接口 | 66.972,87.029,72.605 | 75.54 |
| 加载配置(未进入) | 79.183,80.728,83.101 | 81.004 (-7.23%) |
| 加载配置(进入) | 275.186,287.293,291.312 | 284.597 (-271.45%) |
结论
xhprof会影响线上性能,所以只部署到一台线上机进行监控。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/29008.html
toolkit是tideway官方提供的性能分析的命令行工具。如果你只是本地开发调试接口性能,不想安装xhgui,那么使用toolkit就足够了 安装 安装tideways拓展 git clone https://github.com/tideways/php-xhprof-extension.git cd php-profiler-extension phpize ./configure mak...
摘要:我所在的美团酒店事业部去年月份成立,新的业务新的开发团队,这一切使得我们的前后端分离推进的很彻底。日志监控平台日志监控平台是美团内部的一个日志收集系统,目前美团统一使用收集日志,具有接收格式日志的能力,而日志监控平台也是以格式日志来收集。 转自:美团技术团队 作者:美团技术团队 分享理由:很好的分享,可见,基于Node的前后端分离的架构是越显流行和重要,前端攻城狮们,No...
摘要:大交通研发质量体系建设为了帮助用户更好地完成消费决策闭环,马蜂窝上线了大交通业务,为用户提供购买机票火车票等服务。 质量是决定产品能否成功、企业能否持续发展的关键因素之一。如何做好质量体系建设,这是个比较大的话题,包含的范围很广,也没有固定的衡量标准。 打开一个互联网公司招聘网站,搜索「测试工程师」岗位时,你会发现几乎全部 JD 都包含一条要求「建设或者参与建设所负责业务的质量体系」。...
摘要:大交通研发质量体系建设为了帮助用户更好地完成消费决策闭环,马蜂窝上线了大交通业务,为用户提供购买机票火车票等服务。 质量是决定产品能否成功、企业能否持续发展的关键因素之一。如何做好质量体系建设,这是个比较大的话题,包含的范围很广,也没有固定的衡量标准。 打开一个互联网公司招聘网站,搜索「测试工程师」岗位时,你会发现几乎全部 JD 都包含一条要求「建设或者参与建设所负责业务的质量体系」。...
摘要:本文介绍了企业互联网开发及运维的一些实践,深入剖析了互联网项目开发及上线过程中的各种痛点及解决之道。线上出错,我们通过收集服务器端应用性能数据的方式,实时展示应用的调用拓扑图,并根据出现异常的请求,进行下钻,定位出具体出现问题的代码。 本文介绍了企业互联网开发及运维的一些实践,深入剖析了互联网项目开发及上线过程中的各种痛点及解决之道。一个互联网项目的上线并不是那么容易,需要经过很多的环...
阅读 1495·2021-10-11 10:59
阅读 1857·2021-09-09 11:36
阅读 1367·2019-08-30 15:55
阅读 1321·2019-08-29 11:20
阅读 3056·2019-08-26 13:39
阅读 1457·2019-08-26 13:37
阅读 1950·2019-08-26 12:11
阅读 1312·2019-08-23 14:28