鏇存柊鏂囨。
This commit is contained in:
1040
docs/学习笔记/perfetto分析trace提效的办法或者方案.md
Normal file
1040
docs/学习笔记/perfetto分析trace提效的办法或者方案.md
Normal file
File diff suppressed because it is too large
Load Diff
488
docs/学习笔记/perfetto看trace关键词.md
Normal file
488
docs/学习笔记/perfetto看trace关键词.md
Normal file
@@ -0,0 +1,488 @@
|
||||
# Perfetto看Trace关键词
|
||||
|
||||
## 一、应用启动相关关键词
|
||||
|
||||
### 1. 进程创建
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `startProcess` | 进程启动 | SystemServer/ActivityManagerService |
|
||||
| `ActivityManager: startProcess` | ActivityManager启动进程 | SystemServer |
|
||||
| `Zygote: forkAndSpecialize` | Zygote进程fork | Zygote进程 |
|
||||
| `Process: start` | 进程启动 | SystemServer |
|
||||
| `task_newtask` | 新任务创建 | Kernel |
|
||||
| `task_rename` | 任务重命名 | Kernel |
|
||||
|
||||
### 2. Application初始化
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `handleBindApplication` | 绑定Application | 应用主线程 |
|
||||
| `ActivityThread: handleBindApplication` | ActivityThread处理绑定 | 应用主线程 |
|
||||
| `Application.onCreate` | Application初始化 | 应用主线程 |
|
||||
| `attachBaseContext` | 附加基础上下文 | 应用主线程 |
|
||||
| `installContentProviders` | 安装ContentProvider | 应用主线程 |
|
||||
|
||||
### 3. Activity创建
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `performLaunchActivity` | 执行启动Activity | 应用主线程 |
|
||||
| `ActivityThread: performLaunchActivity` | ActivityThread启动Activity | 应用主线程 |
|
||||
| `Activity.onCreate` | Activity创建 | 应用主线程 |
|
||||
| `Activity.onStart` | Activity启动 | 应用主线程 |
|
||||
| `Activity.onResume` | Activity恢复 | 应用主线程 |
|
||||
| `onWindowFocusChanged` | 窗口焦点变化 | 应用主线程 |
|
||||
|
||||
### 4. 首帧渲染
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `Choreographer#doFrame` | 帧调度 | 应用主线程 |
|
||||
| `onMessageReceived` | 消息接收 | SurfaceFlinger |
|
||||
| `SurfaceFlinger: onMessageReceived` | SurfaceFlinger接收消息 | SurfaceFlinger |
|
||||
| `firstFrame` | 首帧 | SurfaceFlinger |
|
||||
| `Displayed` | 显示完成 | 应用主线程 |
|
||||
|
||||
## 二、渲染相关关键词
|
||||
|
||||
### 1. 帧调度
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `Choreographer#doFrame` | 帧调度 | 应用主线程 |
|
||||
| `doFrame` | 执行帧 | 应用主线程 |
|
||||
| `doCallbacks` | 执行回调 | 应用主线程 |
|
||||
| `doAnimationFrame` | 执行动画帧 | 应用主线程 |
|
||||
| `doTraversal` | 执行遍历 | 应用主线程 |
|
||||
|
||||
### 2. 视图系统
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `performTraversals` | 执行遍历 | 应用主线程 |
|
||||
| `performMeasure` | 执行测量 | 应用主线程 |
|
||||
| `performLayout` | 执行布局 | 应用主线程 |
|
||||
| `performDraw` | 执行绘制 | 应用主线程 |
|
||||
| `onMeasure` | 测量 | 应用主线程 |
|
||||
| `onLayout` | 布局 | 应用主线程 |
|
||||
| `onDraw` | 绘制 | 应用主线程 |
|
||||
| `invalidate` | 失效 | 应用主线程 |
|
||||
| `requestLayout` | 请求布局 | 应用主线程 |
|
||||
|
||||
### 3. RenderThread
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `drawFrame` | 绘制帧 | RenderThread |
|
||||
| `dequeueBuffer` | 获取Buffer | RenderThread |
|
||||
| `queueBuffer` | 提交Buffer | RenderThread |
|
||||
| `syncAndDrawFrame` | 同步并绘制帧 | RenderThread |
|
||||
| `flush` | 刷新 | RenderThread |
|
||||
| `flushCommands` | 刷新命令 | RenderThread |
|
||||
|
||||
### 4. SurfaceFlinger
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `onMessageReceived` | 接收消息 | SurfaceFlinger |
|
||||
| `onFrameAvailable` | 帧可用 | SurfaceFlinger |
|
||||
| `doComposition` | 执行合成 | SurfaceFlinger |
|
||||
| `doComposeSurfaces` | 合成表面 | SurfaceFlinger |
|
||||
| `postComposition` | 后合成 | SurfaceFlinger |
|
||||
| `VSync` | 垂直同步 | SurfaceFlinger |
|
||||
| `onVSync` | VSync事件 | SurfaceFlinger |
|
||||
|
||||
### 5. GPU相关
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `gpu_mem_total` | GPU内存总量 | Kernel |
|
||||
| `mali_gpu_total` | Mali GPU总量 | Kernel |
|
||||
| `gpu_freq` | GPU频率 | Kernel |
|
||||
| `gpu_utilization` | GPU使用率 | Kernel |
|
||||
|
||||
## 三、系统服务相关关键词
|
||||
|
||||
### 1. ActivityManager
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `ActivityManager: startActivity` | 启动Activity | SystemServer |
|
||||
| `ActivityManager: startService` | 启动Service | SystemServer |
|
||||
| `ActivityManager: bindService` | 绑定Service | SystemServer |
|
||||
| `ActivityManager: startProcess` | 启动进程 | SystemServer |
|
||||
| `ActivityManager: finishActivity` | 结束Activity | SystemServer |
|
||||
| `ActivityManager: pauseActivity` | 暂停Activity | SystemServer |
|
||||
| `ActivityManager: resumeActivity` | 恢复Activity | SystemServer |
|
||||
|
||||
### 2. WindowManager
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `WindowManager: addWindow` | 添加窗口 | SystemServer |
|
||||
| `WindowManager: removeWindow` | 移除窗口 | SystemServer |
|
||||
| `WindowManager: relayoutWindow` | 重新布局窗口 | SystemServer |
|
||||
| `WindowManager: setAppVisibility` | 设置应用可见性 | SystemServer |
|
||||
| `WindowManager: setInputMethodWindow` | 设置输入法窗口 | SystemServer |
|
||||
|
||||
### 3. Input系统
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `InputReader` | 输入读取器 | Input进程 |
|
||||
| `InputDispatcher` | 输入分发器 | Input进程 |
|
||||
| `dispatchKey` | 分发按键 | Input进程 |
|
||||
| `dispatchMotion` | 分发触摸 | Input进程 |
|
||||
| `touch` | 触摸事件 | Input进程 |
|
||||
| `key` | 按键事件 | Input进程 |
|
||||
|
||||
### 4. Binder通信
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `binder_transaction` | Binder事务 | Kernel |
|
||||
| `binder_transaction_received` | 接收Binder事务 | Kernel |
|
||||
| `binder_lock` | Binder锁 | Kernel |
|
||||
| `binder_unlock` | Binder解锁 | Kernel |
|
||||
| `binder_wait_for_work` | 等待Binder工作 | Kernel |
|
||||
|
||||
## 四、进程和线程相关关键词
|
||||
|
||||
### 1. 进程名称
|
||||
|
||||
| 关键词 | 说明 |
|
||||
|--------|------|
|
||||
| `system_server` | 系统服务进程 |
|
||||
| `surfaceflinger` | SurfaceFlinger进程 |
|
||||
| `zygote` | Zygote进程 |
|
||||
| `zygote64` | 64位Zygote进程 |
|
||||
| `input` | 输入服务进程 |
|
||||
| `logd` | 日志守护进程 |
|
||||
| `lmkd` | 低内存杀手进程 |
|
||||
|
||||
### 2. 线程名称
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `main` | 主线程 | 应用进程 |
|
||||
| `RenderThread` | 渲染线程 | 应用进程 |
|
||||
| `android.anim.if` | 动画线程 | SystemServer |
|
||||
| `android.ui` | UI线程 | SystemServer |
|
||||
| `android.display` | 显示线程 | SystemServer |
|
||||
| `HeapTaskDaemon` | 堆任务守护线程 | 应用进程 |
|
||||
| `FinalizerDaemon` | 终结器守护线程 | 应用进程 |
|
||||
| `ReferenceQueueDaemon` | 引用队列守护线程 | 应用进程 |
|
||||
|
||||
## 五、性能指标相关关键词
|
||||
|
||||
### 1. CPU相关
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `cpu_frequency` | CPU频率 | Kernel |
|
||||
| `cpu_idle` | CPU空闲 | Kernel |
|
||||
| `cpu_freq` | CPU频率 | Kernel |
|
||||
| `sched_switch` | 任务切换 | Kernel |
|
||||
| `sched_waking` | 任务唤醒 | Kernel |
|
||||
| `sched_migrate_task` | 任务迁移 | Kernel |
|
||||
| `sched_process_exit` | 进程退出 | Kernel |
|
||||
| `sched_process_free` | 进程释放 | Kernel |
|
||||
|
||||
### 2. 内存相关
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `GC` | 垃圾回收 | 应用进程 |
|
||||
| `HeapTaskDaemon` | 堆任务守护线程 | 应用进程 |
|
||||
| `ConcurrentGC` | 并发GC | 应用进程 |
|
||||
| `Alloc` | 内存分配 | 应用进程 |
|
||||
| `Free` | 内存释放 | 应用进程 |
|
||||
| `kmalloc` | 内核内存分配 | Kernel |
|
||||
| `kfree` | 内核内存释放 | Kernel |
|
||||
| `kswapd` | 交换守护进程 | Kernel |
|
||||
| `memreclaim` | 内存回收 | Kernel |
|
||||
|
||||
### 3. I/O相关
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `android_fs_dataread_start` | 数据读取开始 | Kernel |
|
||||
| `android_fs_dataread_end` | 数据读取结束 | Kernel |
|
||||
| `android_fs_datawrite_start` | 数据写入开始 | Kernel |
|
||||
| `android_fs_datawrite_end` | 数据写入结束 | Kernel |
|
||||
| `block_rq_issue` | 块请求发出 | Kernel |
|
||||
| `block_rq_complete` | 块请求完成 | Kernel |
|
||||
|
||||
### 4. 网络相关
|
||||
|
||||
| 关键词 | 说明 | 位置 |
|
||||
|--------|------|------|
|
||||
| `net_dev_xmit` | 网络设备发送 | Kernel |
|
||||
| `net_dev_recv` | 网络设备接收 | Kernel |
|
||||
| `tcp_send` | TCP发送 | Kernel |
|
||||
| `tcp_receive` | TCP接收 | Kernel |
|
||||
|
||||
## 六、SQL查询常用关键词
|
||||
|
||||
### 1. 表名
|
||||
|
||||
| 表名 | 说明 |
|
||||
|------|------|
|
||||
| `slice` | 时间片表,包含所有Trace事件 |
|
||||
| `sched` | 调度表,包含CPU调度信息 |
|
||||
| `thread` | 线程表,包含线程信息 |
|
||||
| `process` | 进程表,包含进程信息 |
|
||||
| `counter` | 计数器表,包含性能计数器 |
|
||||
| `track` | 轨道表,包含Trace轨道信息 |
|
||||
|
||||
### 2. 常用字段
|
||||
|
||||
| 字段 | 说明 | 表 |
|
||||
|------|------|-----|
|
||||
| `ts` | 时间戳(纳秒) | slice, sched |
|
||||
| `dur` | 持续时间(纳秒) | slice |
|
||||
| `name` | 事件名称 | slice |
|
||||
| `utid` | 线程ID | slice, sched |
|
||||
| `upid` | 进程ID | slice, sched |
|
||||
| `cpu` | CPU核心 | sched |
|
||||
| `state` | 线程状态 | sched |
|
||||
| `value` | 计数器值 | counter |
|
||||
|
||||
### 3. 常用查询模式
|
||||
|
||||
#### 查询掉帧
|
||||
```sql
|
||||
SELECT * FROM slice
|
||||
WHERE name = 'Choreographer#doFrame'
|
||||
AND dur > 16666667;
|
||||
```
|
||||
|
||||
#### 查询主线程耗时操作
|
||||
```sql
|
||||
SELECT name, dur / 1000000.0 AS duration_ms
|
||||
FROM slice
|
||||
WHERE utid = (SELECT utid FROM thread WHERE name LIKE '%main%' LIMIT 1)
|
||||
ORDER BY dur DESC
|
||||
LIMIT 20;
|
||||
```
|
||||
|
||||
#### 查询CPU使用率
|
||||
```sql
|
||||
SELECT cpu, COUNT(*) AS usage
|
||||
FROM sched
|
||||
WHERE ts BETWEEN ? AND ?
|
||||
GROUP BY cpu;
|
||||
```
|
||||
|
||||
## 七、常见问题定位关键词
|
||||
|
||||
### 1. 卡顿问题
|
||||
|
||||
| 关键词 | 说明 | 用途 |
|
||||
|--------|------|------|
|
||||
| `Choreographer#doFrame` | 帧调度 | 查找掉帧 |
|
||||
| `performTraversals` | 视图遍历 | 查找布局耗时 |
|
||||
| `drawFrame` | 绘制帧 | 查找渲染耗时 |
|
||||
| `dequeueBuffer` | 获取Buffer | 查找Buffer分配问题 |
|
||||
| `queueBuffer` | 提交Buffer | 查找Buffer提交问题 |
|
||||
|
||||
### 2. 启动问题
|
||||
|
||||
| 关键词 | 说明 | 用途 |
|
||||
|--------|------|------|
|
||||
| `startProcess` | 启动进程 | 查找进程创建耗时 |
|
||||
| `handleBindApplication` | 绑定Application | 查找Application初始化耗时 |
|
||||
| `performLaunchActivity` | 启动Activity | 查找Activity创建耗时 |
|
||||
| `onCreate` | 创建 | 查找创建耗时 |
|
||||
|
||||
### 3. 内存问题
|
||||
|
||||
| 关键词 | 说明 | 用途 |
|
||||
|--------|------|------|
|
||||
| `GC` | 垃圾回收 | 查找GC频率和耗时 |
|
||||
| `HeapTaskDaemon` | 堆任务守护线程 | 查找GC活动 |
|
||||
| `Alloc` | 内存分配 | 查找内存分配模式 |
|
||||
| `kswapd` | 交换守护进程 | 查找内存压力 |
|
||||
|
||||
### 4. CPU问题
|
||||
|
||||
| 关键词 | 说明 | 用途 |
|
||||
|--------|------|------|
|
||||
| `cpu_frequency` | CPU频率 | 查找频率问题 |
|
||||
| `sched_switch` | 任务切换 | 查找调度问题 |
|
||||
| `sched_waking` | 任务唤醒 | 查找唤醒延迟 |
|
||||
|
||||
## 八、搜索技巧
|
||||
|
||||
### 1. 精确搜索
|
||||
|
||||
- **完整匹配**:直接输入关键词,如 `Choreographer#doFrame`
|
||||
- **部分匹配**:使用通配符,如 `onCreate` 可以匹配所有onCreate方法
|
||||
- **正则表达式**:在搜索框中使用正则,如 `.*onCreate.*`
|
||||
|
||||
### 2. 组合搜索
|
||||
|
||||
- **多关键词**:使用空格分隔,如 `onCreate Activity`
|
||||
- **排除关键词**:使用 `-` 排除,如 `onCreate -Application`
|
||||
- **时间范围**:结合时间选择,缩小搜索范围
|
||||
|
||||
### 3. 常用搜索模式
|
||||
|
||||
#### 启动相关
|
||||
```
|
||||
startProcess
|
||||
handleBindApplication
|
||||
performLaunchActivity
|
||||
onCreate
|
||||
```
|
||||
|
||||
#### 渲染相关
|
||||
```
|
||||
Choreographer#doFrame
|
||||
performTraversals
|
||||
drawFrame
|
||||
dequeueBuffer
|
||||
queueBuffer
|
||||
```
|
||||
|
||||
#### 内存相关
|
||||
```
|
||||
GC
|
||||
HeapTaskDaemon
|
||||
Alloc
|
||||
kswapd
|
||||
```
|
||||
|
||||
#### CPU相关
|
||||
```
|
||||
cpu_frequency
|
||||
sched_switch
|
||||
sched_waking
|
||||
```
|
||||
|
||||
## 九、快速定位技巧
|
||||
|
||||
### 1. 使用书签
|
||||
|
||||
- **标记关键点**:按 `M` 键标记当前位置
|
||||
- **跳转书签**:按 `G` 键跳转到书签
|
||||
- **管理书签**:在书签列表中管理
|
||||
|
||||
### 2. 使用时间选择
|
||||
|
||||
- **选择时间范围**:`Shift + 鼠标拖拽`
|
||||
- **缩放时间**:`W` 放大,`S` 缩小
|
||||
- **平移时间**:`A` 左移,`D` 右移
|
||||
|
||||
### 3. 使用筛选器
|
||||
|
||||
- **进程筛选**:只显示特定进程
|
||||
- **线程筛选**:只显示特定线程
|
||||
- **事件筛选**:只显示特定事件
|
||||
|
||||
### 4. 使用SQL查询
|
||||
|
||||
- **快速统计**:使用SQL查询快速获取统计数据
|
||||
- **复杂分析**:使用SQL进行复杂的数据分析
|
||||
- **导出数据**:使用SQL查询结果导出数据
|
||||
|
||||
## 十、关键词速查表
|
||||
|
||||
### 启动流程关键词
|
||||
```
|
||||
startProcess → handleBindApplication → performLaunchActivity →
|
||||
onCreate → onStart → onResume → Choreographer#doFrame
|
||||
```
|
||||
|
||||
### 渲染流程关键词
|
||||
```
|
||||
Choreographer#doFrame → performTraversals → performMeasure →
|
||||
performLayout → performDraw → drawFrame → dequeueBuffer →
|
||||
queueBuffer → onMessageReceived
|
||||
```
|
||||
|
||||
### 内存回收关键词
|
||||
```
|
||||
GC → HeapTaskDaemon → ConcurrentGC → Alloc → Free → kswapd
|
||||
```
|
||||
|
||||
### CPU调度关键词
|
||||
```
|
||||
sched_switch → sched_waking → cpu_frequency → cpu_idle
|
||||
```
|
||||
|
||||
## 十一、实际应用示例
|
||||
|
||||
### 示例1:查找启动耗时
|
||||
|
||||
**搜索关键词:**
|
||||
```
|
||||
startProcess
|
||||
handleBindApplication
|
||||
performLaunchActivity
|
||||
Choreographer#doFrame
|
||||
```
|
||||
|
||||
**分析步骤:**
|
||||
1. 搜索 `startProcess`,找到进程启动时间
|
||||
2. 搜索 `handleBindApplication`,找到Application初始化时间
|
||||
3. 搜索 `performLaunchActivity`,找到Activity创建时间
|
||||
4. 搜索 `Choreographer#doFrame`,找到首帧时间
|
||||
5. 计算各阶段耗时
|
||||
|
||||
### 示例2:查找卡顿原因
|
||||
|
||||
**搜索关键词:**
|
||||
```
|
||||
Choreographer#doFrame
|
||||
performTraversals
|
||||
drawFrame
|
||||
dequeueBuffer
|
||||
queueBuffer
|
||||
```
|
||||
|
||||
**分析步骤:**
|
||||
1. 搜索 `Choreographer#doFrame`,找到掉帧
|
||||
2. 查看该帧的 `performTraversals` 耗时
|
||||
3. 查看 `drawFrame` 耗时
|
||||
4. 查看 `dequeueBuffer` 和 `queueBuffer` 耗时
|
||||
5. 定位瓶颈
|
||||
|
||||
### 示例3:查找内存问题
|
||||
|
||||
**搜索关键词:**
|
||||
```
|
||||
GC
|
||||
HeapTaskDaemon
|
||||
Alloc
|
||||
kswapd
|
||||
```
|
||||
|
||||
**分析步骤:**
|
||||
1. 搜索 `GC`,查看GC频率
|
||||
2. 搜索 `HeapTaskDaemon`,查看GC线程活动
|
||||
3. 搜索 `Alloc`,查看内存分配模式
|
||||
4. 搜索 `kswapd`,查看内存压力
|
||||
|
||||
## 十二、总结
|
||||
|
||||
### 关键词分类
|
||||
|
||||
1. **启动相关**:进程创建、Application初始化、Activity创建、首帧渲染
|
||||
2. **渲染相关**:帧调度、视图系统、RenderThread、SurfaceFlinger、GPU
|
||||
3. **系统服务**:ActivityManager、WindowManager、Input、Binder
|
||||
4. **进程线程**:进程名称、线程名称
|
||||
5. **性能指标**:CPU、内存、I/O、网络
|
||||
6. **SQL查询**:表名、字段、查询模式
|
||||
|
||||
### 使用建议
|
||||
|
||||
1. **建立关键词库**:根据常用场景建立关键词库
|
||||
2. **快速定位**:使用关键词快速定位问题
|
||||
3. **组合使用**:结合搜索、筛选、SQL查询等多种方式
|
||||
4. **持续积累**:在实际使用中不断积累新的关键词
|
||||
|
||||
---
|
||||
|
||||
*最后更新:2024年*
|
||||
Reference in New Issue
Block a user