Perfetto中如何使用SQL语句
在使用 Perfetto 分析 Android 性能时,可以通过 Perfetto 提供的内置 SQL 查询来提取和分析不同的性能数据。Perfetto 允许你在 UI 界面或命令行中运行 SQL 查询,提取出 Trace 数据中包含的各种性能信息,比如 CPU 使用率、线程状态、内存分配等。
以下是如何在 Perfetto 中结合 SQL 查询的具体步骤:
1. 打开 Perfetto UI 并载入 Trace 数据
- 打开 Perfetto UI 并载入你的 .perfetto-trace 文件。
- 载入文件后,可以通过 SQL 视图来查询 trace 文件中的信息。
2. 使用 SQL 查询提取性能数据
在 Perfetto UI 的 “Query Execution” 面板里,你可以直接编写 SQL 查询。Perfetto 的 trace 数据是以关系数据库表的形式存储的,常见的表包括:
- sched: 包含 CPU 调度事件(线程何时被调度或暂停)。
- slice: 包含所有的事件切片,记录了事件的开始和结束时间。
- heap_profile_allocation: 包含内存分配事件(通常用于跟踪应用的内存分配)。
- counter: 包含各种计数器数据(比如电池、电流、电压等)。
以下是一些常用的 SQL 查询示例。
示例 1:查询线程的 CPU 使用情况
SELECT
ts AS timestamp,
dur AS duration,
cpu,
utid AS thread_id
FROM
sched
WHERE
cpu = 0 -- 指定查询第一个 CPU 的调度情况
ORDER BY
ts;
此查询会返回在第一个 CPU 上调度的所有线程的信息,包括时间戳、调度时长、CPU 编号和线程 ID。
示例 2:查询特定进程的内存分配
SELECT
ts AS timestamp,
pid,
heap_name,
sample_size
FROM
heap_profile_allocation
WHERE
pid = 1234 -- 替换为目标进程的 PID
ORDER BY
ts;
这个查询可以用于分析特定进程的内存分配情况,包括分配时间、进程 ID、堆名称以及分配大小。
示例 3:查询特定事件的持续时间
SELECT
name AS event_name,
ts AS start_time,
dur AS duration,
thread_dur AS thread_duration,
cpu_dur AS cpu_duration
FROM
slice
WHERE
name LIKE '%Draw%' -- 查询事件名称包含“Draw”的所有事件
ORDER BY
ts;
此查询将列出所有名称中包含“Draw”的事件(如绘制帧的操作),包括它们的开始时间、持续时间、线程持续时间和 CPU 持续时间。
3. 在命令行使用 Perfetto SQL
如果需要在命令行使用 SQL 查询分析 Trace 数据,可以使用 trace_processor_shell
工具:
trace_processor_shell my_trace_file.perfetto-trace
然后在 Shell 中直接运行 SQL 查询:
SELECT name, dur FROM slice WHERE dur > 100000;
这将返回所有持续时间超过 100 毫秒的事件,适合用于排查性能瓶颈。
总结
Perfetto 的 SQL 查询强大且灵活,适合多种性能分析场景。通过这些 SQL 查询,你可以有效地提取和分析 Android Trace 数据中的关键信息,以便诊断和优化性能问题。