Systrace 的使用
简介:
Systrace 是 Android4.1 中新增的性能数据采样和分析工具。它可帮助开发者收集 Android 关键子系统(如SurfaceFlinger/ SystemServer/Kernel/Input/Display 等 Framework 部分关键模块、服务,View系统等)的运行信息
从而帮助开发者更直观的分析系统瓶颈,改进性能。通常使用 systrace 跟踪系统的 I/O 操作、CPU 负载、Surface 渲染、GC 等事件。
原理
1、systrace原理
Systrace的功能包括跟踪系统的I/O操作、内核⼯作队列、CPU负载以及Android各个⼦系统的运
⾏状况等。在Android平台中,它主要由3部分组成:
- 内核部分:Systrace利⽤了LinuxKernel中的ftrace功能。所以,如果要使⽤Systrace的话,必须开启kernel中和ftrace相关的模块。
- 数据采集部分:Android定义了⼀个Trace类。应⽤程序可利⽤该类把统计信息输出给ftrace。同时,Android还有⼀个atrace程序,它可以从ftrace中读取统计信息然后交给数据分析⼯具来处理。
- 数据分析⼯具:Android提供⼀个systrace.py(python脚本⽂件,位于AndroidSDK⽬录/platform-tools/systrace中,其内部将调⽤atrace程序)⽤来配置数据采集的⽅式(如标签、输出⽂件名等)和收集ftrace统计数据并⽣成html⽂件供⽤⼾查看。
Atrace+Ftrace,从本质上说,Systrace是对Linux Kernel中ftrace的封装。应⽤进程需要利⽤
Android提供的Trace类来使⽤Systrace
常⻅操作
基础操作
w/s:放⼤/缩⼩
a/d:左移/右移
查看操作
click 选择
click+drag 选择
f 聚焦事件,放⼤到查看该事件的最佳视⻆
m 标记事件,每次标记会取消上次标记的内容
shift+m 同样是标记事件,但是会⼀直存在⻚⾯上,直⾄再次操作可删除
systrace的抓取方法:
直接使用 Studio 自带的 Profiler
perfetto
直接在 https://ui.perfetto.dev/ 上记录新的 Trace
也可以在设备上录制
参考 https://developer.android.com/topic/performance/tracing/on-device?hl=zh-cn
Perfetto 命令行
adb shell perfetto xxxxxx
参考 https://developer.android.google.cn/tools/perfetto?hl=zh-cn
Android/Sdk/platform-tools/systrace
输入抓取systrace的命令 (已废弃):
python systrace.py -t X -o xx.html
-t 指定抓取时间 -o 指定输出文件。
python /Users/only/Library/Android/sdk/platform-tools/systrace/systrace.py -a
top.xlxs.camerasync -o /Users/jin/Desktop/jin/adb-matrix/5.html sched fr
eq am wm gfx view input
基本查看工具
自带的 Profiler 就可以查看,功能基本一样,但分析不太直观,卡
或者通过网页打开,谷歌推荐新的trace工具
工具解读
•线程运行状态
- 绿色:运行中
- 蓝色:可运行
- 白色:休眠中
- 橘色:不可中断的睡眠态 IO block
- 紫色:不可中断的睡眠态
查看被哪个线程唤醒的
APP 一帧的流程
常见的Performance问题
出现卡顿,⼤致可以从以下⼏个⽅⾯考虑。
- SurfaceFlinger合成慢了,SurfaceFlinger未合成该帧
- Display上屏慢了
- CPU频率低
- HWC返回给SurfaceFlinger的时间戳存在异常
surfaceflinger 主线程耗时长
APP UI 线程耗时
dequeueBuffer耗时长
与displaybinder通信时间长
绘制流程
主线程(UI 线程)
渲染线程
• syncFrameState 同步绘制信息状态
• dequeueBuffer 向bufferQueue中申请buffer
• flushCommands 发出GPU绘制指令
• queueBuffer 绘制好的buffer给返回队列,调⽤onFrameAvailable请求vsync-sf信号
SurfaceFlinger
CPU信息
1、cpu编号
通常0〜3是⼩核、4-7是⼤核或者是中⼤核
2、cpu结构
⼀般⼿机的CPU核⼼数和架构⼀般分为:
• ⾮⼤⼩核结构
• ⼤⼩核结构(⾼通骁⻰845⼩核⼼是由四个A55组成,⼤核⼼就是由四个A75组成)
• ⼤中⼩核结构(⾼通骁⻰8558核1个A76的⼤核+3个A76的中核+4个A55的⼩核)
每个核承担的⼯作:
• ⼩核⼼,⼀些负载低,或者后台任务
• 中核⼼,⼀些负载⾼的,或者部分任务被限制只能跑中⼤核
• ⼤核⼼,⼀些负载特别⾼的,或者特别重要的,和部分被限制在⼤核上的
3、频率限制
3.1、原因:
⼀些场景⽆法单纯依靠调度器,⽆法满⾜性能和功耗的要求。
3.2、限制场景:
- 应⽤启动
- 应⽤安装
- 转屏
- 窗⼝动画
- ListFling
- Game
4、分析
• 某个场景的任务执⾏⽐较慢,我们就可以查看是不是这个任务被调度到了⼩核?
• 某个场景的任务执⾏⽐较慢,当前执⾏这个任务的CPU频率是不是不够?
• 我的任务⽐较特殊,能不能把我这个任务放到⼤核去跑?
• 我这个场景对CPU要求很⾼,我能不能要求在我这个场景运⾏的时候,限制CPU最低频率?
5、常⽤命令
adb shell cat /proc/cpuinfo // 查看cpu 信息
adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq // 查看某个
频率
adb shell taskset -p pid // 查到进程的cpu
adb shell taskset -p cpu pid 绑定cpu
线程信息
• 浅绿:runable
• 深绿:Running
• ⽩⾊:Sleeping
• 棕⾊:不可中断休眠
分析
• running时间⻓导致:app⾃⾝原因,检查在哪⾥耗时
• runnable时间⻓:系统状态差抢占严重导致
• binder调⽤多:app⾃⾝原因,检查代码是否有多余的binder调⽤