1. 程式人生 > >adb shell 監控手機cpu使用率

adb shell 監控手機cpu使用率

最近在做Android monitor ,利用adb shell 在pc端監測手機,從網上看的資料總結下,備忘。

1.      adb shell dumpsys cpuinfo 得到每個程序使用cpu的詳細資訊

2.      adb shell top –n 1 | grep proc 獲取指定程序的cpu資訊

3.      cat  /proc/cpuinfo 獲取cpu 硬體資訊

4.      cat /proc/stat

目前查到的有以上四種獲取cpu資訊的方式,對於1,3未做詳細研究,後續補充

對於2由於top命令執行時間太久,大概3到4秒,執行結果:

User 29%, System 4%, IOW 0%, IRQ 0%
User 359 + Nice 1 + Sys 52 + Idle 787 + IOW 5 + IRQ 8 + SIRQ 2 = 1214

  PID PR CPU% S  #THR     VSS     RSS PCY UID      Name
19269  1  25% S   121 3323236K 206268K  fg u0_a98   com.antutu.ABenchMark
  517  3   2% S    82 104372K   1148K  fg root     /system/vendor/bin/thermal-en                                                                                                                           gine
 1255  2   1% S   152 2388920K 143140K  fg system   system_server
  374  1   1% S     1      0K      0K  fg root     msm_thermal:fre

第一行資料(cpu佔用率):
User    使用者程序 
System  系統程序 
IOW IO等待時間 
IRQ 硬中斷時間

第二行資料(cpu使用情況,單位據說是jiffies):

User  處於使用者態的執行時間,不包含優先值為負程序 
Nice  優先值為負的程序所佔用的CPU時間 
Sys   處於核心態的執行時間 
Idle  除IO等待時間以外的其它等待時間 
IOW   IO等待時間 
IRQ   硬中斷時間 
SIRQ  軟中斷時間

第三行資料:
PID   程序id
PR    優先順序
CPU%  當前瞬時CPU佔用率
S     程序狀態:D=不可中斷的睡眠狀態, R=執行, S=睡眠, T=跟蹤/停止, Z=殭屍程序
#THR  程式當前所用的執行緒數
VSS   Virtual Set Size  虛擬耗用記憶體(包含共享庫佔用的記憶體)
RSS   Resident Set Size 實際使用實體記憶體(包含共享庫佔用的記憶體)
PCY   排程策略優先順序,SP_BACKGROUND/SP_FOREGROUND
UID   程序所有者的使用者id
Name  程序的名稱
對於4,最終選擇的是這種方式,執行快,而且android monitor 的原始碼中也是用這種方式計算的,以及檢視的其他工具,靠譜。
$ adb shell cat /proc/stat
cpu  8616133 258931 8249921 30853032 144979 755992 509627 0 0 0
cpu0 1624419 61721 2732353 26158542 135605 494463 322680 0 0 0
cpu1 1652481 59830 2358955 2229236 7529 155560 96846 0 0 0
cpu2 2676653 73144 1663307 1306790 876 58651 52434 0 0 0
cpu3 2662580 64236 1495306 1158464 969 47318 37667 0 0 0
intr 423574039 0 0 0 41675528 0 21889144 729961 5 4 5 8096 0 0 0 0 314 473 0 1891 516482 0 0 11171628 0 0 0 0 127752 39799 8755299 299379 0 2 0 0 0 0 9939721 0 0 0 0 0 67091 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 471664 708335 7571004 16602123 0 0 0 0 35 4522234 0 291 82 0 0 0 0 0 0 0 11028 1 0 0 0 0 0 0 0 0 109 1 3 12 0 0 0 8 0 0 0 0 68 0 68 0 0 153 0 0 0 62 0 0 0 0 0 0 0 1026 0 413 0 0 0 0 0 43 0 0 0 0 0 4477092 0 0 0 0 0 0 0 1550 0 0 143756 7 7 7 0 0 0 0 0 0 0 15517 3949201 0 333 1 0 1 22 0 8 0 5318 8 31708 14 0 14 5544 383 2155 712722 183889 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 246235 0 0 0 0 12601 94475 0 324 0 5 0 69 0 0 0 0 0 0 0 0 0 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7938 490 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1885 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3729 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 155646 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18152006 0 105 799 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1086 0 0 0 0 0 0 0 0 0 0
ctxt 862498687
btime 1479122422
processes 789948
procs_running 4
procs_blocked 0
softirq 193635390 305292 39873286 732253 2713236 305292 305292 30544250 30361992 86707 88407790
以上為4核手機的執行情況
cpu  8616133 258931 8249921 30853032 144979 755992 509627 0 0 0
紅色字型數字表示的含義:
- user     從系統啟動開始累計到當前時刻,處於使用者態的執行時間,不包含 nice值為負程序。 
- nice      從系統啟動開始累計到當前時刻,nice值為負的程序所佔用的CPU時間
- system      從系統啟動開始累計到當前時刻,處於核心態的執行時間 
- idle      從系統啟動開始累計到當前時刻,除IO等待時間以外的其它等待時間 
- iowait     從系統啟動開始累計到當前時刻,IO等待時間 
- irq       從系統啟動開始累計到當前時刻,硬中斷時間
- softirq    從系統啟動開始累計到當前時刻,軟中斷時間
後面三個0的欄位含義:
- steal: involuntary wait
- guest: running a normal guest
- guest_nice: running a niced guest
cpu利用率的計算:
取很短相鄰時間內的兩次以上資料
cpu_total=user+nice+system+idle+iowait+irq+soft(據說後面為0的三可能會不為0,但是沒遇到過,遇到再補充)
cpu_rate=((cpu_total2-cpu_total1)-(idle2-idle1))/((cpu_total2-cpu_total1))
備註:以上是參考中文各個網站的資料
stackoverflow上,有另一種計算方式,相似但是不完全一致,計算cpu_total時,沒有加iowait,但加了steal
http://stackoverflow.com/questions/23367857/accurate-calculation-of-cpu-usage-given-in-percentage-in-linux
評論中的參考資料,寫的有理有據,覺得比上一種計算方式更可靠,但只有how沒有why