热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于Xdebug生成PHP火焰图

2012年刚开始学习PHP,那个时候的PHP利用很简略,没有太多简单的设计模式,像依赖注入,工厂模式这些还简直没有,ReflectionAPI那时也才刚进去,一个PHP利用就是一些
文章目录[隐藏]
  • 运行环境
  • 抓取 PHP 内核火焰图
  • 抓取 Zend VM 耗时火焰图

2012 年刚开始学习 PHP,那个时候的 PHP 利用很简略,没有太多简单的设计模式,像依赖注入,工厂模式这些还简直没有,Reflection API 那时也才刚进去,一个 PHP 利用就是一些包了前端代码的脚本文件,正是因为 PHP 的简略牢靠,学习老本极低,那几年 PHP 红极一时。你能够很疾速的看懂他人写的 PHP 代码,不论他写的到底有多烂。我那个时候刚毕业凭借对 PHP 的熟练掌握能够轻松在三四线城市拿到七八千工资,加上对过后各大框架(Tp、Ci、Yii、Cphalcon)源码钻研非常透彻,自认为曾经摸到 PHP 的天花板。前面换城市写 PHP 逐步少了很多,用的比拟多的是本人基于 Swoole 写的一套框架,得心应手。

不过当初所在的公司 PHP 占据了 90% 的份额,根本都是 Laravel/Lumen 利用,这让继续在做性能优化的我变得很难。Laravel 中应用了大量的设计模式、动静注入,很多时候只有在运行时能力晓得能晓得具体的对象实例,想要仅通过看源码确定服务运行状态有肯定的难度。所以在做性能剖析时火焰图和可视化调用栈很重要,能够十分直观精确看到各种耗时。

在 PHP 中咱们能够关注两个档次的火焰图:PHP 内核PHP Zend 调用栈。前者是抓取零碎调用的耗时火焰图,后者是 Zend VM 的耗时火焰图,上面就这两种火焰图生成做分享。

运行环境

操作系统(Arch Linux)

# neofech
                   -`                    russell@T14 
                  .o+`                   ----------- 
                 `ooo/                   OS: Arch Linux x86_64 
                `+oooo:                  Host: NBLK-WAX9X M1040 
               `+oooooo:                 Kernel: 5.14.14-arch1-1 
               -+oooooo+:                Uptime: 1 hour, 15 mins 
             `/:-:++oooo+:               Packages: 852 (pacman) 
            `/++++/+++++++:              Shell: zsh 5.8 
           `/++++++++++++++:             Resolution: 1920x1080 
          `/+++ooooooooooooo/`           DE: Plasma 5.23.2 
         ./ooosssso++osssssso+`          WM: KWin 
        .oossssso-````/ossssss+`         WM Theme: Breeze 
       -osssssso.      :ssssssso.        Theme: Breeze Light [Plasma], Breeze [GTK2/3] 
      :osssssss/        osssso+++.       Icons: Uos-fulldistro-icons [Plasma], Uos-fulldi 
     /ossssssss/        +ssssooo/-       Terminal: konsole 
   `/ossssso+/:-        -:/+osssso+-     Terminal Font: Hack 10 
  `+sso+:-`                 `.-/+oso:    CPU: AMD Ryzen 5 3500U with Radeon Vega Mobile G 
 `++:.                           `-/+/   GPU: AMD ATI 03:00.0 Picasso 
 .`                                 `/   Memory: 1928MiB / 6880MiB

PHP 版本

# php -v
PHP 7.4.23 (cli) (built: Sep 19 2021 12:07:04) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Xdebug v3.1.1, Copyright (c) 2002-2021, by Derick Rethans

这个没啥要求,只有不是 5.6 版本以下就行。

Laravel 版本

# php artisan -V
Laravel Framework 8.61.0

perf 版本

# perf -v
perf version 5.14.g7d2a07b76933

下载 flamegraph

git clone https://github.com/brendangregg/FlameGraph.git
cd FlameGraph
# 这一步是将 FlameGraph 注入到可执行文件零碎门路中,上面就能够间接执行外面的工具了
export PATH=`pwd`:$PATH

这个工具是要害,通过 perf 抓取零碎调用耗时而后生成火焰图。

抓取 PHP 内核火焰图

首先找到 PHP 过程 ID,而后通过以下命令进行抓取

# 抓取 PID 为 7959 过程 60 秒
perf record -F 99 -p 7959 -g -- sleep 30

导出堆栈

perf script > out.perf

生成 Fold stacks 文件

stackcollapse-perf.pl out.perf > out.folded

生成火焰图

flamegraph.pl out.folded > php-zend-flame-graph.svg

看一下成果,svg 格局图片,能够点击火焰条进行过滤(关上新 tab 查看):

抓取 Zend VM 耗时火焰图

该火焰图生成依赖 xdebug,不同的 xdebug 版本应用的配置不一样.配置阐明能够间接看 xdebug 包配置文件或者上 Github 看。

Xdebug3 配置:

zend_extension=xdebug
xdebug.mode=trace
xdebug.start_with_request=trigger
xdebug.trigger_value=StartProfileForMe
xdebug.trace_output_name = xdebug.trace.%t.%s
xdebug.output_dir = /tmp
xdebug.trace_format=1

Xdebug2 配置:

xdebug.trace_output_name = xdebug.trace.%t.%s
xdebug.trace_enable_trigger = 1
xdebug.trace_output_dir = /tmp
xdebug.trace_enable_trigger_value = ""
xdebug.trace_format=1

申请接口url,获取php堆栈数据 curl http://youdomain.com?XDEBUG_TRACE=。trace 文件在 /tmp 目录下,以 xdebug.tarce 结尾。

转换堆栈数据(如果 stackcollapse-xdebug.php 不存在,留神下面 下载 flamegraph 介绍):

stackcollapse-xdebug.php /tmp/xdebug.trace.1635786267._data_workspaces_study_laravel-framework_laravel_server_php.xt

如果 xdebug trace 文件为 gz 格局,转换一下:

# 参数 `-dk` 示意解压并保留源文件。
gzip -dk /tmp/xdebug.trace.1635786267._data_workspaces_study_laravel-framework_laravel_server_php.xt.gz

转换堆栈数据

stackcollapse-xdebug.php xdebug.trace.1635786267._data_workspaces_study_laravel-framework_laravel_server_php.xt > out.folded

生成火焰图

flamegraph.pl out.folded > laravel-flame-graph.svg

看一下成果,svg 格局图片,能够点击火焰条进行过滤(关上新 tab 查看):



推荐阅读
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 在安装 iOS 开发所需的 CocoaPods 时,用户可能会遇到多种问题。其中一个常见问题是,在执行 `pod setup` 命令后,系统无法连接到 GitHub 以更新 CocoaPods/Specs 仓库。这可能是由于网络连接不稳定、GitHub 服务器暂时不可用或本地配置错误等原因导致。为解决此问题,建议检查网络连接、确保 GitHub API 限制未被触发,并验证本地配置文件是否正确。 ... [详细]
  • windows安装RabbitMQ遇到epmderrorforhostxxx:address(cannotconnecttohost/port)错误解决方法
    未安装服务,Windows下,dev环境用bat运行运行RabbitMQ时报如下错误 Configuringloggerredirection09:11:07.009[warnin ... [详细]
  • ThinkPHP RBAC 实战:登录验证详解
    本文将详细介绍 ThinkPHP 框架中的 RBAC(角色基础访问控制)系统,特别是登录验证部分。我们将通过实际代码示例,展示如何实现用户登录验证、验证码生成及验证、以及登录后的权限管理。 ... [详细]
  • 本文介绍了如何使用Flume从Linux文件系统收集日志并存储到HDFS,然后通过MapReduce清洗数据,使用Hive进行数据分析,并最终通过Sqoop将结果导出到MySQL数据库。 ... [详细]
  • C盘无法格式化的原因及解决方法
    本文探讨了C盘无法格式化的原因,并提供了详细的解决方案,帮助用户顺利进行系统维护。 ... [详细]
  • ARM汇编基础基于Keil创建STM32汇编程序的编写
    文章目录一、新建项目(1)工具介绍(2)创建项目:二、配置环境(1)配置芯片&#x ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 优化Vite 1.0至2.0升级过程中遇到的某些代码块过大问题解决方案
    本文详细探讨了在将项目从 Vite 1.0 升级到 2.0 的过程中,如何解决某些代码块过大的问题。通过具体的编码示例,文章提供了全面的解决方案,帮助开发者有效优化打包性能。 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • 在安装并配置了Elasticsearch后,我在尝试通过GET /_nodes请求获取节点信息时遇到了问题,收到了错误消息。为了确保请求的正确性和安全性,我需要进一步排查配置和网络设置,以确保Elasticsearch集群能够正常响应。此外,还需要检查安全设置,如防火墙规则和认证机制,以防止未经授权的访问。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
author-avatar
逍遥子2502897751
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有