如何获得比"TOP命令"更高的"CPU%"精度?

Jac*_*kWM 11 linux android cpu-usage

当我使用TOP命令时,我可以得到以下信息:

shell@android:/ $ top -n 1                                                     

User 31%, System 10%, IOW 0%, IRQ 0%
User 346 + Nice 10 + Sys 120 + Idle 637 + IOW 6 + IRQ 0 + SIRQ 2 = 1121

  PID PR CPU% S  #THR     VSS     RSS PCY UID      Name
  481  1  26% S    89 762832K  81688K  fg system   system_server
 1699  0   5% S    27 676472K  39092K  fg u0_a72   wm.cs.systemmonitor
11243  0   3% S    28 673140K  29796K  bg u0_a111  com.weather.Weather
13327  2   1% S    23 680472K  35844K  bg u0_a83   com.rhmsoft.fm
  659  0   1% S    17 663044K  33136K  bg u0_a13   android.process.media
20260  1   0% R     1   1208K    508K     shell    top
Run Code Online (Sandbox Code Playgroud)

我们可以看到CPU%圆是整数,有没有什么方法可以得到CPU%更高精度的过程?

- 对赏金的澄清 - 亚历克斯

问题涉及Android系统,最好是非root设备.虽然Android为Java应用程序提供了高级的分析技术,但本机代码(C++)的工具却很有限.Android上的top命令允许显示系统中运行的所有线程的统计信息,包括Java线程和C++线程.我正在寻找一个有助于以下任务的答案:

我的应用程序在后台处于非活动状态时使用2%CPU,而应低于0.1%.如果我运行top -t,对于属于我的进程的所有15个线程,我得到0%(一些线程是Java线程,例如Main,UI线程;其他线程是永远不会连接到JVM的pthread).我怎么能猜出哪个线程吃电池?

我很乐意获得关于这个意外活动的更多细节,Android提供了很好的帮助程序,如TraceView for Java线程.任何有关本机代码工具的见解都将受到高度赞赏.

Gen*_*ene 6

您没有在帖子中提及它,但在评论中您说您确实需要每个线程的CPU利用率,而不是每个进程.

如果找不到足够准确的工具,可以按照手册页中的/proc/[pid]/task/[ThreadName]描述直接查看/proc.这使得自执行开始以来"时钟滴答"中消耗的总CPU时间.获得比这更好的分辨率可能很难或不可能.

编辑

根据OP的评论,列出相关信息的命令是:

adb shell cat /proc/${pid}/task/*/stat | awk -F\ '{print $1, $14}' 
Run Code Online (Sandbox Code Playgroud)

这只是catS上的正确/proc文件到调试主机,它运行一个小awk程序打印列piduser time.如果不可用,您也可以轻松使用cut -d " " -f1,14或类似的内容perl来获取列awk.

  • 在*某些*设备上,您还可以获取 schedstat 计数器(`/proc/<pid>/schedstat` 和 `/proc/<pid>/task/<tid>/schedstat`)。这三个字段是:在 CPU 上花费的时间;等待运行队列所花费的时间;# 在 CPU 上运行的时间片。不过,一些 OEM 并未在内核中启用此功能。 (3认同)