当我使用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等优秀助手。任何有关本机代码工具的见解都将受到高度赞赏。
答案 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
程序来打印pid
和user 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 。
基本上:
此处有更多详情: http://developer.android.com/tools/debugging/debugging-tracing.html
免责声明:我只使用一个简单的测试应用程序完成此操作,因此我不知道您将从中获得多少里程数。它似乎比目前描述的更精确,并且不需要root。