web-dev-qa-db-ja.com

TOPコマンドよりも「CPU%」の精度を上げるには?

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%をより高い精度で取得する方法はありますか?

-バウンティの説明-アレックス

質問はAndroidシステム、できればルート化されていないデバイスを指します。一方Androidは、Javaの高度なプロファイリング手法を提供します=アプリケーション、ネイティブコード(C++)のツールは制限されています。topコマンドのAndroidは、の統計を表示できますシステムで実行されているすべてのスレッド、JavaスレッドとC++スレッドの両方。次の質問に役立つ答えを探しています。

私のアプリは、バックグラウンドで非アクティブのときに2%のCPUを使用しますが、0.1%未満である必要があります。走ったらtop -t、プロセスに属する15個のスレッドすべてで0%を取得します(一部のスレッドはJavaスレッド、たとえばMain、UIスレッド、その他はJVMに接続しないpthreadです)。どうすればよいですか。どのスレッドがバッテリーを消費すると思いますか?

この予期しないアクティビティについてさらに詳しく知りたいと思います。Androidは、Javaスレッドの TraceView のような優れたヘルパーを提供します。ネイティブコード用のツールに関する洞察は高く評価されます。

11
JackWM

投稿では言及していませんが、コメントでは、プロセスごとではなく、スレッドごとにCPU使用率が本当に必要であると述べています。

十分に正確なツールが見つからない場合は、 /proc/[pid]/task/[ThreadName]のマニュアルページ で説明されているように、/procを直接調べることができます。これにより、実行が開始されてから「クロックティック」で消費された合計CPU時間が得られます。これよりも優れた解像度を取得することは、おそらく困難または不可能です。

編集

OPのコメントによると、関連情報を一覧表示するコマンドは次のとおりです。

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

これは、デバッグホストへの正しい/procファイルをcatsします。デバッグホストは小さなawkプログラムを実行して、piduser timeの列を出力します。 Perlが使用できない場合は、cut -d " " -f1,14またはawkの類似のものを簡単に使用して列を取得することもできます。

6
Gene

これを試して:

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シェルbusyboxトップ

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

ここ から取得)

3
Alberto Megía

別の情報からこの情報を取得しました スレッド

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%ユーザー+ 0%カーネル/障害:160マイナーtiwlan_wq:0%= 0%ユーザー+ 0%カーネルusb_mass_storag:0%= 0%ユーザー+ 0%カーネルpvr_workqueue:0%= 0%ユーザー+ 0%カーネル+スリープ:0%= 0%ユーザー+ 0%カーネル+スリープ:0%= 0%ユーザー+ 0%カーネル合計: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.htmlhttp://developer.Android.com/tools/help/systrace.html

すでにお試しいただいている場合は申し訳ありませんが、それがパフォーマンスを測定する具体的な方法の1つです。

2
g00dy