首页 > 其他分享 >Android Systrace 基础知识 -- 分析 Systrace 预备知识

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

时间:2024-07-04 17:44:07浏览次数:18  
标签:状态 1.2 Systrace -- 信息 线程 Android 唤醒

1. 正文

1.1 线程状态查看

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

绿色 : 运行中(Running)

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

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



蓝色 : 可运行(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 常见的进程状态

  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)
  13. + 位于后台的进程组

1.2 信息区数据解析

1.2.1 线程状态信息解析



1.2.2 函数 Slice 信息解析



1.2.3 Counter Sample 信息解析

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



1.2.4 Async Slice 信息解析

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

1.2.5 CPU Slice 信息解析



1.2.6 User Expectation 信息解析

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



标签:状态,1.2,Systrace,--,信息,线程,Android,唤醒
From: https://www.cnblogs.com/linhaostudy/p/18284299

相关文章

  • 让vue重新渲染
    目录问题重现解决方法项目地址问题重现<scroll-viewclass="right-scroll-view"scroll-y:style="{height:wh+'px'}":scroll-top="scrollTop">这段代码中,我想实现切换页面但是滚动条每次都会切换到顶部,在js代码中设置scrollTop值为0,但是发现不起作用问GPT发现是,如果scro......
  • 剪裁法设计配光器
    剪裁法设计配光器剪裁法设计配光器一、设计原理边光原理边光原理是非成像光学中的一个基础原理,其内容可以表述为:来自光源边缘的光线经过若干有序正则光学曲面后依然落在投射光斑的边缘,而来自光源内部的光线也将落在光斑内部。这里的边缘包含两层含义:①二维曲面边缘;②光束立体......
  • CentOS安装部署JDK8
    1.下载jdk8(1)、官网下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html2)百度网盘:链接:https://pan.baidu.com/s/1dTwKC65nDWBjmckWc-9igg?pwd=paxl提取码:paxl2、开始部署(1)解压jdk包,并将解压后的包移至想要存放的目录下,我放在/usr/loc......
  • uniapp中renderjs的使用
    renderjs是一个运行在视图层的js。它只支持app-vue和web。renderjs的主要作用有2个:1.让APP端引入web端的js库,可以使用web的功能2.大幅降低逻辑层和视图层的通讯损耗,提供高性能视图交互能力<template><view><button@click="lzRend.emitData">触发renderjs......
  • python爬虫2-HTML文本处理
    HTML文本处理re模式匹配正则表达式是一种强大的字符串匹配和处理工具,允许通过指定的模式来查找、替换和验证字符串。函数编译正则表达式re.compile(pattern,flags=0):将字符串形式的正则表达式编译为一个正则对象,用于后续的匹配操作。匹配操作re.match(pattern,str......
  • [NodeJS] NodeJS事件循环
    JS是单线程的,如果出现阻塞会严重影响代码执行效率。NodeJS通过事件循环,尽可能地将耗时任务委派给系统内核来实现非阻塞IO。NodeJS提供了许多和异步相关的API,除了语言标准规定的setTimeout和setInterval,还有setImmediate和process.nextTick。经常和这几个出现在面试题里的还有Pr......
  • 使用 Putty 的 PSFTP 上传文件到服务器(手工、bat批处理)
    一、手工方式上传1.建立连接:psftp.exe-iaws.ppk(自己的秘钥)2.使用用户名登录地址:[email protected]显示Remoteworkingdirectoryis/home/xxx此时已经建立了连接。3.上传文件putfilename默认传到/home/xxx目录下4.下载文件get/home/xxx/filename......
  • wx云开发增删改查
    首先是.wxml文件,此处为固定数据的新增<buttontype="primary"bind:tap="addData">//调用.js中addData方法插入数据</button>对应.js文件//添加数据addData(){wx.showLoading({//showLoading(api接口)(防止用户多次点击,主动调用wx.hideLoading......
  • 二分图匹配
    是么时二分图这个图的节点可以被分为两个集合,使得同一集合内没有连边。匈牙利算法例题IOI有$m$道题,HPY会$n$个算法,一共有$k$个算法可以解决IOI题。HPY会的算法太多了,所有这次IOI用了这个算法,等到下一次IOI时才会记其这个算法。<h1id="constraint......
  • 详解五种Docker容器的网络模式
    Docker网络设置了容器如何与其他容器和外部服务通信。为了获得网络访问,容器需要是Docker网络的一部分。容器可以通信的方式取决于它的网络连接。Docker提供了五种标准网络模式来执行核心网络功能:Bridge(桥接)Host(主机)Overlay(重叠)IPvLANMacvl......