magic - trace:高分辨率追踪利器,解决应用难题,还能深入洞悉程序运行!
magic - trace 概述
magic - trace 能够收集并展示进程活动的高分辨率追踪信息,可用于解决生产环境中应用程序处理请求速度慢、了解代码实际运行情况、获取应用崩溃前活动历史等问题。它性能开销在 2% - 10% 之间,使用时无需修改应用程序,能以约 40 纳秒分辨率追踪函数调用,可呈现回溯约 10 毫秒的调用栈时间线。使用方式与 perf 类似,关键区别在于 perf 采样调用栈,magic - trace 利用 Intel Processor Trace 进行环形缓冲区快照,之后可通过交互式时间线查看情况。还能针对函数追踪或附加到进程上按 Ctrl + C 停止查看追踪信息。
用户评价
Francis Ricci 称 Magic - trace 是用过的最简单的命令行调试工具之一;Andrew Hunter 表示它不只是用于性能分析,能让人直接了解程序情况,建议用于深入了解程序的场景;Doug Patti 认为 perf 和 magic - trace 各有优势,magic - trace 能在任何缩放级别切片分析,可看到 70 纳秒函数的所有调用,这在 perf 中看不到。
安装
安装前要确保系统满足支持条件,如大多数虚拟机不支持,仅支持 Intel 处理器(Skylake 及以后型号),仅适用于 Linux 系统。可从最新版本页面获取二进制文件,预构建二进制文件需执行 `chmod +x magic - trace` 赋予权限,软件包则运行 `sudo dpkg -i magic - trace*.deb` 安装,安装后运行 `magic - trace - help` 测试,显示帮助信息则安装成功。
快速上手
有一个示例 C 程序,是 `man 3 dlopen` 示例的修改版本,下载编译运行后,运行 `magic - trace attach - pid $(pidof demo)`,看到成功附加消息后等待几秒按 Ctrl + C 停止,会生成 `trace.fxt.gz` 文件。打开 `magic - trace.org`,点击“Open trace file”选择文件展开追踪信息。使用快捷键操作,如按 `W` 放大、`S` 缩小等,还能测量 `cos` 函数运行时间,示例中约需 5.7 微秒。与 perf 工作流程不同,magic - trace 提出假设能力出色,如发现 `cos` 函数运行 6 微秒过长,放大后有粉色“[untraced]”单元格,以 root 权限重新运行并传递 `- trace - include - kernel` 参数可看到堆栈跟踪信息,示例程序调用两次 `cos` 函数,第二次耗时更短且无页面错误。
使用方法
magic - trace 持续记录控制流到环形缓冲区,触发条件时进行快照并重建调用栈。触发快照方式有两种:一是按 Ctrl + C 停止,未快照时对程序结束状态快照;二是应用程序调用函数时触发,通过 `- trigger` 标志实现,有不同选择方式。停止指示器可放在异步运行时调度器周期过长、服务器请求处理时间过长、垃圾回收器运行后、编译器通过后等场景,可保留在生产代码中,调用约消耗 10 微秒时间,仅在快照时产生开销。
文档
更多文档可在 magic - trace 维基页面查看。
讨论
可加入 Discord 实时交流,或在 GitHub 讨论组异步交流。
贡献
想为 magic - trace 做贡献,可先阅读构建说明,配置编辑器,浏览代码库,在问题跟踪器找入门项目。
隐私政策
magic - trace 不会将代码及派生内容(包括追踪信息)发送到任何地方,`magic - trace.org` 是 Perfetto 轻度修改版本,在浏览器运行,不会发送追踪信息,担心未来变化可搭建本地版 Perfetto UI 使用。
致谢
Tristan Hume 是 magic - trace 原作者,在 Jane Street 工作时编写,目前由 Jane Street 维护。感谢英特尔推广 Intel PT 技术,感谢 perf 开发者,`magic - trace.org` 是 Perfetto 分支,感谢 Google 相关人员,magic - trace 设计受许多现有技术影响,列出了参考资料。
脚注
1. perf 也能实现类似功能,但大多数人不这么用,magic - trace 通过 perf 驱动 Intel PT。2. 比 Broadwell 新的处理器也可用,但不常测试,时间分辨率约 1 微秒。3. https://github.com/actions/upload - artifact/issues/38
