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

时间:2013-03-01 00:17:02

标签: android linux 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

我们可以看到CPU%是舍入到整数,有没有什么方法可以让进程的CPU%具有更高的精度?

- 对赏金的澄清 - Alex

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

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

我很高兴获得有关此意外活动的更多详细信息,Android为Java线程提供了TraceView等优秀助手。任何有关本机代码工具的见解都将受到高度赞赏。

4 个答案:

答案 0 :(得分:6)

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

如果找不到足够准确的工具,可以按照the man page for /proc中的说明直接查看/proc/[pid]/task/[ThreadName]。这使得自执行开始以来“时钟滴答”中消耗的总CPU时间。获得比这更好的分辨率可能很难或不可能。

修改

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

adb shell cat /proc/${pid}/task/*/stat | awk -F\ '{print $1, $14}' 

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

答案 1 :(得分:3)

试试这个:

ps -eo pcpu,pid,user,args | sort -r -k1 | less 

%CPU   PID USER     COMMAND
 9.0  2721 user   bash
 1.4   956 root     ...
 0.5  2212 user   ...

编辑:

您可以使用adb shell和busybox(http://www.busybox.net/downloads/BusyBox.html

adb shell busybox top

c:\ adb push busybox /system/bin
c:\ adb shell
# busybox top 

CPU:  2.3% usr  3.1% sys  3.9% nic 90.5% idle  0.0% io  0.0% irq  0.0% sirq
Load average: 1.06 1.66 10.63 1/589 8048
←[7m  PID  PPID USER     STAT   VSZ %MEM CPU %CPU COMMAND←[0m
31619  2180 10112    S     217m 67.0   0  3.8 com.mgeek.android.DolphinBrowser.B

 2232  2180 1000     S     551m169.6   0  2.6 system_server
 8038  8037 0        R     2068  0.6   0  0.8 busybox top
 2178     1 0        S    11092  3.3   0  0.6 /system/bin/drexe
 6812  2180 10104    S     199m 61.2   0  0.5 android.tether
 2291  2180 1001     S     324m 99.8   0  0.3 com.android.phone
 2308  2180 10006    S     325m100.0   0  0.1 com.sec.android.app.dialertab
 2177     1 1001     S     9624  2.8   0  0.1 /system/bin/rild
    5     2 0        SW<      0  0.0   0  0.1 [events/0]
30087  2180 10022    S     358m110.4   0  0.0 com.samsung.vvm
 2304  2180 10006    S     311m 96.0   0  0.0 com.sec.android.app.twlauncher
16110  2180 10006    S     296m 91.3   0  0.0 android.process.acore
 2445  2180 10006    S     272m 83.8   0  0.0 com.sec.android.provider.logsprovi

 8064  2180 10002    S     238m 73.4   0  0.0 com.google.process.gapps
31537  2180 10037    S     227m 69.9   0  0.0 com.google.android.gm
 2288  2180 10048    S     221m 68.1   0  0.0 com.swype.android.inputmethod
 2285  2180 10013    S     215m 66.3   0  0.0 com.tat.livewallpaper.aurora
30664  2180 10011    S     213m 65.8   0  0.0 com.android.email
31191  2180 10099    S     209m 64.4   0  0.0 com.sirma.mobile.bible.android
 2377  2180 10087    S     207m 63.9   0  0.0 android.tts

(取自here

答案 2 :(得分:2)

从另一个thread获得此信息:

3)获取CPU信息

〜$ adb shell dumpsys cpuinfo

<强>输出:

载荷:0.08 / 0.4 / 0.64 CPU使用率从42816ms到34683ms前: system_server:1%= 1%用户+ 0%内核/故障:16次 kdebuglog.sh:0% = 0%user + 0%kernel / faults:160 minor tiwlan_wq:0%= 0%用户+ 0%内核 usb_mass_storag:0%= 0%用户+ 0%内核 pvr_workqueue:0%= 0%用户+ 0%内核 + sleep:0%= 0%user + 0%kernel + sleep:0%= 0%user + 0%kernel 总计:6%= 1%用户+ 3%内核+ 0%irq

修改

您也可以尝试以下命令:echo $(adb shell ps | grep com.android.phone | awk '{ system("adb shell cat /proc/" $2 "/stat");}' | awk '{print $14+$15;}')

此外:

使用top:这将显示cpu统计信息 top -b -n 1 |grep ^Cpu

使用ps:这将显示每个进程的%cpu使用情况。 ps -eo pcpu,pid,user,args | sort -r -k1 | less

<强> EDIT2:

实际上你的评论和赏金描述(我怎么能猜出哪个线程吃电池?)我发现了一个有趣的页面:

http://ziyang.eecs.umich.edu/projects/powertutor/

如上所述:

  

您可以使用PowerTutor监控任何功耗   应用

尝试使用此实例,看看它是否符合您的要求。

最终编辑:

查看developer.android.com网站上的Systrace文档:

http://developer.android.com/tools/debugging/systrace.html http://developer.android.com/tools/help/systrace.html

如果您已经尝试过,我很抱歉,但这是衡量绩效的一种具体方法。

答案 3 :(得分:-2)

使用 DDMS 和方法分析来获取 TraceView

基本上:

  1. 以调试模式启动您的应用
  2. 在DDMS中,在“设备”选项卡中,单击“启动方法概要分析”
  3. 在设备上执行操作以重新创建要监控的条件
  4. 点击“停止方法分析”
  5. 您将获得一个相当详细的图表,其中包含每个线程的执行情况,您可以深入了解
  6. 此处有更多详情: http://developer.android.com/tools/debugging/debugging-tracing.html

    免责声明:我只使用一个简单的测试应用程序完成此操作,因此我不知道您将从中获得多少里程数。它似乎比目前描述的更精确,并且不需要root。

    enter image description here