本文是 Systrace 系列文章的第二篇,主要是講解一些分析 Systrace 的預(yù)備知識(shí), 有了這些預(yù)備知識(shí), 分析 Systrace 才會(huì)事半功倍, 更快也更有效率地找到問(wèn)題點(diǎn).
本文介紹了如何查看 Systrace 中的線程狀態(tài) , 如何對(duì)進(jìn)程的喚醒信息進(jìn)行分析, 如何解讀信息區(qū)的數(shù)據(jù), 以及介紹了常用的快捷鍵. 通過(guò)本篇文章的學(xué)習(xí), 相信你可以掌握進(jìn)程和線程相關(guān)的一些信息, 也知道如何查看復(fù)雜的 Systrace 中包含的關(guān)鍵信息
系列文章目錄
- Systrace 簡(jiǎn)介
- Systrace 基礎(chǔ)知識(shí) - Systrace 預(yù)備知識(shí)
- Systrace 基礎(chǔ)知識(shí) - Why 60 fps ?
- Systrace 基礎(chǔ)知識(shí) - SystemServer 解讀
- Systrace 基礎(chǔ)知識(shí) - SurfaceFlinger 解讀
- Systrace 基礎(chǔ)知識(shí) - Input 解讀
- Systrace 基礎(chǔ)知識(shí) - Vsync 解讀
- Systrace 基礎(chǔ)知識(shí) - Vsync-App :基于 Choreographer 的渲染機(jī)制詳解
- Systrace 基礎(chǔ)知識(shí) - MainThread 和 RenderThread 解讀
- Systrace 基礎(chǔ)知識(shí) - Binder 和鎖競(jìng)爭(zhēng)解讀
- Systrace 基礎(chǔ)知識(shí) - Triple Buffer 解讀
- Systrace 基礎(chǔ)知識(shí) - CPU Info 解讀
正文
線程狀態(tài)查看
Systrace 會(huì)用不同的顏色來(lái)標(biāo)識(shí)不同的線程狀態(tài), 在每個(gè)方法上面都會(huì)有對(duì)應(yīng)的線程狀態(tài)來(lái)標(biāo)識(shí)目前線程所處的狀態(tài).
通過(guò)查看線程狀態(tài)我們可以知道目前的瓶頸是什么, 是 CPU 執(zhí)行慢還是因?yàn)?Binder 調(diào)用, 又或是進(jìn)行 IO 操作, 又或是拿不到 CPU 時(shí)間片
線程狀態(tài)主要有下面幾個(gè)
綠色 : 運(yùn)行中
只有在該狀態(tài)的進(jìn)程才可能在CPU上運(yùn)行。而同一時(shí)刻可能有多個(gè)進(jìn)程處于可執(zhí)行狀態(tài),這些進(jìn)程的task_struct結(jié)構(gòu)(進(jìn)程控制塊)被放入對(duì)應(yīng)CPU的可執(zhí)行隊(duì)列中(一個(gè)進(jìn)程最多只能出現(xiàn)在一個(gè)CPU的可執(zhí)行隊(duì)列中)。進(jìn)程調(diào)度器的任務(wù)就是從各個(gè)CPU的可執(zhí)行隊(duì)列中分別選擇一個(gè)進(jìn)程在該CPU上運(yùn)行。
作用:我們經(jīng)常會(huì)查看 Running 狀態(tài)的線程,查看其運(yùn)行的時(shí)間,與競(jìng)品做對(duì)比,分析快或者慢的原因:
- 1.是否頻率不夠?
- 2.是否跑在了小核上?
- 3.是否頻繁在 Running 和 Runnable 之間切換?為什么?
- 4.是否頻繁在 Running 和 Sleep 之間切換?為什么?
- 5.是否跑在了不該跑的核上面?比如不重要的線程占用了超大核
藍(lán)色 : 可運(yùn)行
線程可以運(yùn)行但當(dāng)前沒(méi)有安排,在等待 cpu 調(diào)度
作用:Runnable 狀態(tài)的線程狀態(tài)持續(xù)時(shí)間越長(zhǎng),則表示 cpu 的調(diào)度越忙,沒(méi)有及時(shí)處理到這個(gè)任務(wù):
- 是否后臺(tái)有太多的任務(wù)在跑?
- 沒(méi)有及時(shí)處理是因?yàn)轭l率太低?
- 沒(méi)有及時(shí)處理是因?yàn)楸幌拗频侥硞€(gè) cpuset 里面,但是 cpu 很滿?
- 此時(shí) Running 的任務(wù)是什么?為什么?
白色 : 休眠中
線程沒(méi)有工作要做,可能是因?yàn)榫€程在互斥鎖上被阻塞。
作用 : 這里一般是在等事件驅(qū)動(dòng)
橘色 : 不可中斷的睡眠態(tài) IO Block
線程在I / O上被阻塞或等待磁盤操作完成,一般底線都會(huì)標(biāo)識(shí)出此時(shí)的 callsite :wait_on_page_locked_killable
作用:這個(gè)一般是標(biāo)示 IO 操作慢,如果有大量的橘色不可中斷的睡眠態(tài)出現(xiàn),那么一般是由于進(jìn)入了低內(nèi)存狀態(tài),申請(qǐng)內(nèi)存的時(shí)候觸發(fā) pageFault, linux 系統(tǒng)的 page cache 鏈表中有時(shí)會(huì)出現(xiàn)一些還沒(méi)準(zhǔn)備好的 page(即還沒(méi)把磁盤中的內(nèi)容完全地讀出來(lái)) , 而正好此時(shí)用戶在訪問(wèn)這個(gè) page 時(shí)就會(huì)出現(xiàn) wait_on_page_locked_killable 阻塞了. 只有系統(tǒng)當(dāng) io 操作很繁忙時(shí), 每筆的 io 操作都需要等待排隊(duì)時(shí), 極其容易出現(xiàn)且阻塞的時(shí)間往往會(huì)比較長(zhǎng).
紫色 : 不可中斷的睡眠態(tài)
線程在另一個(gè)內(nèi)核操作(通常是內(nèi)存管理)上被阻塞。
作用:一般是陷入了內(nèi)核態(tài),有些情況下是正常的,有些情況下是不正常的,需要按照具體的情況去分析
進(jìn)程喚醒信息分析
Systrace 會(huì)標(biāo)識(shí)出一個(gè)非常有用的信息,可以幫助我們進(jìn)行跨進(jìn)程調(diào)用相關(guān)的分析。
一個(gè)進(jìn)程被喚醒的信息往往比較重要,知道他被誰(shuí)喚醒,那么我們也就知道了他們之間的調(diào)用等待關(guān)系,如果出現(xiàn)一段比較長(zhǎng)的 sleep 情況,然后被喚醒,那么我們就可以去看是誰(shuí)喚醒了這個(gè)線程,對(duì)應(yīng)的就可以查看喚醒者的信息,看看為什么喚醒者這么晚才喚醒。
一個(gè)常見(jiàn)的情況是:應(yīng)用進(jìn)程使用 Binder 與 SystemServer 的 AMS 線程進(jìn)行通信,但是恰好 AMS 的這個(gè)函數(shù)正在等待鎖釋放(或者這個(gè)函數(shù)本身執(zhí)行時(shí)間很長(zhǎng)),那么應(yīng)用進(jìn)程就需要等待比較長(zhǎng)的時(shí)間,如果恰好是應(yīng)用進(jìn)程的主線程在進(jìn)行等待,那么就會(huì)出現(xiàn)性能問(wèn)題,比如響應(yīng)慢或者卡頓,這就是為什么后臺(tái)有大量的進(jìn)程在運(yùn)行,或者跑完 Monkey 之后,整機(jī)性能會(huì)下降的一個(gè)主要原因。
Systrace 可以標(biāo)示出這個(gè)的一個(gè)原因是,一個(gè)任務(wù)在進(jìn)入 Running 狀態(tài)之前,會(huì)先進(jìn)入 Runnable 狀態(tài)進(jìn)行等待,而 Systrace 會(huì)把這個(gè)狀態(tài)也標(biāo)示在 Systrace 上(非常短,需要放大進(jìn)行看)
拉到最上面查看對(duì)應(yīng)的 cpu 上的 taks 信息,會(huì)標(biāo)識(shí)這個(gè) task 在被喚醒之前的狀態(tài):
![]https://www.androidperformance.com/images//15638916674736.jpg)
順便貼一下 Linux 常見(jiàn)的進(jìn)程狀態(tài)
- D 無(wú)法中斷的休眠狀態(tài)(通常 IO 的進(jìn)程);
- R 正在可運(yùn)行隊(duì)列中等待被調(diào)度的;
- S 處于休眠狀態(tài);
- T 停止或被追蹤;
- W 進(jìn)入內(nèi)存交換 (從內(nèi)核2.6開(kāi)始無(wú)效);
- X 死掉的進(jìn)程 (基本很少見(jiàn));
- Z 僵尸進(jìn)程;
- < 優(yōu)先級(jí)高的進(jìn)程
- N 優(yōu)先級(jí)較低的進(jìn)程
- L 有些頁(yè)被鎖進(jìn)內(nèi)存;
- s 進(jìn)程的領(lǐng)導(dǎo)者(在它之下有子進(jìn)程);
- l 多進(jìn)程的(使用 CLONE_THREAD, 類似 NPTL pthreads);
- 位于后臺(tái)的進(jìn)程組;
信息區(qū)數(shù)據(jù)解析
進(jìn)程狀態(tài)信息解析
函數(shù) Slice 信息解析
Counter Sample 信息解析
Async Slice 信息解析
CPU Slice 信息解析
User Expectation 信息解析
位于整個(gè) Systrace 最上面的部分,標(biāo)識(shí)了 Rendering Response 和 Input Response
快捷鍵使用
快捷鍵的使用可以加快查看 Systrace 的速度,下面是一些常用的快捷鍵
- W : 放大 Systrace , 放大可以更好地看清局部細(xì)節(jié)
- S : 縮小 Systrace, 縮小以查看整體
- A : 左移
- D : 右移
- M : 高亮選中當(dāng)前鼠標(biāo)點(diǎn)擊的段(這個(gè)比較常用,可以快速標(biāo)識(shí)出這個(gè)方法的左右邊界和執(zhí)行時(shí)間,方便上下查看)
鼠標(biāo)模式快捷切換 : 主要是針對(duì)鼠標(biāo)的工作模式進(jìn)行切換 , 默認(rèn)是 1 ,也就是選擇模式,查看 Systrace 的時(shí)候,需要經(jīng)常在各個(gè)模式之間切換 , 所以點(diǎn)擊切換模式效率比較低,直接用快捷鍵切換效率要高很多
- 數(shù)字鍵1 : 切換到 Selection 模式 , 這個(gè)模式下鼠標(biāo)可以點(diǎn)擊某一個(gè)段查看其詳細(xì)信息, 一般打開(kāi) Systrace 默認(rèn)就是這個(gè)模式 , 也是最常用的一個(gè)模式 , 配合 M 和 ASDW 可以做基本的操作
- 數(shù)字鍵2 : 切換到 Pan 模式 , 這個(gè)模式下長(zhǎng)按鼠標(biāo)可以左右拖動(dòng), 有時(shí)候會(huì)用到
- 數(shù)字鍵3 : 切換到 Zoom 模式 , 這個(gè)模式下長(zhǎng)按鼠標(biāo)可以放大和縮小, 有時(shí)候會(huì)用到
- 數(shù)字鍵4 : 切換到 Timing 模式 , 這個(gè)模式下主要是用來(lái)衡量時(shí)間的,比如選擇一個(gè)起點(diǎn), 選擇一個(gè)終點(diǎn), 查看起點(diǎn)和終點(diǎn)這中間的操作所花費(fèi)的時(shí)間.
本文知乎地址
由于博客留言交流不方便,點(diǎn)贊或者交流,可以移步本文的知乎界面
知乎 - Systrace 基礎(chǔ)知識(shí) -- 分析 Systrace 預(yù)備知識(shí)
掘金 - Systrace 基礎(chǔ)知識(shí) -- 分析 Systrace 預(yù)備知識(shí)
關(guān)于我 && 博客
- 關(guān)于我 , 非常希望和大家一起交流 , 共同進(jìn)步 .
一個(gè)人可以走的更快 , 一群人可以走的更遠(yuǎn)
更多內(nèi)容可以進(jìn)入 Android Performance 查看