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