Android Systrace基础知识:线程状态查看与分析
Android Systrace基础知识:线程状态查看与分析
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