App 專項測試之 CPU 測試


一、簡介

在使用 App 時經常會遇到手機發熱發燙或者應用 ANR 無響應等一系列問題,這都是因為 CPU 使用率過高或過於繁忙,使整個系統無法響應用戶操作,整體性能降低,用戶體驗非常差,所以我們需要進行 CPU 測試來檢測系統是否存在這一系列問題。

1.1 CPU 性能測試指標

Android CPU 性能測試主要關注兩個指標:

1. CPU 總體使用率

2. 應用程序 CPU 占用率

  •     空閑狀態下應用CPU消耗情況
  •     中等規格狀態(CPU已占用50%),應用CPU消耗情況
  •     高負荷(CPU占用80%以上),應用CPU消耗情況

1.2 CPU 計算公式

在Linux系統下,CPU 利用率分為用戶態、系統態、空閑態,分別表示 CPU 處於用戶態執行的時間、系統內核執行的時間、空閑系統進程執行的時間(如下圖)。

CPU 使用率計算公式:

二、查看 CPU 指標

2.1 top 命令

top 命令提供了實時的對系統處理器的狀態監控,可以按 CPU 使用內存和執行時間對任務進行排序。

優缺點:易獲取,但可能存在誤差

1. 查看 top 命令幫助信息

adb shell top -h 

 2. 使用命令獲取 CPU 使用情況

adb shell top -m 10 -n 1 -d 2 -s cpu -t 

 

第一組數據(CPU占用率):

  • User:用戶進程
  • System:系統進程
  • IOW:IO等待時間
  • IRQ:硬中斷時間

第二組數據(CPU使用情況):

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

2.2 cpuinfo

信息較少,不推薦使用

 adb shell dumpsys cpuinfo  

 

進程917 CPU占用率4.2%,其中用戶user話費2%,內核空間kernel話費2.2%

2.3 /proc 文件獲取

/proc 文件系統是一個偽文件系統,只存在內存當中,不占用外存空間。它以文件系統的方式為內核與進程提供通信的接口。用戶和應用程序可以通過/proc得到系統的信息,並可以改變內核的某些參數。由於系統的信息,如進程,是動態改變的,所以用戶或應用程序讀取/proc目錄中的文件時,/proc文件系統是動態從系統內核讀出所需信息並提交的。
安卓性能指標 cpu 總體使用率和應用程序 cpu 占用率主要與兩個 proc 文件相關,分別是 /proc/stat 和 /proc/進程id/stat文件.。

stat 中存儲了 cpu 從啟動到當前時刻的活動信息,可查看 cpu 總體使用率   adb shell cat /proc/stat  

以 cpu 開頭的行是關注重點,cpu0 表示當前 CPU 的核心(如果為雙核還會有 cpu1),cpu 為總的 Jiffies(時間片)

Jiffies 為Linux核心變數,是一個unsigned long類型的變量,它被用來記錄系統自開機以來,已經過了多少tick。每發生一次timer interrupt,Jiffies變數會被加1。

 每一列的數值含義如下:

  • user :從系統啟動開始累計到當前時刻,用戶態的jiffies ,不包含nice值為負進程;
  • nice :從系統啟動開始累計到當前時刻,nice值為負的進程所占用的jiffies;
  • system :從系統啟動開始累計到當前時刻,系統態的jiffies;
  • idle :從系統啟動開始累計到當前時刻,除硬盤IO等待時間以外其它等待的jiffies;
  • iowait : 從系統啟動開始累計到當前時刻,硬盤IO等待的jiffies;
  • irq : 從系統啟動開始累計到當前時刻,硬中斷的jiffies;
  • softirq :從系統啟動開始累計到當前時刻,軟中斷的jiffies。

總的 Jiffies 就是上面所有項加起來的總和,故系統所有進程在一段時間的總的 CPU 占用率為:

total = user+system+nice+idle+iowait+irq+softirq
cpu usage=[(user_end +sys_end+nice_end) - (user_begin + sys_begin+nice_begin)]/(total_end - total_begin)*100

要統計某個 App 的使用率可以進入到/proc/進程id/stat目錄

1. 先獲取 App 進程 ID,以豆瓣為例

2. 查詢對應的 stat 文件

在第14行(utime)、15行(stime)記錄了當前進程的 Jiffies 信息

  • utime=963 該任務在用戶態運行的時間,單位為 jiffies
  • stime=259 該任務在核心態運行的時間,單位為 jiffies

所以當前進程的Jiffies計算方式為utime+stime,要計算出一段時間內該進程的CPU使用率可使用:(當前時間(utime + stime) - 舊時間(utime + stime))/ total cpu Jiffies

2.4 第三方工具

如騰訊 GT、網易 Emagee 等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM