Android性能測試——獲取內存和cpu使用情況

Android性能測試——獲取內存和cpu使用情況

在測試Android應用的過程中,內存和cpu值大小是測試的重點之一,本文將列舉幾種工作中常用的獲取方式。

一、使用top獲取內存和cpu信息

獲取內存和cpu信息的最簡單方式就是使用adb shell 自帶的top命令,在測試過程中,電腦連接設備,使用adb shell top命令,即可得到近乎實時的應用內存使用情況。Android8.0+以上的設備或許有些不同,但內容

Android8.0以下的設備

Android8.0以下的設備,top後可以跟一些參數來限制打印的結果
top 後可跟的參數如下

Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [-t ] [ -h ]
-m num  Maximum number of processes to display. 最多顯示多少個進程
-n num  Updates to show before exiting.  刷新次數 
-d num  Seconds to wait between updates. 刷新間隔時間(默認5秒)
-s col  Column to sort by (cpu,vss,rss,thr). 按哪列排序 
-t      Show threads instead of processes. 顯示線程信息而不是進程
-h      Display this help screen.  顯示幫助文檔

打印的top結果如下

User 8%, System 4%, IOW 0%, IRQ 0%
User 153 + Nice 1 + Sys 91 + Idle 1600 + IOW 0 + IRQ 0 + SIRQ 1 = 1846

  PID PR CPU% S  #THR     VSS     RSS PCY UID      Name
 2103  2   7% S    75 1807528K 187764K  fg u0_a16   com.android.systemui
  438  0   2% S    15 145984K   8428K  fg system   /system/bin/surfaceflinger
 1333  0   1% S   176 2404956K 137780K  fg system   system_server
11112  0   0% S     1      0K      0K  fg root     kworker/u16:5
12102  6   0% R     1   5200K   1776K  fg shell    top
...

對於top打印的結果,第二行各個數據解釋:

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  進程的名稱

Android8.0以上的設備

Android8.0及以上設備,top 後可跟的參數如下

Android8.0及以上設備的結果類似linux的結果,打印的top結果如下

 [?25l [0m [H [J [s [999C [999B [6n [uTasks: 596 total,   2 running, 554 sleeping,   0 stopped,   0 zombie
Mem:   5862776k total,  5755700k used,   107076k free,    10264k buffers
Swap:  2293756k total,        0k used,  2293756k free,  2825024k cached
800%cpu  21%user 145%nice  76%sys 534%idle  10%iow   0%irq  14%sirq   0%host
 [7m  PID USER         PR  NI VIRT  RES  SHR S[%CPU] %MEM     TIME+ ARGS             [0m
 7048 u0_a40104    30  10 1.3G 181M 106M R  124   3.1   0:17.86 dex2oat --zip-f+
 7083 shell        20   0  12M 2.4M 1.6M R 34.4   0.0   0:00.05 top
 4363 u0_a96       20   0 4.3G  81M  51M S 20.6   1.4   0:05.18 com.huawei.appm+
  351 root         -2   0    0    0    0 S 20.6   0.0   0:02.00 [dhd_rxf]
...

對於top打印的結果,第二行各個數據解釋:

Mem:   5862776k total,  5755700k used,   107076k free,    10264k buffers
表示
Mem total used free buffers: 總內存,已使用多少,空閒多少,緩衝區還有多少

第三行各個數據解釋:

Swap:  2293756k total,        0k used,  2293756k free,  2825024k cached
表示
Swap total used free cached:交換區全部、已使用、空閒和緩衝交換空間

第四行各cpu運行狀態:

800%cpu  21%user 145%nice  76%sys 534%idle  10%iow   0%irq  14%sirq   0%host
表示
cpu  全總的cpu能力,正常可以理解爲有n核,總的就是n*100%
user: 運行(未調整優先級的) 用戶進程的CPU佔用
niced:運行已調整優先級的用戶進程的CPU佔用
sys: 運行內核進程的CPU佔用
idle:空閒的cpu比率
iow	IO wait: 用於等待IO完成的CPU比率
...

第五行是每個應用的具體信息,說明如下

PID USER         PR  NI VIRT  RES  SHR S[%CPU] %MEM     TIME+ ARGS  
表示
PID:進程ID,進程的唯一標識符
USER:進程所有者的實際用戶名
PR:進程的調度優先級。這個字段的一些值是'rt'。這意味這這些進程運行在實時態。
NI:進程的nice值(優先級)。越小的值意味着越高的優先級。負值表示高優先級,正值表示低優先級
VIRT:virtual memory usage 虛擬內存,進程使用的虛擬內存。進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
RES:常駐內存,駐留內存大小。駐留內存是任務使用的非交換物理內存大小。進程使用的、未被換出的物理內存大小,單位kb
SHR:shared memory 共享內存
%CPU:自從上一次更新時到現在任務所使用的CPU時間百分比。%CPU顯示的是進程佔用一個核的百分比,而不是整個cpu(N核)的百分比,有時候可能大於100,那是因爲該進程啓用了多線程佔用了多個核心,所以有時候我們看該值得時候會超過100%,但不會超過總核數*100
%MEM:進程使用的可用物理內存百分比
TIME+:任務啓動後到現在所使用的全部CPU時間,精確到百分之一秒
ARGS:運行進程所使用的命令。進程名稱(命令名/命令行)

二、使用cpuinfo和meminfo獲取內存和cpu信息

無論對Android哪個版本,都可以獲取應用的內存PSS( Proportional Set Size 實際使用的物理內存(比例分配共享庫佔用的內存) )信息,命令如下:

adb shell dumpsys meminfo

無論對Android哪個版本,都可以獲取應用cpu使用情況

adb shell dumpsys cpuinfo
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章