perfetto入门[一]-抓trace

52 阅读4分钟

perfetto入门[一]-抓trace

1、基本概念

Perfetto 是一个开源的 SDK、守护进程和工具套件,使用 tracing 帮助开发者理解复杂系统的行为,并在客户端/嵌入式系统上定位功能和性能问题的根本原因。

  • 高性能 tracing 守护进程
  • 低开销 tracing SDK
  • Android 和 Linux 上丰富的系统级 Probe(例如调度状态、CPU 频率、memory profiling、调用栈采样)
  • 完全本地的、基于浏览器的 UI
  • 强大的、基于 SQL 的分析库

01-whatisperfetto.png

2、可以使用perfetto来做什么呢?

2.1 性能优化

如果我们是android应用或者平framework开发者,perfetto是用来做性能开发的强大工具,它也是android默认的tracing工具。性能优化常见场景:

  • 某个操作耗时很长
  • 事件序列异常
  • 不同进程和系统服务之间的交互
  • 应用或者系统内存占用过高
  • 如何优化cpu使用
  • 各系统组件状态

2.2 学习系统代码

有了perfetto之后学习framework代码不再只依靠日志,可以同时查看多个进程在同一时刻的状态,以及各进程之间的交互。系统 trace 提供了跨内核、系统服务和应用程序活动的详细、时间相关的视图。这对于理解复杂的交互和调试跨多个组件的问题非常宝贵。 perfetto 相当于⼀个“可视化的⽇志系统”。

3、如何采集系统traces数据

3.1 命令行-adb shell perfetto

简易版本抓取trace

adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 10s sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory

adb pull /data/misc/perfetto-traces/trace_file.perfetto-trace

3.2 脚本抓取 - record_android_trace

谷歌有提供工具,用于在 Android 上从命令行采集 traces并在结束后直接打开perfetto UI。 要求是要USB连接Android设备和电脑,要有adb。 脚本获取谷歌路径

curl -O https://raw.githubusercontent.com/google/perfetto/main/tools/record_android_trace

如果没有魔法,可以直接使用源码里external/perfetto/tools/record_android_trace

~/work/android16/external/perfetto/tools$ python3 record_android_trace -o trace_file.perfetto-trace -t 10s -b 32mb -a '*' sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory

#详细设置说明
python3 record_android_trace \
   -o trace_file.perfetto-trace
   # 此选项将 trace 配置为运行 10 秒。
   -t 10s \
   # 此选项将主缓冲区大小配置为 32MB。
   -b 32mb \
   # 此选项启用来自系统上所有应用程序的 atrace annotations。
   -a '*' \
   # 这些选项指定设备上一些最重要的插桩:CPU scheduling/frequency 以了解 CPU 上正在运行什么以及
   # 系统对工作的重要性,以及 atrace annotations 以了解 userspace 进程(平台和应用程序)内部发生的情况。
   sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory

3.3 perfetto UI直接抓取需要谷歌网下载工作!改用里面提供的命令行搭配config

如果你有谷歌网络可以根据perfetto UI提示: 1 导航到perfetto UI 2 点击左侧工具栏Record New Trace 3 进入到如下界面按照屏幕上的说明连接到你的设备

02-record_new_trace人.png 4 启用你想采集的probe(cpu、gpu、android系统服务、网络、内存、堆栈等) 5 点击绿色的 "Start Recording" 按钮,当 trace 正在录制时,在 Android 设备上执行一些操作 6 等设置的采集时间到后trace 将自动停止,将切换到收集的 trace 的 Timeline 视图。

如果没有谷歌网络,可以之间使用config文件,配置想采集的probe信息。config文件可以在UI界面选择后Cmdline instructions里看到完整的配置和命令行。

# 在网页下载好config文件后,保存到到与设备usb连接的电脑,然后执行以下命令,就开始采集traces
cat config.txtpb | adb shell perfetto -c - --txt -o /data/misc/perfetto-traces/trace.pftrace
#trace停止后再拉取下来
adb pull /data/misc/perfetto-traces/trace_file.perfetto-trace

目前这种方式是最常用的,可以根据自己的需求来采集trace。 一个简单的config实例:

buffers {
  size_kb: 65536
  fill_policy: DISCARD
}
buffers {
  size_kb: 4096
  fill_policy: DISCARD
}
data_sources {
  config {
    name: "linux.ftrace"
    ftrace_config {
      ftrace_events: "sched/sched_process_exit"
      ftrace_events: "sched/sched_process_free"
      ftrace_events: "task/task_newtask"
      ftrace_events: "task/task_rename"
      ftrace_events: "sched/sched_switch"
      ftrace_events: "power/suspend_resume"
      ftrace_events: "sched/sched_blocked_reason"
      ftrace_events: "sched/sched_wakeup"
      ftrace_events: "sched/sched_wakeup_new"
      ftrace_events: "sched/sched_waking"
      ftrace_events: "sched/sched_process_exit"
      ftrace_events: "sched/sched_process_free"
      ftrace_events: "task/task_newtask"
      ftrace_events: "task/task_rename"
      ftrace_events: "power/cpu_frequency"
      ftrace_events: "power/cpu_idle"
      ftrace_events: "power/suspend_resume"
      ftrace_events: "power/psci_domain_idle_enter"
      ftrace_events: "power/psci_domain_idle_exit"
      ftrace_events: "power/gpu_frequency"
      ftrace_events: "gpu_mem/gpu_mem_total"
      ftrace_events: "power/gpu_work_period"
      ftrace_events: "ftrace/print"
      atrace_categories: "aidl"
      atrace_categories: "am"
      atrace_categories: "binder_driver"
      atrace_categories: "camera"
      atrace_categories: "dalvik"
      atrace_categories: "disk"
      atrace_categories: "freq"
      atrace_categories: "gfx"
      atrace_categories: "hal"
      atrace_categories: "idle"
      atrace_categories: "input"
      atrace_categories: "memory"
      atrace_categories: "memreclaim"
      atrace_categories: "network"
      atrace_categories: "power"
      atrace_categories: "res"
      atrace_categories: "sched"
      atrace_categories: "ss"
      atrace_categories: "sync"
      atrace_categories: "thermal"
      atrace_categories: "view"
      atrace_categories: "webview"
      atrace_categories: "wm"
      atrace_categories: "workq"
      atrace_apps: "*"
      symbolize_ksyms: true
      disable_generic_events: true
    }
  }
}
data_sources {
  config {
    name: "linux.process_stats"
    target_buffer: 1
    process_stats_config {
      scan_all_processes_on_start: true
    }
  }
}
data_sources {
  config {
    name: "linux.sys_stats"
    sys_stats_config {
      stat_period_ms: 1000
      stat_counters: STAT_CPU_TIMES
      stat_counters: STAT_FORK_COUNT
      cpufreq_period_ms: 1000
    }
  }
}
data_sources {
  config {
    name: "android.gpu.memory"
  }
}
data_sources {
  config {
    name: "android.log"
    android_log_config {
    }
  }
}
data_sources {
  config {
    name: "android.surfaceflinger.frametimeline"
  }
}
duration_ms: 15000

4、查看trace

这里只看下perfetto UI timeline视图的样子。

03-perfetto-ui-overview.png

参考

什么是 Perfetto?
如何开始使用 Perfetto
使用 Perfetto 采集 system traces