Systrace 会生成包含多个部分的输出 HTML 文件。该报告列出了每个进程的线程。如果给定线程会渲染界面帧,该报告还会沿时间轴指明所渲染的帧。当您在报告中从左向右移动时,时间会向前推移。
Systrace信息解析
报告从上到下包含以下几个部分:
-
用户互动
第一部分包含表示应用或游戏中的具体用户互动(例如点按设备屏幕)的条形图。这些互动可用作有用的时间标记。
-
CPU活动
Systrace中cpu相关信息一般在最上面,里面经常会用到的信息包括:cpu运行频率信息(Clock Frequency)、cpu任务执行信息(cpu*)、大小核调度信息(可通过整体密集程度判断)、cpu使用率信息(最上端:CPU usage)、cpu policy信息(Clock Frequency Limits)、cpu idle状态信息(C-State),基本信息如下图所示:
-
进程信息
从上至下分别是SurfaceFlinger、主要运行的一些进程。这里面我们需要关注的就是SurfaceFlinger和前台进程(以抖音为例)
进程中每个条形堆上方的多色线条表示特定线程随时间变化的一组状态。每段线条可以包含以下颜色之一:
-
绿色:运行中(Running)
作用:我们经常会查看 Running 状态的线程,查看其运行的时间,与竞品做对比,分析快或者慢的原因:
- 是否频率不够?
- 是否跑在了小核上?
- 是否频繁在 Running 和 Runnable 之间切换?为什么?
- 是否频繁在 Running 和 Sleep 之间切换?为什么?
- 是否跑在了不该跑的核上面?比如不重要的线程占用了超大核
-
蓝色:可运行,等待CPU调度(Runnable)
作用:Runnable 状态的线程状态持续时间越长,则表示 cpu 的调度越忙,没有及时处理到这个任务:
- 是否后台有太多的任务在跑?
- 没有及时处理是因为频率太低?
- 没有及时处理是因为被限制到某个 cpuset 里面,但是 cpu 很满?
- 此时 Running 的任务是什么?为什么?
-
白色:休眠中(sleep)
线程没有工作要做,可能是因为线程在互斥锁上被阻塞。
作用 : 这里一般是在等事件驱动
-
橘色:不可中断的睡眠态(uninterruptible Sleep,IO Block)
线程在I / O上被阻塞或等待磁盘操作完成,一般底线都会标识出此时的 callsite :wait_on_page_locked_killable
作用:这个一般是标示 io 操作慢,如果有大量的橘色不可中断的睡眠态出现,那么一般是由于进入了低内存状态,申请内存的时候触发 pageFault, linux 系统的 page cache 链表中有时会出现一些还没准备好的 page(即还没把磁盘中的内容完全地读出来) , 而正好此时用户在访问这个 page 时就会出现 wait_on_page_locked_killable 阻塞了. 只有系统当 io 操作很繁忙时, 每笔的 io 操作都需要等待排队时, 极其容易出现且阻塞的时间往往会比较长.
-
紫色:可中断的睡眠态(interruptible Sleep)
线程在另一个内核操作(通常是内存管理)上被阻塞。
作用:一般是陷入了内核态,有些情况下是正常的,有些情况下是不正常的,需要按照具体的情况去分析
进程运行状态下面是函数栈的相关信息
-