学习记录:Perfetto工具_3 界面了解

0 阅读11分钟

使用浏览器打开 ui.perfetto.dev/ 界面如下: 页面图1.png

页面图2.png

Buffers and duration

image.png

Recording mode(录制模式)

这里提供了两种模式:

  • Stop when full(缓冲区满即停止)
    当分配的缓冲区写满时,自动停止录制。适合短时间、精确的事件捕捉。
  • Ring buffer(环形缓冲区)
    缓冲区写满后,新数据会覆盖最旧的数据,持续录制直到手动停止。适合长时间监控,但可能丢失早期数据。
  • Long trace(长时跟踪)
    一种结合了文件流出的模式,可以将数据实时写入磁盘,支持非常长时间的录制(需设备支持)。

Recording settings(录制设置)

In-memory buffer size(内存缓冲区大小)

  • 含义:分配给跟踪数据的内存缓冲区总大小。截图显示为 64 MB
  • 作用:缓冲区越大,能存储的跟踪数据越多,尤其在短时间内采集大量事件(如 CPU 调度、GPU 活动)时很有用。但过大会占用系统内存。

Max duration(最大持续时间)

  • 含义:录制的最长时间,到达设定时间后自动停止。截图显示为 00:01:00(1 分钟)。
  • 作用:限制录制时长,避免生成过大的文件或无限录制。

Deflate (gzip) compression(gzip 压缩)

  • 含义:录制结束后对跟踪文件进行压缩,减小文件体积。

使用命令查看你的设备,支持哪些数据源

adb shell perfetto --query
数据源名称说明
android.heapprofd用于分析 Native 内存分配,可追踪 C/C++ 堆内存的申请和释放,帮助定位内存泄漏和堆使用情况。
android.java_hprof用于生成 Java 堆转储文件(HPROF),分析 Java 对象的内存占用和引用关系。
android.log采集 logcat 日志,可将指定的日志级别和标签输出到跟踪文件中,便于关联系统事件。
android.packages_list记录系统中安装的包信息,包括包名、UID、版本等,常用于关联进程与应用程序。
android.polled_state轮询式采集系统状态信息,如电池、充电状态、电量等。
android.power跟踪电源管理相关事件,包括电源 rails 的电流/电压、充电状态、电量变化等,用于功耗分析。
android.surfaceflinger.frame采集 SurfaceFlinger 的帧信息,包括帧开始/结束、合成耗时、VSYNC 时间戳(含 vsync-app)等,是分析显示流畅度的关键数据源。
android.surfaceflinger.frametimeline提供更精细的帧时间线数据,追踪从应用绘制到屏幕显示的全链路延迟,通常与 android.surfaceflinger.frame 配合使用。
linux.ftrace基于内核 ftrace 的事件采集,可捕获调度、CPU 频率、中断、系统调用等底层事件,是最常用的数据源之一。
linux.inode_file_map记录文件 inode 到文件路径的映射,用于将文件操作(如 I/O)与具体文件关联。
linux.perf基于 perf_event_open 的性能计数器采样,用于 CPU 性能分析(如采样调用栈、统计 CPU 周期等)。
linux.process_stats轮询式采集进程/线程的统计信息,包括 CPU 时间、内存占用(PSS/RSS)、线程数等,用于监控资源变化。
linux.sys_stats采集系统级统计信息,如 CPU 使用率、内存使用、磁盘 I/O、网络流量等(来自 /proc/stat、/proc/meminfo 等)。
linux.system_info记录系统基本信息,如内核版本、CPU 型号、硬件配置等,用于辅助分析。
perfetto.metatrace用于调试 Perfetto 自身性能的内部跟踪,记录 Perfetto 服务的元事件,通常开发者使用。

这些数据源可以组合使用,根据分析目标选择合适的配置。例如,要分析 UI 渲染性能,可以启用 android.surfaceflinger.framelinux.ftrace(配合 gfxview 等 ATrace 类别);要排查内存问题,可选用 android.heapprofdandroid.java_hprof

CPU

cpu页面.png CPU给出了四类收集方式:

Coarse CPU usage counter(粗略 CPU 使用计数器)

Scheduling details(调度细节)

CPU frequency and idle states(CPU 频率与空闲状态)

Syscalls(系统调用)

探针数据量开销精度主要用途
Coarse CPU usage极低秒级整体负载趋势
Scheduling details微秒级线程调度分析
CPU freq & idle事件级功耗/性能分析
Syscalls极大微秒级系统调用追踪

GPU

gpu页面.png

探针适用 GPU数据量主要用途你的设备
GPU frequency通用频率/功耗分析✅ 可用
GPU memoryAndroid 12+显存占用✅ 可用
GPU work periodAndroid 14+应用级 GPU 统计⚠️ 需 Android 14+
GPU Render Stages需支持渲染管线分析⚠️ 需检查支持性
Mali GPU CountersMali only硬件计数器不可用
Mali Fence EventsMali only同步分析不可用

Power(电源)

power页面.png

探针监控对象数据粒度主要用途
Battery drain & power rails电池 + 各子系统功耗250ms 轮询耗电分析、续航优化
Board voltages & frequencies主板电压/频率传感器事件驱动电源管理策略、硬件调试

Android apps & svcs

app页面1.png

ATrace 类别详解

类别英文全称说明
adbADBADB 调试相关事件(连接、命令执行)
aidlAIDL callsAndroid 接口定义语言跨进程调用
amActivity ManagerActivity 生命周期管理(启动、暂停、恢复)
audioAudio音频播放、录制、路由
binder_driverBinder Kernel driverBinder 内核驱动事件(IPC 通信底层)
binder_lockBinder global lock traceBinder 全局锁竞争追踪
bionicBionic C LibraryBionic C 库(malloc、free、pthread、文件操作)
cameraCamera相机操作(打开、预览、拍照、录像)
dalvikDalvik VMDalvik/ART 虚拟机(GC、JIT、类加载)
databaseDatabase数据库操作(SQLite 查询、事务)
diskDisk I/O磁盘读写操作
freqCPU FrequencyCPU 频率变化(DVFS)
gfxGraphics图形渲染(关键!Skia、OpenGL、Vulkan、RenderThread)
halHardware Modules硬件抽象层模块
idleCPU IdleCPU 空闲状态进入/退出
inputInput输入事件(触摸、按键、传感器)
memoryMemory内存分配/回收
memreclaimKernel Memory Reclaim内核内存回收(kswapd、LMK)
networkNetwork网络操作(WiFi、移动数据、Socket)
nnapiNNAPI神经网络 API(AI 推理加速)
pmPackage Manager包管理器(安装、卸载、查询应用)
powerPower Management电源管理(休眠、唤醒、省电模式)
resResource Loading资源加载(XML、图片、字符串)
rroRuntime Resource Overlay运行时资源覆盖(主题、定制)
rsRenderScriptRenderScript 计算框架
schedCPU SchedulingCPU 调度(上下文切换、线程迁移)
smSync Manager同步管理器(账户同步)
ssSystem Server系统服务(SystemServer 进程事件)
syncSynchronization同步机制(锁、屏障)
thermalThermal event热管理事件(温控、降频)
vibratorVibrator震动器控制
videoVideo视频编解码、播放
viewView System视图系统(关键!测量、布局、绘制)
webviewWebViewWebView 加载、渲染、JS 执行
wmWindow Manager窗口管理(关键!Surface 创建、窗口动画)
workqKernel Workqueues内核工作队列

Event log(logcat)类别详解

类别说明
Crash崩溃日志(Java/Native 崩溃)
Main主日志缓冲区(应用日志)
Binary events二进制事件日志
Kernel内核日志(printk)
Radio射频/基带日志
Security安全相关日志
Stats统计日志
System系统日志(framework)

app页面2.png

探针数据类型主要用途版本要求
Frame timeline帧时间戳UI 卡顿/掉帧分析Android 12+
Game intervention list游戏模式状态游戏性能限制排查Android 13+
Network Tracing网络数据包网络性能分析Android 14+
Statsd atoms系统统计指标系统级趋势分析通用

Network(网络)

network页面.png

选项数据量详细程度主要用途
802.11 layer events协议层(连接/扫描/认证)Wi-Fi 连接问题
Packets TX/RX极大包级(每个数据包)吞吐量/延迟分析
Additional ftrace events依配置驱动特定厂商驱动调试

Stack sampling(栈采样)

stack.png

buffers {
  size_kb: 65536  // 缓冲区大小:64MB(65536 KB)
  fill_policy: RING_BUFFER 环形缓冲区(满了覆盖旧数据,适合长时间采集)
}
data_sources {
  config {
    name: "linux.perf"   // 数据源名称:Linux perf 事件(用于 CPU 性能计数和堆栈采样)
    // perf 事件详细配置
    perf_event_config {
      timebase {   // 时间基准配置
        frequency: 100  // 采样频率:100 Hz(每秒采样 100 次,每 10ms 一次)
        timestamp_clock: PERF_CLOCK_MONOTONIC // 时间戳时钟类型:单调时钟(MONOTONIC,不受系统时间调整影响)
      }
      callstack_sampling { // 调用栈采样配置(生成火焰图)
        scope {  // 采样范围配置
          target_cmdline: "com.android.phone"   // 目标进程:只采样 com.android.phone 进程,可添加多行 target_cmdline 指定多个进程
        }
      }
    }
  }
}
duration_ms: 60000   // 追踪持续时间:60 秒(60000 毫秒)
compression_type: COMPRESSION_TYPE_DEFLATE // 压缩类型:DEFLATE(zlib 压缩,减小文件大小)

Perfetto SDK

perfettosdk.png

代码示例对比

API 类型代码示例
旧 ATraceATRACE_BEGIN("draw"); / Trace.beginSection("draw")
新 Perfetto SDKPERFETTO_TE_SLICE_BEGIN("draw"); / os.PerfettoTrace.begin("draw")

Options(预定义类别)

类别英文说明
mqMessage Queue消息队列事件(线程间通信)
gfxGraphics图形渲染事件(关键!)
servicemanagerService Manager服务管理器(Binder 服务注册/查找)

对比总结:Perfetto SDK vs ATrace

特性ATracePerfetto SDK
API 年代旧(Android 4.3+)新(Android 10+)
性能开销中等更低
功能丰富度基础更丰富(支持异步事件、计数器、元数据)
数据类型仅时间区间时间区间 + 计数器 + 瞬时事件
平台支持AndroidAndroid + Linux + Chrome
推荐度兼容旧代码新项目推荐

应用代码中使用 Perfetto SDK

C++ 代码

#include "perfetto/tracing.h"

void MyRenderer::Draw() {
    // 开始追踪区间
    TRACE_EVENT_BEGIN("gfx", "DrawFrame");
    
    // ... 渲染代码 ...
    
    // 结束追踪区间
    TRACE_EVENT_END("gfx");
}

Java/Kotlin 代码

import android.os.PerfettoTrace

fun drawFrame() {
    // 开始追踪区间
    PerfettoTrace.beginSection("gfx", "DrawFrame")
    
    // ... 渲染代码 ...
    
    // 结束追踪区间
    PerfettoTrace.endSection()
}

Advanced settings(高级设置)

advanced1页面.png

buffers {
  size_kb: 65536 缓冲区大小:64MB(65536 KB)
  fill_policy: RING_BUFFER 环形缓冲区(满了覆盖旧数据,适合长时间采集)
}
data_sources {
  config {
    name: "linux.ftrace" // 数据源名称:Linux Ftrace(内核追踪)
   
    ftrace_config {  // Ftrace 详细配置
      // ========== Event groups(事件组)==========
      ftrace_events: "binder/*"  // Binder IPC 驱动事件(跨进程通信)
      ftrace_events: "block/*"  // 块设备 I/O 事件(磁盘/存储读写)
      ftrace_events: "clk/*"  // 时钟子系统事件(CPU/GPU/总线时钟)
      ftrace_events: "devfreq/*" // 设备频率调节事件(GPU、DDR 等 DVFS)
      ftrace_events: "ext4/*"    // Ext4 文件系统事件
      ftrace_events: "f2fs/*"  // F2FS 文件系统事件
      ftrace_events: "i2c/*" // I2C 总线通信事件
      ftrace_events: "irq/*"  // 中断处理事件
      ftrace_events: "kmem/*"   // 内核内存分配事件(kmalloc、slab)
      ftrace_events: "memory_bus/*"   // 内存总线事件
      ftrace_events: "mmc/*"   // MMC/SD 卡控制器事件
      ftrace_events: "oom/*"   // 内存不足(OOM)事件
      ftrace_events: "power/*"  // 电源管理事件(CPU 频率、空闲状态)
      ftrace_events: "regulator/*" // 电源调节器事件(电压调节)
      ftrace_events: "sched/*"  // CPU 调度事件(线程切换、唤醒、阻塞)
      ftrace_events: "sync/*"    // 同步机制事件(fence、barrier)
      ftrace_events: "task/*"  // 任务管理事件(fork、exec、exit)
      ftrace_events: "vmscan/*"  // 内存回收事件(kswapd、page reclaim)
      ftrace_events: "fastrpc/*"  // 高通 FastRPC 远程调用事件
      buffer_size_kb: 2048 // Ftrace 环形缓冲区大小:2MB(2048 KB)
      drain_period_ms: 500  // 数据读取间隔:500 毫秒(从内核读取到 Perfetto)
      symbolize_ksyms: true  // 启用内核符号解析(将地址转换为函数名),需要 userdebug/eng 版本,user 版本无效
      disable_generic_events: true  // 禁用通用事件捕获(只采集上面明确指定的事件) 减少开销,避免未知事件淹没缓冲区
    }
  }
}
duration_ms: 60000 // 追踪持续时间:60 秒(60000 毫秒)
compression_type: COMPRESSION_TYPE_DEFLATE  // 压缩类型:DEFLATE(zlib 压缩,减小文件大小)

advanced2页面.png

# ===================== 缓冲区配置 =====================
# 主缓冲区:大小64MB(65536 KB),采用环形缓冲区(数据满了覆盖旧数据)
buffers {
  size_kb: 65536          # 缓冲区大小,单位KB(65536 KB = 64 MB),用于存储主要追踪数据
  fill_policy: RING_BUFFER 
}
buffers {
  size_kb: 4096           # 次要缓冲区大小,单位KB(4096 KB = 4 MB),专门给进程统计数据使用
  fill_policy: RING_BUFFER 
}

# ===================== 数据源1:Linux Ftrace(核心系统事件) =====================
data_sources {
  config {
    name: "linux.ftrace"  # 数据源名称:Linux Ftrace(Linux内核底层追踪机制),用于抓取内核级事件
    ftrace_config {        # Ftrace专属配置块
      ftrace_events: "sched/sched_process_exit"  # 抓取进程退出事件(记录进程结束的时间、PID等)
      ftrace_events: "sched/sched_process_free"  # 抓取进程资源释放事件(记录进程完全销毁、资源回收的事件)
      ftrace_events: "task/task_newtask" # 抓取新进程创建事件(记录新进程/线程创建的时间、父进程PID等)
      ftrace_events: "task/task_rename"  # 抓取进程重命名事件(记录进程名称修改的事件,比如线程改名)
    }
  }
}

# ===================== 数据源2:Linux进程统计 =====================
data_sources {
  config {
    name: "linux.process_stats" # 数据源名称:Linux进程统计,用于抓取进程/线程的基本信息
    target_buffer: 1            # 指定该数据源的数据写入到第2个缓冲区(上面定义的4MB缓冲区),隔离进程统计数据
    process_stats_config {      # 进程统计专属配置块
      # 启动追踪时,立即扫描系统中所有正在运行的进程,确保初始进程列表完整
      scan_all_processes_on_start: true
    }
  }
}

# ===================== 全局配置 =====================
duration_ms: 60000                # 追踪时长:60000毫秒 = 60秒,达到时长后自动停止追踪
compression_type: COMPRESSION_TYPE_DEFLATE # 压缩类型:使用DEFLATE算法(类似ZIP)压缩trace文件,减小文件体积