在Android中描述"top"命令

Vie*_*Anh 8 android memory-management cpu-usage top-command

我正在制作一个小型Android应用程序,以显示当前的总CPU使用率,如Windows任务管理器中的选项卡性能.我使用"top -m 1 -n 1 -d 1"来获取CPU使用率,但我并不真正理解"top"的结果.

结果如:

User 5%, system 15%, IOW 0%, IRQ 0%
User 5 + Nice 0 + Sys 14 + Idle 73 + IOW 0 + IRQ 0 + SIRQ 0 = 92
PID     CPU%  S   #THR    VSS    RSS    UID     Name
213     11%   R    1      900K   340K   app_16   top
Run Code Online (Sandbox Code Playgroud)

CPU使用率= ??? 我如何计算总CPU使用率?

小智 10

这个问题的接受答案是不正确的.输出的第二行是在该分组中启动的线程/进程数.您的CPU使用率在上面是20%.其中5%来自用户应用,15%来自系统应用.您有73个空闲线程,14个系统线程和5个用户线程(根据第二行).

例如,这是我的Droid的当前顶级快照.

User 6%, System 5%, IOW 0%, IRQ 0%
User 21 + Nice 0 + Sys 16 + Idle 270 + IOW 0 + IRQ 3 + SIRQ 0 = 310

  PID CPU% S  #THR     VSS     RSS PCY UID      Name
30994   4% S    19 134912K  24140K  bg app_24   edu.vu.isis.ammo.spotreport
 1021   3% S    57 217400K  58504K  fg system   system_server
20911   2% R     1    880K    400K  fg shell    top
 1053   0% S     1      0K      0K  fg root     tiwlan_wq
  995   0% S     2   1272K    128K  fg compass  /system/bin/akmd2
Run Code Online (Sandbox Code Playgroud)

根据接受的答案,当实际上只是线程数时,我会有310%的CPU使用率.我很确定我实际上只使用了11%的CPU,其中前3个进程占总数的9%.


小智 5

这个问题的实际答案是直截了当的 - 可以从android top输出的第一行计算出来

User 5%, system 15%, IOW 0%, IRQ 0%
Run Code Online (Sandbox Code Playgroud)

总数=所有百分比的总和= 5 + 15 = 20%

关于第二行的另一个答案是错误的.第二行实际上给出了在该特定状态下花费的调度程序时间 - 在jiffies顶部的一个输出和顶部的下一个输出之间的用户/ sys/idle/iow (通常为10ms) - 在OP的情况下top -d 1- 每秒打印一次使用 - 总数每个核心的jiffies将是~100(假设每个jiffy为10ms) - 这与百分比值类似.

User 5 + Nice 0 + Sys 14 + Idle 73 + IOW 0 + IRQ 0 + SIRQ 0 = 92
Run Code Online (Sandbox Code Playgroud)

然而,如果值-d更高或者有多个核心,则值会更多

User 21 + Nice 0 + Sys 16 + Idle 270 + IOW 0 + IRQ 3 + SIRQ 0 = 310
Run Code Online (Sandbox Code Playgroud)

这可能没有任何-d选项,因此top默认延迟为3秒= 300 jiffies.

请参阅AOSP 顶级源代码,以获得每个值的计算方法的完整逻辑.