[英]How to get higher precision of “CPU%” than that from TOP command?
When I use TOP command, I could get the following info: 当我使用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
We can see the CPU%
is round to integer, is there any way I could get a process's CPU%
with higher precision? 我们可以看到
CPU%
是舍入到整数,有没有什么办法可以获得更高精度的进程CPU%
?
-- Clarifications on the bounty -- Alex - 对赏金的澄清 - 亚历克斯
The question refers to Android system, and preferably to a non-rooted device. 问题涉及Android系统,最好是非root设备。 While Android provides advanced profiling techniques for Java applications, tools for native code (C++) are limited.
虽然Android为Java应用程序提供了高级的分析技术,但本机代码(C ++)的工具却很有限。 top command on Android allows to show the statistics for all threads running in the system, both Java threads and C++ threads.
Android上的top命令允许显示系统中运行的所有线程的统计信息,包括Java线程和C ++线程。 I am looking for an answer that will help with the following quest:
我正在寻找一个有助于以下任务的答案:
My app uses 2% CPU when it is inactive in background, while it should be below 0.1%. 我的应用程序在后台处于非活动状态时使用2%CPU,而应低于0.1%。 If I run
top -t
, I get 0% for all 15 threads that belong to my process (some threads are Java threads, eg the Main, UI thread; others are pthreads that never attach to JVM). 如果我运行
top -t
,那么对于属于我的进程的所有15个线程,我得到0%(一些线程是Java线程,例如Main,UI线程;其他线程是永远不会附加到JVM的pthread)。 How can I guess which thread eats the battery? 我怎么能猜出哪个线程吃电池?
I would be glad to get even more details about this unexpected activity, and Android provides great helpers like TraceView for Java threads. 我很乐意获得关于这个意外活动的更多细节,Android提供了很好的帮助程序,如TraceView for Java线程。 Any insight regarding tools for native code will be highly appreciated.
任何有关本机代码工具的见解都将受到高度赞赏。
You didn't mention it in your post, but in the comment you said that you really need CPU utilization per thread, not per process. 您没有在帖子中提及它,但在评论中您说您确实需要每个线程的CPU利用率,而不是每个进程。
If you can't find a tool that's accurate enough, you can look directly in /proc/[pid]/task/[ThreadName]
as described in the man page for /proc
. 如果找不到足够准确的工具,可以直接查看
/proc/[pid]/task/[ThreadName]
,如/proc
的手册页中所述 。 This gives total CPU time consumed in "clock ticks" since execution began. 这使得自执行开始以来“时钟滴答”中消耗的总CPU时间。 Getting better resolution than this is probably difficult or impossible.
获得比这更好的分辨率可能很难或不可能。
Edit 编辑
From the OP's comment, a command that lists the relevant information is: 根据OP的评论,列出相关信息的命令是:
adb shell cat /proc/${pid}/task/*/stat | awk -F\ '{print $1, $14}'
This just cat
s the correct /proc
files to the debugging host, which runs a tiny awk
program to print the columns for pid
and user time
. 这只是
cat
S上的正确/proc
文件到调试主机,它运行一个小awk
程序打印的列的pid
和user time
。 You could also easily use cut -d " " -f1,14
or something similar in perl
to get the columns if awk
isn't available. 如果
awk
不可用,你也可以在perl
轻松使用cut -d " " -f1,14
或类似的东西来获取列。
Try this: 尝试这个:
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 ...
EDIT: 编辑:
You can use adb shell and busybox ( http://www.busybox.net/downloads/BusyBox.html ) 你可以使用adb shell和busybox( http://www.busybox.net/downloads/BusyBox.html )
adb shell busybox top 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
Got this information from another thread : 从另一个线程获得此信息:
3) Getting CPU info 3)获取CPU信息
~$ adb shell dumpsys cpuinfo 〜$ adb shell dumpsys cpuinfo
Output: 输出:
Load: 0.08 / 0.4 / 0.64 CPU usage from 42816ms to 34683ms ago: system_server: 1% = 1% user + 0% kernel / faults: 16 minor kdebuglog.sh: 0% = 0% user + 0% kernel / faults: 160 minor tiwlan_wq: 0% = 0% user + 0% kernel usb_mass_storag: 0% = 0% user + 0% kernel pvr_workqueue: 0% = 0% user + 0% kernel +sleep: 0% = 0% user + 0% kernel +sleep: 0% = 0% user + 0% kernel TOTAL: 6% = 1% user + 3% kernel + 0% irq 加载:0.08 / 0.4 / 0.64 CPU使用率从42816ms到34683ms前:system_server:1%= 1%用户+ 0%内核/故障:16次要kdebuglog.sh:0%= 0%用户+ 0%内核/故障:160 minor tiwlan_wq:0%= 0%user + 0%kernel usb_mass_storag:0%= 0%user + 0%kernel pvr_workqueue:0%= 0%user + 0%kernel + sleep:0%= 0%user + 0%kernel + sleep:0%= 0%user + 0%kernel TOTAL:6%= 1%user + 3%kernel + 0%irq
EDIT: 编辑:
You can also try this command: echo $(adb shell ps | grep com.android.phone | awk '{ system("adb shell cat /proc/" $2 "/stat");}' | awk '{print $14+$15;}')
你也可以尝试这个命令:
echo $(adb shell ps | grep com.android.phone | awk '{ system("adb shell cat /proc/" $2 "/stat");}' | awk '{print $14+$15;}')
Also: 也:
using top : This will show you the cpu stats top -b -n 1 |grep ^Cpu
使用top:这将显示cpu stats
top -b -n 1 |grep ^Cpu
using ps: This will show you the % cpu usage for each process. 使用ps:这将显示每个进程的%cpu使用情况。
ps -eo pcpu,pid,user,args | sort -r -k1 | less
EDIT2: EDIT2:
In realtion to your comments and the bounty description (How can I guess which thread eats the battery?) I found an interesting page: 实际上你的评论和赏金描述(我怎么能猜出哪个线程吃电池?)我发现了一个有趣的页面:
http://ziyang.eecs.umich.edu/projects/powertutor/ http://ziyang.eecs.umich.edu/projects/powertutor/
As stated there: 如上所述:
You can use PowerTutor to monitor the power consumption of any application.
您可以使用PowerTutor监控任何应用程序的功耗。
Try this for an instance and see if it meets your requirements. 试试这个实例,看看它是否符合您的要求。
FINAL EDIT: 最终编辑:
Check out the Systrace documentation on the developer.android.com site: 查看developer.android.com网站上的Systrace文档:
http://developer.android.com/tools/debugging/systrace.html http://developer.android.com/tools/help/systrace.html http://developer.android.com/tools/debugging/systrace.html http://developer.android.com/tools/help/systrace.html
I'm sorry if you already tried that, but that's one concrete method to measure the performance. 如果您已经尝试过,我很抱歉,但这是衡量绩效的一种具体方法。
Use DDMS and method profiling to get a TraceView . 使用DDMS和方法分析来获取TraceView 。
Basically: 基本上:
More details here: http://developer.android.com/tools/debugging/debugging-tracing.html 更多细节: http : //developer.android.com/tools/debugging/debugging-tracing.html
Disclaimer : I've only done this with a simple test app so I don't know how much mileage you'll get out of it. 免责声明 :我只使用一个简单的测试应用程序完成此操作,因此我不知道您将从中获得多少里程数。 It does seem to give a bit more precision than what has been described so far, and does not require root.
它似乎比目前描述的更精确,并且不需要root。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.