Systrace 基础知识 -- 分析 Systrace 预备知识

本文是 Systrace 系列文章的第二篇,主要是讲解一些分析 Systrace 的预备知识, 有了这些预备知识, 分析 Systrace 才会事半功倍, 更快也更有效率地找到问题点.linux

本文介绍了如何查看 Systrace 中的线程状态 , 如何对进程的唤醒信息进行分析, 如何解读信息区的数据, 以及介绍了经常使用的快捷键. 经过本篇文章的学习, 相信你能够掌握进程和线程相关的一些信息, 也知道如何查看复杂的 Systrace 中包含的关键信息android

系列文章目录

  1. Systrace 简介
  2. Systrace 基础知识 - Systrace 预备知识
  3. Systrace 基础知识 - Why 60 fps ?
  4. Systrace 基础知识 - SystemServer 解读
  5. Systrace 基础知识 - SurfaceFlinger 解读
  6. Systrace 基础知识 - Input 解读
  7. Systrace 基础知识 - Vsync 解读
  8. Systrace 基础知识 - MainThread 和 RenderThread 解读
  9. Systrace 基础知识 - Triple Buffer 解读
  10. Systrace 基础知识 - CPU Info 解读
  11. Systrace 实战 - 分析应用冷启动时间问题
  12. Systrace 实战 - 分析应用热启动时间问题
  13. Systrace 实战 - 分析列表卡顿问题
  14. Systrace 实战 - 分析窗口动画卡顿问题
  15. Systrace 实战 - 分析进程乱跑致使的性能问题
  16. Systrace 实战 - 分析 IO 致使的性能问题
  17. Systrace 实战 - 分析 Memory 致使的性能问题
  18. Systrace 实战 - Systrace 与 MethodTrace 结合使用
  19. Systrace 实战 - 分析硬件加速问题

正文

线程状态查看

Systrace 会用不一样的颜色来标识不一样的线程状态, 在每一个方法上面都会有对应的线程状态来标识目前线程所处的状态.
经过查看线程状态咱们能够知道目前的瓶颈是什么, 是 CPU 执行慢仍是由于 Binder 调用, 又或是进行 IO 操做, 又或是拿不到 CPU 时间片函数

线程状态主要有下面几个性能

绿色 : 运行中

只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出如今一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。学习

做用:咱们常常会查看 Running 状态的线程,查看其运行的时间,与竞品作对比,分析快或者慢的缘由:动画

  1. 是否频率不够?
  2. 是否跑在了小核上?
  3. 是否频繁在 Running 和 Runnable 之间切换?为何?
  4. 是否频繁在 Running 和 Sleep 之间切换?为何?
  5. 是否跑在了不应跑的核上面?好比不重要的线程占用了超大核

蓝色 : 可运行

线程能够运行但当前没有安排,在等待 cpu 调度线程

做用:Runnable 状态的线程状态持续时间越长,则表示 cpu 的调度越忙,没有及时处理到这个任务:3d

  1. 是否后台有太多的任务在跑?
  2. 没有及时处理是由于频率过低?
  3. 没有及时处理是由于被限制到某个 cpuset 里面,可是 cpu 很满?
  4. 此时 Running 的任务是什么?为何?

白色 : 休眠中

线程没有工做要作,多是由于线程在互斥锁上被阻塞。orm

做用 : 这里通常是在等事件驱动
cdn

橘色 : 不可中断的睡眠态

线程在I / O上被阻塞或等待磁盘操做完成,通常底线都会标识出此时的 callsite :wait_on_page_locked_killable

做用:这个通常是标示 IO 操做慢,若是有大量的橘色不可中断的睡眠态出现,那么通常是因为进入了低内存状态,申请内存的时候触发 pageFault, linux 系统的 page cache 链表中有时会出现一些还没准备好的 page(即还没把磁盘中的内容彻底地读出来) , 而正好此时用户在访问这个 page 时就会出现 wait_on_page_locked_killable 阻塞了. 只有系统当 io 操做很繁忙时, 每笔的 io 操做都须要等待排队时, 极其容易出现且阻塞的时间每每会比较长.

紫色 : 可中断的睡眠态

线程在另外一个内核操做(一般是内存管理)上被阻塞。

做用:通常是陷入了内核态,有些状况下是正常的,有些状况下是不正常的,须要按照具体的状况取分析

进程唤醒信息分析

Systrace 会标识出一个很是有用的信息,能够帮助咱们进行跨进程调用相关的分析。

一个进程被唤醒的信息每每比较重要,知道他被谁唤醒,那么咱们也就知道了他们之间的调用等待关系,若是出现一段比较长的 sleep 状况,而后被唤醒,那么咱们就能够去看是谁唤醒了这个线程,对应的就能够查看唤醒者的信息,看看为何唤醒者这么晚才唤醒。

一个常见的状况是:应用进程使用 Binder 与 SystemServer 的 AMS 线程进行通讯,可是刚好 AMS 的这个函数正在等待锁释放(或者这个函数自己执行时间很长),那么应用进程就须要等待比较长的时间,若是刚好是应用进程的主线程在进行等待,那么就会出现性能问题,好比响应慢或者卡顿,这就是为何后台有大量的进程在运行,或者跑完 Monkey 以后,整机性能会降低的一个主要缘由。

Systrace 能够标示出这个的一个缘由是,一个任务在进入 Running 状态以前,会先进入 Runnable 状态进行等待,而 Systrace 会把这个状态也标示在 Systrace 上(很是短,须要放大进行看)

拉到最上面查看对应的 cpu 上的 taks 信息,会标识这个 task 在被唤醒以前的状态:

顺便贴一下 Linux 常见的进程状态

  1. D 没法中断的休眠状态(一般 IO 的进程);
  2. R 正在运行可中在队列中可过行的;
  3. S 处于休眠状态;
  4. T 中止或被追踪;
  5. W 进入内存交换 (从内核2.6开始无效);
  6. X 死掉的进程 (基本不多見);
  7. Z 僵尸进程;
  8. < 优先级高的进程
  9. N 优先级较低的进程
  10. L 有些页被锁进内存;
  11. s 进程的领导者(在它之下有子进程);
  12. l 多进程的(使用 CLONE_THREAD, 相似 NPTL pthreads);
    • 位于后台的进程组;

信息区数据解析

进程状态信息解析

函数 Slice 信息解析

Counter Sample 信息解析

Async Slice 信息解析

CPU Slice 信息解析

User Expectation 信息解析

位于整个 Systrace 最上面的部分,标识了 Rendering Response 和 Input Response

快捷键使用

快捷键的使用能够加快查看 Systrace 的速度,下面是一些经常使用的快捷键

W : 放大 Systrace , 放大能够更好地看清局部细节
S : 缩小 Systrace, 缩小以查看总体
A : 坐移
D : 右移
M : 高亮选中当前鼠标点击的段(这个比较经常使用,能够快速标识出这个方法的左右边界和执行时间,方便上下查看)

鼠标模式快捷切换 : 主要是针对鼠标的工做模式进行切换 , 默认是 1 ,也就是选择模式,查看 Systrace 的时候,须要常常在各个模式之间切换 , 因此点击切换模式效率比较低,直接用快捷键切换效率要高不少

数字键1 : 切换到 Selection 模式 , 这个模式下鼠标能够点击某一个段查看其详细信息, 通常打开 Systrace 默认就是这个模式 , 也是最经常使用的一个模式 , 配合 M 和 ASDW 能够作基本的操做
数字键2 : 切换到 Pan 模式 , 这个模式下长按鼠标能够左右拖动, 有时候会用到
数字键3 : 切换到 Zoom 模式 , 这个模式下长按鼠标能够放大和缩小, 有时候会用到
数字键4 : 切换到 Timing 模式 , 这个模式下主要是用来衡量时间的,好比选择一个起点, 选择一个终点, 查看起点和终点这中间的操做所花费的时间.

本文知乎地址

因为博客留言交流不方便,点赞或者交流,能够移步本文的知乎界面
知乎 - Systrace 基础知识 – 分析 Systrace 预备知识

关于我

小厂系统研发工程师 , 更多信息能够点击 关于我 , 很是但愿和你们一块儿交流 , 共同进步 .

一我的能够走的更快 , 一群人能够走的更远

相关文章
相关标签/搜索