问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Android Systrace基础知识:线程状态查看与分析

创作时间:
作者:
@小白创作中心

Android Systrace基础知识:线程状态查看与分析

引用
1
来源
1.
https://www.cnblogs.com/linhaostudy/p/18284299

Systrace是Android系统中一个非常重要的性能分析工具,可以帮助开发者深入理解应用的运行状态和性能瓶颈。本文将详细介绍Systrace中线程状态的查看方法,以及如何通过Systrace报告中的各种信息进行性能分析。

线程状态查看

Systrace会用不同的颜色来标识不同的线程状态,在每个方法上面都会有对应的线程状态来标识目前线程所处的状态,通过查看线程状态我们可以知道目前的瓶颈是什么,是CPU执行慢还是因为Binder调用,又或是进行IO操作,又或是拿不到CPU时间片。

绿色:运行中(Running)

作用:我们经常会查看Running状态的线程,查看其运行的时间,与竞品做对比,分析快或者慢的原因:

  • 是否频率不够?
  • 是否跑在了小核上?
  • 是否频繁在Running和Runnable之间切换?为什么?
  • 是否频繁在Running和Sleep之间切换?为什么?
  • 是否跑在了不该跑的核上面?比如不重要的线程占用了超大核

蓝色:可运行(Runnable)

线程可以运行但当前没有安排,在等待CPU调度

作用: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操作都需要等待排队时,极其容易出现且阻塞的时间往往会比较长。

紫色:不可中断的睡眠态(Uninterruptible Sleep)

线程在另一个内核操作(通常是内存管理)上被阻塞。

作用:一般是陷入了内核态,有些情况下是正常的,有些情况下是不正常的,需要按照具体的情况去分析

线程唤醒信息分析

Systrace会标识出一个非常有用的信息,可以帮助我们进行线程调用等待相关的分析。一个线程被唤醒的信息往往比较重要,知道他被谁唤醒,那么我们也就知道了他们之间的调用等待关系,如果一个线程出现一段比较长的sleep情况,然后被唤醒,那么我们就可以去看是谁唤醒了这个线程,对应的就可以查看唤醒者的信息,看看为什么唤醒者这么晚才唤醒。

一个常见的情况是:应用主线程程使用Binder与SystemServer的AMS进行通信,但是恰好AMS的这个函数正在等待锁释放(或者这个函数本身执行时间很长),那么应用主线程就需要等待比较长的时间,那么就会出现性能问题,比如响应慢或者卡顿,这就是为什么后台有大量的进程在运行,或者跑完Monkey之后,整机性能会下降的一个主要原因

另外一个场景的情况是:应用主线程在等待此应用的其他线程执行的结果,这时候线程唤醒信息就可以用来分析主线程到底被哪个线程Block住了,比如下面这个场景,这一帧doFrame执行了152ms,有明显的异常,但是大部分时间是在sleep

这时候放大来看,可以看到是一段一段被唤醒的,这时候点击图中的runnable,下面的信息区就会出现唤醒信息,可以顺着看这个线程到底在做什么

20424线程是RenderHeartbeat,这就牵扯到了App自身的代码逻辑,需要App自己去分析RenderHeartbeat到底做了什么事情

Systrace可以标示出这个的一个原因是,一个任务在进入Running状态之前,会先进入Runnable状态进行等待,而Systrace会把这个状态也标示在Systrace上(非常短,需要放大进行看)

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

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

  • D:无法中断的休眠状态(通常IO的进程);
  • R:正在可运行队列中等待被调度的;
  • S:处于休眠状态;
  • T:停止或被追踪;
  • W:进入内存交换(从内核2.6开始无效);
  • X:死掉的进程(基本很少見);
  • Z:僵尸进程;
  • <:优先级高的进程
  • N:优先级较低的进程
  • L:有些页被锁进内存
  • s:进程的领导者(在它之下有子进程)
  • l:多进程的(使用CLONE_THREAD,类似NPTL pthreads)
  • +:位于后台的进程组

信息区数据解析

线程状态信息解析

函数Slice信息解析

Counter Sample信息解析

Counter Sample是Systrace捕获的性能数据的一种类型。它主要用于记录某些特定计数器的值随时间变化的情况。这些计数器可以是系统级的,也可以是应用级的,常见的计数器包括内存使用量、CPU使用率、帧率等。

Async Slice信息解析

Async Slice是Systrace中用于跟踪和记录异步操作的一种事件类型。它通过成对的begin和end调用来标记异步操作的开始和结束,适用于网络请求、文件I/O、后台任务等异步操作的性能分析。通过在Systrace报告中查看Async Slice数据,开发者可以识别和优化应用中的异步操作性能瓶颈。

CPU Slice信息解析

User Expectation信息解析

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号