当前位置: 首页 > 后端技术 > PHP

xphrof性能分析在线部署实践

时间:2023-03-29 15:20:48 PHP

讲解如何在在线环境下部署xhprof,进行特定情况下的性能分析,方便快捷的排查在线性能问题。通过指定参数和添加代码行触发性能分析,并将结果保存在MongoDB中。因为xhprof对性能有影响,所以只部署在一台机器上。环境配置PHP5.5.25xhprof-0.9.4xhprof:git@github.com:phacility/xhprof.git核心入口文件/PATH/xhprof/config/inject.php$clientIp,'path'=>$path,'hostname'=>$hostName];}}//主进程if(!function_exists('xphrof_mainProcess')){functionxphrof_mainProcess($cmdName=''){if(extension_loaded('xhprof')){//xhprof函数的统一切换,使用$xhprofMainSwitch=true在紧急情况下;//true-on,false-off//判断是否进入Profiling$enable=xphrof_checkEnable($cmdName);如果($xhprofMainSwitch&&$enable){$pathData=xphrof_getUniqSign($cmdName);//开始分析//XHPROF_FLAGS_NO_BUILTINS-导致跳过所有内置(内部)函数//XHPROF_FLAGS_CPU-添加CPU以输出性能数据Data//XHPROF_FLAGS_MEMORY-添加内存数据到输出性能数据xhprof_enable(XHPROF_FLAGS_MEMORY|XHPROF_FLAGS_CPU);//注册,脚本执行或退出后执行register_shutdown_function(function()use($pathData){//xhprof数据$xhprofData=xhprof_disable();//响应客户端,结束请求$returnClient=-1;if(function_exists('fastcgi_finish_request')){$returnClient=fastcgi_finish_request();}//当前环境数据和post,获取数据$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_RO.'/config/config.php';$xhprofRuns=newXHProfRuns_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')){functionxphrof_startProcess($cmdName=''){xphrof_mainProcess($cmdName);}}加载入口文件方案1。在项目中加载启动配置文件//例如:bootstrap/autoload.php/*|--------------------------------------------------------------------------|添加xhprof配置|----------------------------------------------------------------------||injectxhprofconfig.|*/$xhprofFile=__DIR__.'/../xhprof/config/inject.php';if(file_exists($xhprofFile)){require_once$xhprofFile;}2.在项目中加载nginx配置//在nginx的fastcgi配置中设置$xhprofconf"auto_prepend_file=/PATH/xhprof/config/inject.php";fastcgi_paramPHP_VALUE$xhprofconf;触发入口访问HTTP请求时添加参数:showyourbug=1CLI脚本代码添加:xphrof_startProcess(__CLASS__);MongoDB保存结构解析,保存xhprof_disable()返回的数据,请求的环境变量和数据可以设置过期索引,保存指定时间段的日志。{"ip":"10.10.10.10",//访问客户端ip"path":"http-",//资源识别,http接口请求,cmd-artisan脚本执行"hostname":"machine_host_name",//执行机器名称"run_id":"5afe795c96a83",//uniquerun_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对应的client结果},"index_time":ISODate("2018-05-18T06:57:32.000Z"),//索引过期,保留2天"create_time":"2018-05-1814:57:32"//创建时间}对在线性能分析测试接口的影响publicfunctiongetHello(){$ret=['errno'=>0,'errmsg'=>'success'];returnjson_encode($ret);}使用ab请求ab-n1000-c100-X10.10.10.10:80http://hostname/helloab-n1000-c100-X10.10.10.10:80http://hostname/hello?showyourbug=1测试结果批量请求对服务器的影响:|测试类别|每秒请求数(#/sec)|平均|每个请求的时间(ms)|平均||仅测试接口|49.23、50.02、49.41|49.55|20.312、19.992、20.239|20.181||%)|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%)|单一请求影响:|测试类别|每个请求的时间(毫秒)|平均||仅测试接口|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会影响线上性能,所以只部署到一台线上机monitor