Android App性能評測分析-cpu占用篇

1抵窒、前言

很多時候在使用APP的時候,手機可能會發(fā)熱發(fā)燙叠骑。這是因為CPU使用率過高李皇,CPU過于繁忙,會使整個手機無法響應(yīng)用戶宙枷,整體性能降低掉房,用戶體驗就會很差,也容易引起ANR等等一系列問題慰丛。以下會根據(jù)實際app性能測試案例卓囚,展開進行app性能評測之CPU使用率的分析和總結(jié)。

CPU使用率原理理解

在Linux系統(tǒng)下诅病,CPU利用率分為用戶態(tài)哪亿、系統(tǒng)態(tài)、空閑態(tài)贤笆,分別表示CPU處于用戶態(tài)執(zhí)行的時間蝇棉,系統(tǒng)內(nèi)核執(zhí)行的時間,和空閑系統(tǒng)進程執(zhí)行的時間苏潜。

平時所說的CPU利用率是指:CPU執(zhí)行非系統(tǒng)空閑進程的時間 / CPU總的執(zhí)行時間银萍。

那么我們來看看這個時間究竟是什么?

先介紹幾個和Linux時間有關(guān)的名詞:HZ恤左、tickjiffies贴唇。

HZ:Linux 核心每隔固定周期會發(fā)出timer interrupt (IRQ 0),HZ是用來定義每一秒有幾次timer interrupts飞袋。例如HZ為1000戳气,就代表每秒有1000次timer interrupts。
Tick :Tick是HZ的倒數(shù)巧鸭,Tick = 1/HZ 瓶您。即timer interrupt每發(fā)生一次中斷的時間。如HZ為250時纲仍,tick為4毫秒(millisecond)呀袱。
Jiffies :在Linux的內(nèi)核中,有一個全局變量:Jiffies郑叠。 Jiffies代表時間夜赵。它的單位隨硬件平臺的不同而不同。jiffies的單位就是 1/HZ乡革。Intel平臺jiffies的單位是1/100秒寇僧,這就是系統(tǒng)所能分辨的最小時間間隔了摊腋。每個CPU時間片,Jiffies都要加1嘁傀。 CPU的利用率就是用執(zhí)行用戶態(tài)+系統(tǒng)態(tài)的Jiffies除以總的Jifffies來表示兴蒸。

CPU利用率計算公式也就是:
CPU使用率=(用戶態(tài)Jiffies+系統(tǒng)態(tài)Jiffies)/總Jiffies

2、CPU測試方法

2.1 CPU占用率數(shù)據(jù)獲取--第三方測試工具

騰訊GT
平安云測試助手+評測中心(http://fit-stg1.jryzt.com/Hyperion-server/html/index.html) ---極力推薦
安測試
騰訊APT
網(wǎng)易Emagee

CPU測試大家一般都使用外部提供的第三方工具來輔助測試细办,類似上方列舉的這些橙凳、這些工具的原理都是基于調(diào)用 android 底層的一些 api 來獲取到測試所用到的值,當(dāng)然我們也可以采用其他方法蟹腾,如使用 android 本身提供的一套 adb 即可完成上述測試痕惋。

2.2 CPU占用率數(shù)據(jù)獲取方法--adb命令

CPU是系統(tǒng)非常重要的資源,在Android中/proc/stat, 包含了所有CPU的相關(guān)詳情信息娃殖,查看CPU使用情況值戳,CPU不是一個瞬時態(tài),而是一個過程態(tài)的體現(xiàn)炉爆,一般可以使用top命令和dump cpuinfo命令進行CPU占用率獲取堕虹。

一般獲取Android CPU數(shù)據(jù)的有兩個命令:top和dump cpuinfo

2.2.1 top命令獲取方法

(1)top命令方式獲取原理了解:

top是比較經(jīng)典的CPU計算方法,top的代碼在androidm/system/core/toolbox/top.c下面芬首,輸出process的cpu使用率在print_procs里面赴捞,CPU的計算是proc->delta_time * 100 / total_delta_time

先看total_delta_time由:

    total_delta_time = (new_cpu.utime + new_cpu.ntime + new_cpu.stime + new_cpu.itime + new_cpu.iowtime + new_cpu.irqtime + new_cpu.sirqtime)
  - (old_cpu.utime + old_cpu.ntime + old_cpu.stime + old_cpu.itime
  + old_cpu.iowtime + old_cpu.irqtime + old_cpu.sirqtime);

而這些變量的值,是在read_procs通過讀取/proc/stat的jiffies得到:
所以總的cpu時間 = user + nice + system + idle + iowait + irq + softirq 郁稍,例如:User 147 + Nice 11 + Sys 79 + Idle 408 + IOW 1 + IRQ 0 + SIRQ 6 = 652
而proc->delta_time是兩次讀取/proc/pid/stat相減得到赦政,可見,top是一段時間內(nèi)耀怜,計算process的cpu jiffies與總的cpu jiffies差值得到恢着。

附注釋:

列名 描述
/proc/stat文件: 該文件包含了所有CPU活動的信息,該文件中的所有值都是從系統(tǒng)啟動開始累計到當(dāng)前時刻财破。不同內(nèi)核版本中該文件的格式可能不大一致掰派。
user (147): 從系統(tǒng)啟動開始累計到當(dāng)前時刻,處于用戶態(tài)的運行時間左痢,不包含 nice值為負(fù)進程靡羡。
nice (11): 從系統(tǒng)啟動開始累計到當(dāng)前時刻,nice值為負(fù)的進程所占用的CPU時間
system (79): 從系統(tǒng)啟動開始累計到當(dāng)前時刻俊性,處于核心態(tài)的運行時間
idle (408): 從系統(tǒng)啟動開始累計到當(dāng)前時刻略步,除IO等待時間以外的其它等待時間
iowait (1): 從系統(tǒng)啟動開始累計到當(dāng)前時刻,IO等待時間(since 2.5.41)
irq (0) 從系統(tǒng)啟動開始累計到當(dāng)前時刻定页,硬中斷時間(since 2.6.0-test4)
softirq (6): 從系統(tǒng)啟動開始累計到當(dāng)前時刻纳像,軟中斷時間(since 2.6.0-test4)
(2)top命令獲取CPU占用率實例:

adb shell top -m 100 -n 1 -s cpu | grep 包名

adb shell top -m 100 -n 1 -s cpu | grep com.pafinancialtech.fuzhoubank

zhangmeiyuan-5:~ zhangmeiyuan$ adb shell top -m 100 -n 1 -s cpu | grep com.pafinancialtech.fuzhoubank
18540  0  42% S   108 2102520K 317264K  fg u0_a858  com.pafinancialtech.fuzhoubank
CPU占用率_實時打印.png

CPU占用率_每隔5s打印一次.png

2.2.2 dump cpuinfo命令獲取方法

(1)dump命令方式獲取原理了解:

dump cpuinfo是Android特有的命令,dump cpuinfo命令的實現(xiàn)在androidm/frameworks/base/core/java/com/android/internal/os/ProcessCpuTracker.java類里面拯勉,方法是printCurrentState:
而printProcessCPU輸出process CPU的使用情況:

private void printProcessCPU(PrintWriter pw, String prefix, int pid, String label,
            int totalTime, int user, int system, int iowait, int irq, int softIrq,
            int minFaults, int majFaults) {
        pw.print(prefix);
        if (totalTime == 0) totalTime = 1;
        printRatio(pw, user+system+iowait+irq+softIrq, totalTime);
...
}

user+system+iowait+irq+softIrq就是totalTime竟趾。 st變量的賦值,在collectStats里面宫峦,st.rel_utime 和 st.rel_stime還是通過讀/proc/pid/stat相減得到岔帽,而st.rel_uptime卻是通過 SystemClock.uptimeMillis()差值,并不是跟top一樣导绷,通過proc/stat得到總CPU jiffies,

所以犀勒,進程的總Cpu時間processCpuTime = utime + stime + cutime + cstime,該值包括其所有線程的cpu時間妥曲。(例外贾费,一般cpu按100%計算,如果是多核情況下還需乘以cpu的個數(shù))

附注釋:
/proc/pid/stat文件:
該文件包含了某一進程所有的活動的信息檐盟,該文件中的所有值都是從系統(tǒng)啟動開始累計 到當(dāng)前時刻褂萧。
Utime(39) 該任務(wù)在用戶態(tài)運行的時間,單位為jiffies
Stime(25) 該任務(wù)在核心態(tài)運行的時間葵萎,單位為jiffies
Cutime(0) 所有已死線程在用戶態(tài)運行的時間导犹,單位為jiffies
Cstime(0) 所有已死在核心態(tài)運行的時間,單位為jiffies

(2)dump命令獲取CPU占用率實例

adb shell dumpsys cpuinfo |grep 包名

zhangmeiyuan-5:~ zhangmeiyuan$ adb shell dumpsys cpuinfo |grep com.pafinancialtech.fuzhoubank
  117% 16322/com.pafinancialtech.fuzhoubank: 106% user + 11% kernel / faults: 45403 minor 99 major
  0.5% 14032/com.pafinancialtech.fuzhoubank:pushservice: 0.5% user + 0% kernel / faults: 1610 minor
 +0% 16547/com.pafinancialtech.fuzhoubank:remote: 0% user + 0% kernel

CPU_dump方式獲取的占用率.png

從上圖我們可以看出:80%是針對這個CPU的占用率是80%羡忘,其中72%占用率是用戶使用的谎痢,8.4%是內(nèi)核的占用率,這個數(shù)只是針對1核來說卷雕,現(xiàn)在手機都是多核的了节猿,那這樣的值也不會太準(zhǔn)確,如果是多核情況下還需除以cpu的個數(shù)漫雕。

綜上:top跟dump cpuinfo的區(qū)別在于:top分母是總測CPU jiffies滨嘱,而dump cpuinfo是是時間,而并非jiffies蝎亚,也能解釋為什么top出來的cpu九孩,大部分時間會比dump cpuinfo小的原因。

2.3 CPU問題分析思路及工具

如果APP某場景進行操作時出現(xiàn)發(fā)燙发框、卡頓躺彬、ANR現(xiàn)象時,可以懷疑出現(xiàn)CPU問題梅惯,一般解決思路如下:

a. 如果已經(jīng)導(dǎo)致ANR, 則去log里面搜索"ANR in"
b. 沒有導(dǎo)致ANR則基于以上方法獲取到的CPU占用率宪拥,如果某場景的CPU占用率走勢異常、峰值存在異常铣减、均值大于基線她君,則可以利用DDMS查看分析Trace文件,或者使用Android studio里面的Android Monitor根據(jù)Monitor中的CPU可以看出目前CPU明細(xì)使用葫哗。
c.查找程序中有沒有特殊布局或者特殊操作(GPS定位缔刹,一直刷新類的服務(wù)等)球涛,特殊加載(Gif圖片加載,視頻校镐,音頻加載等)

2.3.1 Android Monitor監(jiān)控分析

拿到APP源碼亿扁,在Android studio中構(gòu)建測試DEBUG包進行調(diào)試如下截圖:


cpu_monitor.png

image.png

雙擊我綠色框標(biāo)記的這個按鈕,就會生成這么一個文件鸟廓,如圖:


image.png

上圖就一目了然的看到了耗費CPU 都有哪些方法从祝。此時點擊黑色的文本,幾秒鐘后studio會生成.trace文件引谜,我們就可以分析各方法使用cpu的情況了牍陌。

2.3.2 分析TraceView文件查找CPU問題

TraceView 是 Android SDK 中內(nèi)置的1個工具,它可以加載 trace 文件员咽,用圖形的情勢展現(xiàn)代碼的履行時間毒涧、次數(shù)及調(diào)用棧,便于我們分析骏融。

(1)使用Android Studio工具DDMS

生成Traceview 進行分析查看具體Trace期間各方法調(diào)用關(guān)系链嘀,調(diào)用次數(shù)以及耗時比例


DDMS_查看各方法調(diào)用及CPU信息.png

附注釋:
Traceview 面板分上下兩部分
上面是時間軸面板 (Timeline Panel)
左側(cè)顯示的是線程信息
右側(cè)黑色部分是顯示執(zhí)行時間段、白色是線程暫停時間段档玻,
右側(cè)鼠標(biāo)放在上面會出現(xiàn)時間線縱軸怀泊,在頂部會顯示當(dāng)前時間線所執(zhí)行的具體函數(shù)信息
下面是分析面板(Profile Panel) - 每一列內(nèi)容
Inclusive time - 函數(shù)本身運行花費時間 + 函數(shù)調(diào)用其他函數(shù)時間
Exclusive time - 函數(shù)本身運行花費時間。
Calls + RecurCall/Total 調(diào)用 + 重復(fù)調(diào)用次數(shù) / 函數(shù)總調(diào)用次數(shù)
Cpu Time/Call 總的Cpu時間與總的調(diào)用次數(shù)之比

附: Profile Panel各列作用說明

列名 描述
Name 該線程運行過程中所調(diào)用的函數(shù)名
Incl Cpu Time 某函數(shù)占用的CPU時間误趴,包含內(nèi)部調(diào)用其它函數(shù)的CPU時間
Excl Cpu Time 某函數(shù)占用的CPU時間霹琼,但不含內(nèi)部調(diào)用其它函數(shù)所占用的CPU時間
Incl Real Time 某函數(shù)運行的真實時間(以毫秒為單位),內(nèi)含調(diào)用其它函數(shù)所占用的真實時間
Excl Real Time 某函數(shù)運行的真實時間(以毫秒為單位)凉当,不含調(diào)用其它函數(shù)所占用的真實時間
Call+Recur Calls/Total 某函數(shù)被調(diào)用次數(shù)以及遞歸調(diào)用占總調(diào)用次數(shù)的百分比
Cpu Time/Call 某函數(shù)調(diào)用CPU時間與調(diào)用次數(shù)的比枣申。相當(dāng)于該函數(shù)平均執(zhí)行時間
Real Time/Call 同CPU Time/Call類似,只不過統(tǒng)計單位換成了真實時間

(2)使用代碼生成 trace 文件

  Debug.startMethodTracing("shixintrace");   
 //開始 trace看杭,保存文件到 "/sdcard/shixintrace.trace"
    // ...
    Debug.stopMethodTracing();    //結(jié)束

代碼很簡單忠藤,當(dāng)你調(diào)用開始代碼的時候,系統(tǒng)會生產(chǎn) trace 文件楼雹,并且產(chǎn)生追蹤數(shù)據(jù)模孩,當(dāng)你調(diào)用結(jié)束代碼時,會將追蹤數(shù)據(jù)寫入到 trace 文件中贮缅。
下1步使用 adb 命令將 trace 文件導(dǎo)出到電腦:

adb pull /sdcard/shixintrace.trace /tmp

使用代碼生成 trace 方式的好處是容易控制追蹤的開始和結(jié)束榨咐,缺點就是步驟略微多了一點。

2.3 CPU測試場景

一般cpu檢測我們要分4種情況:
1.在空閑時間的消耗谴供,基本沒大應(yīng)用使用cpu

如果APP在退出界面后還有進程長期運行块茁,那需要關(guān)注下待機場景的CPU。待機場景下CPU的消耗一般不會很大,例如福州直銷銀行APP在后臺運行時数焊,可能消耗經(jīng)常是0%永淌,長時間平均下,可能只有0.1%昌跌、0.2%仰禀,看看競品,也是差不多蚕愤,好像沒有太大區(qū)別。那么CPU消耗這么少是不是就不用管CPU了呢饺蚊,然而即使是平均值很小萍诱,但是長時間待機,例如安全類工具污呼,CPU的消耗還是不容忽視裕坊。
這種場景下我們測試時常用的單位有:消耗XX jiffies/分鐘;半/1小時共增加XX jiffies燕酷。

2.在運行一些應(yīng)用的情況下籍凝,cpu已占50%的情況下,觀察應(yīng)用程序占用cpu的情況

簡單說這種情況就是后臺已經(jīng)有幾個應(yīng)用在運行已經(jīng)并且消耗了系統(tǒng)的一些資源的情況下進行測試苗缩。

3.在高負(fù)荷的情況下看CPU的表現(xiàn)饵蒂,我定義這個高負(fù)荷,cpu占用應(yīng)是在80%以上

滿規(guī)格狀態(tài)下的應(yīng)用CPU消耗情況

4.觀察App 相同/不同場景下CPU走勢酱讶、峰值情況

對比不同場景頁面CPU占用大小
對比不同時間段同一場景頁面CPU占用走勢情況

3退盯、XX銀行性能評測-CPU測試結(jié)果分析

3.1 總覽

此次質(zhì)量開放平臺-評測中心(http://fit-stg1.jryzt.com/Hyperion-server/html/index.html)的性能測試的采集的CPU占用數(shù)據(jù)主要是針對場景頁面的CPU占用測試,CPU占用數(shù)據(jù)獲取原理是CPU執(zhí)行非系統(tǒng)空閑進程的時間 / CPU總的執(zhí)行時間泻肯。

從CPU消耗對比來看渊迁,行業(yè)競品均值為8.4%,90分位約4.9%灶挟,75分位約7.8%琉朽,中位數(shù)約9.3%,25分位約16.2%稚铣。


CPU占用對比.png

【榕商Bank】和10家競品分析對比箱叁,CPU占用12.0%,表現(xiàn)較差榛泛,不及行業(yè)平均水準(zhǔn)蝌蹂。但是從APP本品各場景CPU占用率來看,占用率最大的為理財產(chǎn)品詳情頁22.7%曹锨,主要原因是該頁面存在6個不同時段近七日和萬份收益率曲線走勢圖繪制孤个,但是仍然未超過CPU占用率基線30%,且目前大部分手機是四核沛简、八核系統(tǒng)齐鲤,所以目前測試數(shù)據(jù)表明整體表現(xiàn)良好不存在瓶頸斥废,但是從行業(yè)標(biāo)準(zhǔn)來看,理財產(chǎn)品詳情頁仍然有優(yōu)化空間给郊,建議優(yōu)化牡肉。


理財產(chǎn)品詳情頁性能曲線.png

4、App端CPU問題排查思路:

(1)是否有非常多的網(wǎng)絡(luò)請求
(2)是否開了很多進程OR 應(yīng)用淆九,嘗試關(guān)閉其他應(yīng)用再查看CPU是否降下來
(3)是否有大量大圖片统锤、視頻處理跟加載或布局
(4)查找程序中有沒有特殊布局或者特殊操作(GPS定位,一直刷新類的服務(wù)等)炭庙,特殊加載(Gif圖片加載饲窿,視頻,音頻加載等)
(5)當(dāng)前頁面是否有過多的圖表焕蹄、曲線圖等繪制操作
(6)通過Android Studio 自帶的monitor查找是哪個Activity或者哪個方法有一直不停止的運算消耗CPU(比如:不停止的while 或者for 循環(huán))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逾雄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子腻脏,更是在濱河造成了極大的恐慌鸦泳,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件永品,死亡現(xiàn)場離奇詭異做鹰,居然都是意外死亡,警方通過查閱死者的電腦和手機腐碱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門誊垢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人症见,你說我怎么就攤上這事喂走。” “怎么了谋作?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵芋肠,是天一觀的道長。 經(jīng)常有香客問我遵蚜,道長帖池,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任吭净,我火速辦了婚禮睡汹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寂殉。我一直安慰自己囚巴,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著彤叉,像睡著了一般庶柿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秽浇,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天浮庐,我揣著相機與錄音,去河邊找鬼柬焕。 笑死审残,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斑举。 我是一名探鬼主播维苔,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼懂昂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起没宾,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凌彬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后循衰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铲敛,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年会钝,在試婚紗的時候發(fā)現(xiàn)自己被綠了伐蒋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡迁酸,死狀恐怖先鱼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奸鬓,我是刑警寧澤焙畔,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站串远,受9級特大地震影響宏多,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜澡罚,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一伸但、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧留搔,春花似錦更胖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽避归。三九已至,卻和暖如春管呵,著一層夾襖步出監(jiān)牢的瞬間梳毙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工捐下, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留账锹,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓坷襟,卻偏偏與公主長得像奸柬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容