> 文章列表 > 安卓 cpu 高 kernel faults 什么意思,卡顿

安卓 cpu 高 kernel faults 什么意思,卡顿

安卓 cpu 高 kernel faults 什么意思,卡顿

(638条消息) dumpsys cpuinfo全面解析_专注和坚持是最好的导师的博客-CSDN博客

(638条消息) adb命令会对android手机的负载_怎么通过adb提升手机性能_army在行动的博客-CSDN博客

Android App性能之--cpu占用率 - null先森 - 博客园 (cnblogs.com)

(638条消息) Android ANR 分析解决方法_郭风朴的博客-CSDN博客

1)参数解释

第一行显示的是cpuload (负载平均值)信息:Load: 14.13 / 14.13 / 14.13

这三个数字表示逐渐变长的时间段(平均一分钟,五分钟和十五分钟)的平均值,而较低的数字则更好。数字越大表示问题或机器过载。

user 和 kernel分别代表用户和系统内核分别占用的cpu比率

user(用户态): 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取

kernel(内核态): CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序

2)为什么要有用户态和内核态

由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 -- 用户态 和 内核态

3)应用cpu占用率

个人理解:cpuinfo因为是取一段时间的平均值,而total也是取这段时间的平均值,而非所有进程的平均值之和,所以两者存在一定差异

1、dumpsys cpuinfo可以用于日常App自动化性能监控、巡检

2、top命令可以查看瞬时的cpu占用率,在性能的故障分析调优时可能会更有用

dumpsys cpuinfo

命令行使用 adb shell dumpsys cpuinfo 命令dump cpu当前状态的信息
Load: 6.3 / 6.59 / 6.53
CPU usage from 7744ms to 0ms ago (2020-08-19 12:24:40.422 to 2020-08-19 12:24:48.167):
  19% 19618/com.meizu.assistant: 14% user + 4.9% kernel / faults: 7166 minor
  18% 1406/system_server: 12% user + 6.5% kernel / faults: 5040 minor
  17% 517/logd: 11% user + 6% kernel / faults: 6 minor
  4.1% 5937/com.meizu.flyme.alphatravel: 3.2% user + 0.9% kernel / faults: 1267 minor
  4% 1864/com.android.systemui: 3.2% user + 0.7% kernel / faults: 421 minor
  2.8% 2087/com.android.phone: 1.9% user + 0.9% kernel / faults: 294 minor
  2.4% 3661/com.meizu.flyme.input: 1.6% user + 0.7% kernel / faults: 276 minor
  2.4% 29275/kworker/u16:11: 0% user + 2.4% kernel
  0% 960/media.codec: 0% user + 0% kernel / faults: 1283 minor
  1.9% 651/android.hardware.sensors@1.0-service: 0.7% user + 1.1% kernel / faults: 1 minor
  1.9% 2836/com.meizu.alphame: 1.4% user + 0.5% kernel / faults: 350 minor
  1.9% 16426/kworker/u16:4: 0% user + 1.9% kernel
  0% 954/media.extractor: 0% user + 0% kernel / faults: 1163 minor

Load: 6.3 / 6.59 / 6.53  解析见:

https://blog.csdn.net/lindroid/article/details/90904947

19% 19618/com.meizu.assistant: 14% user + 4.9% kernel  解析见:

https://blog.csdn.net/oujunli/article/details/51463707

https://www.coder.work/article/686354

faults: 7166 minor  解析见:

https://blog.csdn.net/weixin_34232744/article/details/90629729

https://www.jianshu.com/p/f9b8c139c2ed

https://stackoverflow.com/questions/40186347/dumpsys-cpuinfo-in-android-interpreting-the-results-of-this-command

 

Linux对内存的管理, 以及page fault的概念 - 简书 (jianshu.com)

page fault, (严格说, 这里指的是major page fault)名字听起来挺严重, 实际上, 并不是什么"错误".
大致是这样, 一个程序可能占几Mb, 但并不是所有的指令都要同时运行, 有些是在初始化时运行, 有些是在特定条件下才会去运行. 因此linux并不会把所有的指令都从磁盘加载到page内存. 那么当cpu在执行指令时, 如果发现下一条要执行的指令不在实际的物理内存page中时, CPU 就会 raise a page fault, 通知MMU把下面要执行的指令从磁盘加载到物理内存page中. 严格说, 这里指的是major fault. 还有另一种, 就是minor fault.

What a Minor page faults?

There is also a special case scenario called a minor page fault which occurs when the code (or data) needed is actually already in memory, but it isn't allocated to that process. For example, if a user is running a web browser then the memory pages with the browser executable code can be shared across multiple users (since the binary is read-only and can't change). If a second user starts the same web browser then Linux won't load all the binary again from disk, it will map the shareable pages from the first user and give the second process access to them. In other words, a minor page fault occurs only when the page list is updated (and the MMU configured) without actually needing to access the disk.

minor page fault, 指的就是CPU要执行的指令实际上已经在物理内存page中了, 只是这个page没有被分配给当前进程, 这时CPU就会raise一个minor page fault, 让MMU把这个page分配给当前进程使用, 因此minor page fault并不需要去访问磁盘.

What a Swap?

当物理内存不够时,把一些物理内存page中的内容写入到磁盘, 以腾出一些空闲的page出来供进程使用, 这就是swap out.(The process of writing pages out to disk to free memory is called swapping-out)
反过来说, 当CPU要执行的指令被发现已经swap out到了磁盘中, 这时就需要从磁盘把这些指令再swap in到物理内存中,让CPU去执行.
swap in和swap out的操作都是比较耗时的, 频繁的swap in和swap out操作很影响系统性能.

-------DONE.-----------

作者:ahking17
链接:https://www.jianshu.com/p/f9b8c139c2ed
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

(638条消息) page fault带来的性能问题_weixin_34232744的博客-CSDN博客

什么是page fault

当进程访问它的虚拟地址空间中的PAGE时,如果这个PAGE目前还不在物理内存中,此时CPU是不能干活的,
Linux会产生一个hard page fault中断。
系统需要从慢速设备(如磁盘)将对应的数据PAGE读入物理内存,并建立物理内存地址与虚拟地址空间PAGE的映射关系。
然后进程才能访问这部分虚拟地址空间的内存。

page fault 又分为几种,major page fault、 minor page fault、 invalid(segment fault)。

major page fault也称为hard page fault, 指需要访问的内存不在虚拟地址空间,也不在物理内存中,需要从慢速设备载入。从swap回到物理内存也是hard page fault。

minor page fault也称为soft page fault, 指需要访问的内存不在虚拟地址空间,但是在物理内存中,只需要MMU建立物理内存和虚拟地址空间的映射关系即可。
(通常是多个进程访问同一个共享内存中的数据,可能某些进程还没有建立起映射关系,所以访问时会出现soft page fault)

invalid fault也称为segment fault, 指进程需要访问的内存地址不在它的虚拟地址空间范围内,属于越界访问,内核会报segment fault错误。

什么是进程的working set

进程的working set是指当前在物理内存中,属于该进程的pages组成的集合。
这个集合中的page数随着系统的运行,可能扩大也可能缩小。
扩大working set是指进程正在访问更多的内存时。
缩小working set是指其他进程正在访问更多的内存,并且整个物理内存的空间不足,需要将某些干净的内存页free掉或者一些脏的内存页swap到交换分区去,如果这个操作设计到当前进程,对当前进程来说就是shrink working set。
缩小working set需要遵循lru (内核的内存老化)算法,并不是随便挑选PAGE进行shrink的。

什么是swap

什么时候需要加内存

如果你发现经常发生swap in , out。
说明进程的脏页被换出到swap后,紧接着这些页可能又需要被进程访问,从而这些页需要从swap写入物理内存,发生了hard page fault。
这种情况下,你就需要加内存了,确实是内存不够用了。
hard page fault非常损耗性能,因为发生page fault时,是需要等待的,而且IO通常来说都是比较慢的,容易成为性能瓶颈。

什么是oom, 为什么会发生OOM

一:什么是ANR

ANR:Application Not Responding,即应用无响应

二:ANR的类型

ANR一般有三种类型:

1. KeyDispatchTimeout(5 seconds) --主要类型按键或触摸事件在特定时间内无响应

2. BroadcastTimeout(10 seconds) --BroadcastReceiver在特定时间内无法处理完成

3. ServiceTimeout(20 seconds) --小概率类型 Service在特定的时间内无法处理完成

三:KeyDispatchTimeout

Akey or touch event was not dispatched within the specified time(按键或触摸事件在特定时间内无响应)

具体的超时时间的定义在framework下的ActivityManagerService.java

//How long we wait until we timeout on key dispatching.

staticfinal int KEY_DISPATCHING_TIMEOUT = 5*1000

四:为什么会超时呢?

超时时间的计数一般是从按键分发给app开始。超时的原因一般有两种:

(1)当前的事件没有机会得到处理(即UI线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了)

(2)当前的事件正在处理,但没有及时完成

五:如何避免KeyDispatchTimeout

1. UI线程尽量只做跟UI相关的工作

2. 耗时的工作(比如数据库操作,I/O,连接网络或者别的有可能阻碍UI线程的操作)把它放入单独的线程处理

3. 尽量用Handler来处理UIthread和别的thread之间的交互

六:UI线程

说了那么多的UI线程,那么哪些属于UI线程呢?

UI线程主要包括如下:

1. Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick(),etc

2. AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel,etc

3. Mainthread handler: handleMessage(), post*(runnable r), etc

4. other

七:如何去分析ANR

先看个LOG: