Linux perf 之 systrace
前言
因为面试的时候问到这个 systrace 的问题,之前项目这一块都是由 perf 团队做的初步分析,所以一直没去深入学习,这里做个笔记,关于 systrace,当然,网上关于 systrace 的介绍已经非常完善,本篇博客主要讲解 systrace 的使用
什么是 systrace
先看下官方的解释:
The systrace command allows you to collect and inspect timing information across all processes running on your device at the system level. It combines data from the Android kernel, such as the CPU scheduler, disk activity, and app threads, to generate an HTML report, similar to what’s shown in figure 1.
说白了,就是检测系统层进程的运行时间。例如 CPU 调度、app 线程等
systrace 使用
systrace 获取
systrace 脚本可以在多种方式下获取到,Android 代码中在 external/chromium-trace/systrace.py;或者在 Android sdk 中 platform-tools/systrace/
trace 命令
在执行 systrace 前,需要手机连接 adb 以及获取 root 权限,准备好环境后,输入命令:python systrace.py -b 16384 -t 8 gfx input view webview sm hal idle freq sched wm am res dalvik -o aaa.html
- “-b”: 用于限制 trace 文件的大小,单文kb
- “-t”: trace 抓取的时间,单位 s
- 后接的参数都是表示需要 trace 的模块,systrace 支持的模块,可以通过 “-l” 参数获取
- “-o” 参数表示输出的 html 文件
- 更多选项可以通过 “-h” 参数获取
实例分析(display 响应慢问题)
上一步通过 systrace 脚本会得到 html 文件,通过 chrome 浏览器打开
灰色: 睡眠。 蓝色: 可以运行(它可以运行,但还未被调度运行)。 绿色: 正在运行(调度程序认为它正在运行)。
注意:中断处理程序没有CPU时间轴中显示,因此在线程运行的过程中虽然没有显示中断,但实际上你可能已经执行了终端或者softirqs,最终需要通过检查trace(进程0)来判断终端是否发生。
红色: 不间断的睡眠(通常发生在内核锁上), 指出I / O负载,对于性能问题的调试非常有用。 橙色: 由于I / O负载导致的不间断睡眠。
右边栏一项从上到下依次是:
- 鼠标,就常规鼠标操作
- pan,trace 移动操作
- zoom,用于对 trace 进行缩放
- timing,用于观察时序,哪一段运行时间过长就由此段分析
左侧是关于各个活动相关的信息,如果要对该部分十分熟悉的话,需要对各个活动都要有一定的了解,简单起见,这边只分析 display driver 相关的活动,分别是 VSYNC-sf 以及 VSYNC-app
观察一下帧数据,顶部为 timing,从途中可以观察到第一帧帧数据
定位问题,queuebuffer->addAndGetFrameTimestamps
display kernel
systrace 默认抓的是上层的 trace 文件,qcom display 有提供相应的接口函数
添加头文件 #include "../sde/sde_trace.h"
SDE_ATRACE_BEGIN("HBM_MODE_ON"); //加在开始的地方;
SDE_ATRACE_END("HBM_MODE_ON"); //加在结束的地方;