Perfetto 入门指南按开发者角色快速定位你的第一条 Trace 与 Profiling 方案【免费下载链接】perfettoProduction-grade client-side tracing, profiling, and analysis for complex software systems.项目地址: https://gitcode.com/GitHub_Trending/pe/perfettoPerfetto 是一套面向客户端client-side系统的开源 tracing、profiling 与分析工具套件其官方文档体系庞大包含概念、教程Tutorials、Cookbook、Case Study 等大量页面新手往往不知道从哪一页读起。本文以仓库中的 docs/getting-started/start-using-perfetto.md 为核心骨架按你是什么角色、你想解决什么问题的决策树重新组织这份入门导航逐一说明 Android 应用/平台开发者、Linux 内核开发者、C/C 与 Rust 开发者、Chromium 开发者以及只有 trace 数据的用户各自该从哪篇文档入手、底层对应哪些数据源并补充仓库中的源码与配置文件作为佐证。读完本文你将能依据自己的角色快速定位到正确的 Perfetto 文档、工具链与配置示例迈出录制、可视化和 SQL 分析 trace 的第一步。阅读前提与文档体系说明如果你对tracing追踪这个词本身还不熟悉或者刚刚进入性能分析领域官方建议先阅读 docs/tracing-101.md 了解基础知识——tracing 是收集系统执行过程的细粒度数据足以重建事件时间线profiling 则是通过采样统计某个资源的使用情况如 CPU 时间、堆内存分配。如果你还不确定 Perfetto 是什么、为什么有用可以先看 docs/README.mdPerfetto 由高性能 tracing daemon、低开销 Tracing SDK、Android/Linux 系统级探针、纯本地浏览器端 UI 以及基于 SQL 的分析库Trace Processor组成并且是 Android 与 Chromium 的默认 tracing 系统。Perfetto 的文档体系分为三类理解它们有助于你按需取用Tutorials教程介绍如何上手使用 Perfetto 工具本身重点是教工具而不是教如何解决真实问题。Cookbooks提供小而精的配方式指南recipes包含可直接复制粘贴的代码片段或一系列可执行的步骤。Case Studies详细的、带有观点倾向的指南逐步带你用 Perfetto 排查并定位一个纵向问题更侧重于解决问题本身。官方用一张 mermaid 决策图来引导读者从 Start here 出发根据你的角色Android 应用/平台开发者、Linux 内核开发者、C/C 开发者、Rust 开发者、Chromium 开发者、手头有 trace 数据的人或其他进入对应分支。下面按这些角色逐一展开。Android 应用与平台开发者Perfetto 是Android 的默认 tracing 系统。它能捕获系统与应用的细粒度、按时间排序的活动记录帮助你回答这类问题某个操作为什么比预期慢导致这个 bug 的事件序列是什么不同进程与系统服务在特定场景下如何交互我的组件在特定系统条件下行为是否正确应用或整个系统为何占用这么多内存以及某个关键时间点各系统组件处于什么状态App 开发者先用封装工具再考虑直接用 Perfetto作为 Android 应用开发者你可能已经在使用基于 Perfetto 的上层工具它们把底层细节封装成更友好的体验例如 Android Studio Profiler、Android GPU Inspector、AndroidX Macrobenchmark Library 以及 Android SDK 中的 ProfilingManager API。这些项目在底层都使用了 Perfetto 的 trace 工具链但出于易用性通常会裁剪一部分功能。如果你刚开始接触应用 tracing官方建议先尝试上述工具学习曲线更平滑如果你想使用 Perfetto 的全量特性并接受更高的复杂度与专业要求则可以直接使用 Perfetto。本指南及仓库中的其余文档会帮助你获得对应用行为及其与 Android 系统交互的更深入洞察。理解系统行为与排查功能性问题当需要理解系统各部分如何交互、排查跨组件的复杂功能性 bug、或者回溯某个异常状态之前的事件序列时系统 tracesystrace能提供跨内核、系统服务与应用的时间相关视图教程docs/getting-started/system-tracing.md录制与分析系统 trace参考docs/data-sources/cpu-scheduling.mdCPU 调度数据源通常是理解交互与组件状态的关键要观察自己代码内部的执行流与状态可以通过插桩android.os.TraceSDK API 或 ATrace NDK API添加自定义 trace 点它们会以独立的 slice 出现在 trace 中教程docs/getting-started/atrace.md参考docs/data-sources/atrace.mdATrace 从 Android 4.3 引入、早于 Perfetto至今仍受支持且与 Perfetto 良好互操作底层它把事件转发到内核 ftrace ring-buffer与调度数据等一起被 Perfetto 采集。它的 slice 是线程作用域的同步切片begin/end必须平衡且在同一线程上发生。另外Perfetto 也能直接利用常见的 Android 诊断产物Androidbugreport.zip常内含 Perfetto tracePerfetto UI 可直接打开并自动提取加载见 docs/getting-started/other-formats.md。可将adb logcat输出与 trace 数据一起可视化也可以在录制新 trace 时把 logcat 直接包含进来见 docs/getting-started/other-formats.md。多份相关 trace两台设备、或应用 trace 与系统 trace可以合并到同一条共享时间线上打开见 docs/visualization/merging-traces.md。优化性能与定位延迟当组件变慢、出现 jank 或关键操作耗时过长时系统 trace 是理解多种延迟问题的核心工具。通过可视化线程状态Running、Runnable、Sleeping、阻塞在 I/O 或锁上、调度决策以及用户态事件ATrace 标记或自定义 SDK 事件的时间点可以定位Binder/IPC 延迟组件等待其他进程响应的时长。锁竞争Lock contention识别阻塞在互斥锁上的线程。调度延迟线程变为 runnable 后是否及时被调度。I/O 等待操作是否阻塞在磁盘或网络 I/O 上。UI Jank将系统活动与帧的生成、呈现相关联通常结合 FrameTimeline 数据。教程docs/getting-started/system-tracing.md参考docs/data-sources/cpu-scheduling.md针对 UI 掉帧的专项分析Android 的 FrameTimeline 数据源追踪从应用渲染、合成到显示的完整链路精确定位哪个阶段错过了截止时间教程docs/getting-started/system-tracing.md参考docs/data-sources/frametimeline.md如果系统 trace 表明组件确实消耗了大量 CPU 时间则 CPU profiling 能进一步定位到具体函数。Perfetto 可以直接捕获这些 profile也可以可视化simpleperf收集的 profile教程docs/getting-started/cpu-profiling.md教程docs/getting-started/other-formats.md可视化 simpleperf 文件诊断内存问题高内存占用会导致性能下降、增加 GC 停顿Java/Kotlin甚至被 Low Memory KillerLMK杀死。综合性的排查请从 Case Study 开始Case Studydocs/case-studies/memory.mdPerfetto 还提供了两类定向工具来归因内存使用Java/Kotlin 对象ART 堆转储heap dump给出托管堆上所有对象在某时刻的快照可分析对象数量、大小与保留路径什么让对象存活帮助发现泄漏或异常大的对象。教程docs/getting-started/memory-profiling.md参考docs/data-sources/java-heap-profiler.mdNativeC/C内存原生堆剖析跟踪malloc/free或 C 的new/delete把分配归因到具体函数调用栈帮助定位高内存使用区或内存 churn。教程docs/getting-started/memory-profiling.md参考docs/data-sources/native-heap-profiler.md需要注意heap profiling不是追溯式的它只能报告 trace 开始之后发生的分配。如果你需要分析进程启动时的内存使用必须在进程启动之前就开始 tracing。仓库中 test/configs/heapprofd.cfg 展示了一个完整的 heapprofd 配置示例包含sampling_interval_bytes采样间隔、process_cmdline目标进程与continuous_dump_config周期性 dump等关键字段。组件整体内存足迹RSS、PSS随时间的变化以及系统级内存事件可以通过系统 trace 中的内存计数器如 Resident Set Size、Proportional Set Size周期性轮询捕获教程docs/getting-started/system-tracing.md参考docs/data-sources/memory-counters.md平台开发者与 AOSP/OEM/合作伙伴Google 平台开发者的整个 Android 平台改动开发流程都深度集成了 Perfetto在开发特性或修复 bug 时本地采集 trace在 lab 测试与 field telemetry遥测系统中采集、分析并可视化 trace。许多 OEM 和合作伙伴在公司内部也有对应的本地/lab/field 系统具体请参考各自的内部文档。下方的通用指引同样适用于这些角色帮助你理解 Perfetto 提供的全套底层工具。Linux 内核开发者Perfetto 与 Linux 内核深度集成主要通过三类接口工作ftrace捕获高频率内核事件调度变化、系统调用、中断、自定义 tracepoint。Perfetto 充当 ftrace 的高效用户态 daemon还支持通过 ftrace 录制和可视化完整的 funcgraph trace在时间线上跟踪每个内核函数的进出。/proc 与 /sys 接口轮询较低频率的内核统计信息、进程信息如命令行、父子关系与系统级计数器内存用量、CPU 频率。perf events基于硬件或软件计数器采样内核与用户态调用栈进行 CPU profiling。要理解内核级活动调度、系统调用、特定驱动行为可配置 Perfetto 录制大量 ftrace 事件教程docs/getting-started/system-tracing.md重点看 Linux 特定的 ftrace 配置参考docs/data-sources/cpu-scheduling.md参考docs/data-sources/syscalls.md参考docs/data-sources/memory-counters.md来自 /proc、/sys 与 kmem ftrace要为内核代码添加自定义插桩可以在内核代码中定义新的 ftrace tracepoint然后配置 Perfetto 采集这些自定义事件教程docs/getting-started/ftrace.md判断内核或用户态哪部分消耗最多 CPU 时间可以使用perfevents 捕获 CPU profilePerfetto 也能可视化独立perf工具捕获的 profile教程docs/getting-started/cpu-profiling.md指南docs/getting-started/other-formats.md可视化 perf 文件仓库中 test/configs/scheduling.cfg 是内核级调度追踪的典型配置它通过linux.ftrace数据源订阅sched_switch、sched_waking等一系列 sched 事件配合linux.process_stats数据源解析进程命令行与父子关系ftrace 事件只有 pid再设置 10 秒时长是一份可直接运行的内核行为观察示例。C/C 开发者非 Android如果你在 Linux、macOS 或 Windows 上开发 C/C 应用Perfetto 的 Tracing SDK 允许你插桩代码以理解其行为、定位性能特征在 Linux 上还有专门的堆与 CPU profiling 工具用于深入调查资源使用。要理解应用执行流、调试行为或寻找性能瓶颈集成 Tracing SDK 后可以添加自定义 trace 点计时 slice、数值 counter、因果 flow event在时间线上可视化内部操作、度量函数或任务耗时、识别慢段并调试复杂交互教程docs/getting-started/in-app-tracing.md参考docs/instrumentation/tracing-sdk.mdSDK 提供两类插桩抽象互相叠加、在代码复杂度与表达能力之间取舍Track events是推荐默认项基于TRACE_EVENT注解标签处理了线程安全、flush、字符串 interning 等细节custom data sources用于数据不适合 track 概念或数据量大到需要强类型 schema 的罕见场景需同时修改 Trace Processor 才能导入。SDK 源码以perfetto.h/perfetto.cc两个自包含文件的形式发布C17 即可仓库中 examples/sdk/ 提供了完整可构建的示例含 example.ccTrack events、example_custom_data_source.cc自定义数据源、example_system_wide.cc系统模式等。Linux 专属降低应用 CPU 占用可捕获 CPU profile 精确定位消耗 CPU 周期最多的函数教程docs/getting-started/cpu-profiling.mdLinux 专属调查 C/C 应用的 native 内存使用堆剖析器可跟踪malloc/free或new/delete调用并将分配归因到具体调用栈是发现泄漏、理解内存 churn、寻找降低内存足迹机会的关键教程docs/getting-started/memory-profiling.md参考docs/data-sources/native-heap-profiler.mdRust 开发者Rust 开发者可以使用社区维护的 Perfetto Rust SDK 为代码添加 trace 点、录制 trace 并与 Perfetto tracing 服务集成。它支持标准 Rusttracingcrate 以及直接的 Perfetto track event 宏。仓库中的 contrib/rust-sdk/ 即该 SDK 的源码拆分为perfetto-sdk核心 SDK、perfetto-sdk-sysC API 的 FFI 绑定、perfetto-sdk-derive#[tracefn]过程宏、tracing-perfetto-sdktracing-subscriberLayer等多个 crate。SDK 提供 track event 宏、用于自动函数插桩的#[tracefn]过程宏以及把 Rusttracing生态桥接到 Perfetto 的tracing-subscriberLayer教程docs/getting-started/rust-sdk.mdChromium 开发者Perfetto 支撑着 Chromium 浏览器及其相关项目Angle、Skia、V8的 chrome://tracing 系统。Chromium 项目自身有大量内部文档与最佳实践而 Perfetto 提供了底层工具。若想从 Chrome 捕获 trace官方教程给出了使用 Perfetto UI 的直接途径教程docs/getting-started/chrome-tracing.md手头有trace 类数据的用户Perfetto 强大的 UI 与 Trace Processor 并不限于 Perfetto 自己录制的 trace。如果你有来自其他系统的 trace 或自定义的带时间戳数据同样可以借助 Perfetto 进行可视化与分析。其他工具的 traceChrome JSON、Android Systrace、Linux perf、Fuchsia、Firefox Profiler 等可以直接打开。Perfetto UI 与 Trace Processor 开箱即用地支持多种常见 trace 格式让你能在已有数据上使用 Perfetto 的高级可视化与 SQL 分析能力指南docs/getting-started/other-formats.md列出支持的格式及打开方式如果数据不在直接支持的格式中可以将其转换为 Perfetto 的原生 protobuf 格式从而在时间线上表示几乎任何类型的带时间戳活动并在它们之间建立复杂关联指南docs/getting-started/converting.md参考docs/reference/synthetic-track-event.md合成 trace 的 TrackEvent protobuf 定义其他角色Perfetto 的核心能力概览如果上面的分类没有覆盖你的角色也不必担心。Perfetto 的核心能力可能仍然与你的需求高度相关录制丰富的时间线数据高性能 Tracing SDK 深度集成系统级数据源如 Linux/Android 上的 ftrace可捕获应用与系统的细粒度时间相关事件。可以创造性地思考你的问题能否通过给 C/C 代码插桩、把事件记录到时间线上来解决参见 docs/getting-started/in-app-tracing.md已有的带时间戳数据系统也许能转换成 Perfetto 可理解的格式参见 docs/getting-started/converting.md。强大的时间线可视化无需写代码Perfetto UI 专为直观探索大型复杂 trace 而设计可导航时间线、缩放到纳秒级细节、检查事件属性、跨进程与硬件组件关联活动全部通过图形界面完成。UI 还能直接打开多种 外部 trace 格式并提供 Debug Tracks 等功能通过简单的 UI 配置实现复杂的数据聚合与自定义可视化。深入的程序化 trace 分析要超越视觉检查、自动化分析或提取自定义指标Trace Processor 引擎允许你用 SQL 查询 trace这个强大的后端可以程序化访问。如果有周期性分析任务或想从任意 tracePerfetto 原生或转换而来提取特定指标Trace Processor 是不可或缺的。深入阅读与实操入口如果你是初次使用 Perfetto推荐按以下顺序实践录制你的第一条系统 trace按 docs/getting-started/system-tracing.md 的指引操作。Android 上既可以在 Perfetto UI 的 Record 页录制需要 Android R 设备、开启开发者选项与 USB 调试也可以用命令行脚本tools/record_android_trace需 Android M 与 adbpython3 record_android_trace \ -o trace_file.perfetto-trace \ -t 10s \ # 录制 10 秒 -b 32mb \ # 主缓冲区 32MB -a * \ # 开启所有应用的 atrace 注解 sched freq view ss input # 关键探针CPU 调度/频率 atrace 注解录制完成后 trace 会自动在浏览器中打开 Perfetto UI。若通过 SSH 在远程机器上运行请加--no-open参数并手动下载 trace 文件。该脚本源码在 tools/record_android_trace其--help还支持-c传入完整 trace 配置、-s指定设备 serial、--no-guardrails关闭护栏等选项。Linux 上则下载静态链接的tracebox二进制自 Perfetto v16 起把所有需要的二进制打包成单个可执行文件类似toybox/busybox配合 test/configs/ 下的示例配置运行curl -LO https://get.perfetto.dev/tracebox chmod x tracebox curl -LO https://raw.githubusercontent.com/google/perfetto/refs/heads/main/test/configs/scheduling.cfg ./tracebox -o trace_file.perfetto-trace --txt -c scheduling.cfg由于调度信息通过 ftrace 采集Linux 上可能需要以 root 权限运行。可视化与 SQL 分析在 Perfetto UI 中打开 trace 后可用 WASD 缩放/平移、用鼠标展开进程轨道的线程轨道按?查看导航帮助。点击左侧 Query (SQL) 标签即可用 PerfettoSQL 查询例如INCLUDE PERFETTO MODULE sched.with_context; SELECT * FROM sched_with_thread_process LIMIT 100;按需深入若不确定从哪开始可以使用文档侧边导航浏览 Concepts、Data Sources 等分区有问题可在 Discord 或公开邮件列表提问。最后Perfetto 的边界也值得了解见 docs/README.md它不是分布式 tracing 系统OpenTelemetry、Jaeger 一类更合适不在 Windows/macOS 上录制系统级 trace不适合端到端低延迟读回场景也不是最低开销的录制方案SDK 更看重性能、灵活性与安全性的均衡支持任意大小事件、多进程协调、并发会话、动态 buffer 复用、嵌套 key-value 参数、字符串 interning、flow 事件与动态事件名等特性。理解这些前提能帮助你更准确地判断 Perfetto 是否适合你的具体场景。【免费下载链接】perfettoProduction-grade client-side tracing, profiling, and analysis for complex software systems.项目地址: https://gitcode.com/GitHub_Trending/pe/perfetto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
