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

PHPPerformanceUltimateDebug-GenerateFlameGraph

时间:2023-03-29 18:00:28 PHP

我是2012年才开始学习PHP的,那时候PHP的应用非常简单,没有很多复杂的设计模式,比如依赖注入,工厂模式。刚出来,一个PHP应用就是一些前端代码打包的脚本文件,正是因为PHP简单可靠,学习成本极低,PHP在那些年很流行。你可以很快看懂别人写的PHP代码,不管它有多烂。那时我刚毕业,凭着对PHP的熟练程度,在三四线城市可以轻松拿到7000到8000元的薪水。另外,当时对各大框架(Tp、Ci、Yii、Cphalcon)的源码研究的很透彻。到PHP天花板。后来换城市写PHP,慢慢少了很多,用了一套基于Swoole的框架,好用。但是我现在所在的公司PHP占了90%,而且大部分都是Laravel/Lumen应用,这让我很难继续优化性能。Laravel使用了很多设计模式和动态注入。在很多情况下,具体的对象实例只能在运行时才知道。仅通过查看源代码很难确定服务的运行状态。所以在做性能分析的时候,火焰图和可视化的调用栈是非常重要的,可以很直观准确的看到各种耗时。在PHP中,我们可以关注两个层次的火焰图:PHP核心和PHPZend调用堆栈。前者是抓取系统调用的耗时火焰图,后者是ZendVM的耗时火焰图。下面就分享这两个火焰图的生成。囧,SVG格式的图片不能上传,想看图片的同学可以进我的博客,链接在最下面。默认操作系统(ArchLinux)#neofech-`russell@T14.o+`----------`ooo/OS:ArchLinuxx86_64`+oooo:Host:NBLK-WAX9XM1040`+oooooo:内核:5.14.14-arch1-1-+oooooo+:正常运行时间:1小时15分钟`/:-:++oooo+:软件包:852(pacman)`/++++/+++++++:外壳:zsh5.8`/++++++++++++++:分辨率:1920x1080`/+++ooooooooooooooo/`DE:Plasma5.23.2./ooosssso++osssssso+`WM:KWin。oosssso-````/ossssss+`WM主题:微风-osssssso。:ssssssso。主题:BreezeLight[Plasma],Breeze[GTK2/3]:osssssss/osssso+++。图标:Uos-fulldistro-icons[Plasma],Uos-fulldi/ossssssss/+ssssooo/-终端:konsole`/ossssso+/:--:/+osssso+-终端字体:Hack10`+sso+:-``.-/+oso:CPU:AMDRyzen53500UwithRadeonVegaMobileG`++:.`-/+/GPU:AMDATI03:00.0Picasso``/内存:1928MiB/6880MiBPHP版本#php-vPHP7.4.23(cli)(内置:2021年9月19日12:07:04)(NTS)版权所有(c)ThePHPGroupZendEnginev3.4.0,Copyright(c)ZendTechnologieswithXdebugv3.1.1,Copyright(c)2002-2021,byDerickRethans对此没有要求,Laravel版本高于5.6#phpartisan-VLaravel框架8.61。0perfversion#perf-vperfversion5.14.g7d2a07b76933下载flamegraphgitclonehttps://github.com/brendangregg/FlameGraph.gitcdFlameGraph#这一步是将FlameGraph注入可执行文件系统路径,下面直接执行里面的工具即可exportPATH=`pwd`:$PATH工具是关键。通过perf捕获系统调用,然后生成火焰图,是需要时间的。抓取PHP内核火焰图,首先找到PHP进程ID,然后使用如下命令抓取#抓取PID为7959进程60秒perfrecord-F99-p7959-g--sleep30exportstackperfscript>out.perf生成Foldstacks文件stackcollapse-perf.plout.perf>out.folded生成火焰图flamegraph.plout.folded>php-zend-flame-graph.svg看效果,svg格式图片,可以clicktheflamebartofilter(Openanewtabtoview):抓取ZendVM的耗时火焰图。火焰图的生成依赖于xdebug,不同的xdebug版本使用不同的配置。配置说明可以直接看xdebug包配置文件或者上Github。Xdebug3配置:zend_extension=xdebugxdebug.mode=tracexdebug.start_with_request=triggerxdebug.trigger_value=StartProfileForMexdebug.trace_output_name=xdebug.trace.%t.%sxdebug.output_dir=/tmpxdebug.trace_format=1Xdebug2配置:xdebug.trace_name=outputx.trace.%sxdebug.trace_enable_trigger=1xdebug.trace_output_dir=/tmpxdebug.trace_enable_trigger_value=""xdebug.trace_format=1请求接口url,获取php堆栈数据curlhttp://youdomain.com?XDEBUG_TRACE=。跟踪文件位于/tmp目录中,以xdebug.tarce开头。转换栈数据(如果stackcollapse-xdebug.php不存在,注意上面下载flamegraph的介绍):stackcollapse-xdebug.php/tmp/xdebug.trace.1635786267._data_workspaces_study_laravel-framework_laravel_server_php.xt如果是xdebugtrace文件gz格式,转换:#参数`-dk`表示解压并保留源文件。gzip-dk/tmp/xdebug.trace.1635786267._data_workspaces_study_laravel-framework_laravel_server_php.xt.gz转换堆栈数据stackcollapse-xdebug.phpxdebug.trace.1635786267._data_workspaces_study_laravel-framework_laravel_server_outpl.xt-vfoldme>lara效果,svg格式图片,可以点击火焰条进行过滤(打开新标签页查看):文章首发于本人博客:https://b.catch-e.space/2021/...

最新推荐
猜你喜欢