简体   繁体   English

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

[英]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程序打印的列的piduser 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

(Taken from here ) (摘自这里

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: 基本上:

  1. Launch your app in debug mode 以调试模式启动您的应用程序
  2. In DDMS, in the Devices tab, click "Start method profiling" 在DDMS中,在“设备”选项卡中,单击“启动方法概要分析”
  3. Do stuff on your device to recreate the conditions you want to monitor 在设备上执行操作以重新创建要监视的条件
  4. Click "Stop method profiling" 单击“停止方法分析”
  5. You'll get a fairly detailed graph with each thread's execution that you can drill down into 您将获得一个相当详细的图表,其中包含您可以深入研究的每个线程的执行情况

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM