Android Systrace 基礎(chǔ)知識(shí)(2) -- 分析 Systrace 預(yù)備知識(shí)

本文是 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)鍵信息

系列文章目錄

  1. Systrace 簡(jiǎn)介
  2. Systrace 基礎(chǔ)知識(shí) - Systrace 預(yù)備知識(shí)
  3. Systrace 基礎(chǔ)知識(shí) - Why 60 fps ?
  4. Systrace 基礎(chǔ)知識(shí) - SystemServer 解讀
  5. Systrace 基礎(chǔ)知識(shí) - SurfaceFlinger 解讀
  6. Systrace 基礎(chǔ)知識(shí) - Input 解讀
  7. Systrace 基礎(chǔ)知識(shí) - Vsync 解讀
  8. Systrace 基礎(chǔ)知識(shí) - Vsync-App :基于 Choreographer 的渲染機(jī)制詳解
  9. Systrace 基礎(chǔ)知識(shí) - MainThread 和 RenderThread 解讀
  10. Systrace 基礎(chǔ)知識(shí) - Binder 和鎖競(jìng)爭(zhēng)解讀
  11. Systrace 基礎(chǔ)知識(shí) - Triple Buffer 解讀
  12. 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. 1.是否頻率不夠?
  2. 2.是否跑在了小核上?
  3. 3.是否頻繁在 Running 和 Runnable 之間切換?為什么?
  4. 4.是否頻繁在 Running 和 Sleep 之間切換?為什么?
  5. 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ù):

    1. 是否后臺(tái)有太多的任務(wù)在跑?
    1. 沒(méi)有及時(shí)處理是因?yàn)轭l率太低?
    1. 沒(méi)有及時(shí)處理是因?yàn)楸幌拗频侥硞€(gè) cpuset 里面,但是 cpu 很滿?
    1. 此時(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)

  1. D 無(wú)法中斷的休眠狀態(tài)(通常 IO 的進(jìn)程);
  2. R 正在可運(yùn)行隊(duì)列中等待被調(diào)度的;
  3. S 處于休眠狀態(tài);
  4. T 停止或被追蹤;
  5. W 進(jìn)入內(nèi)存交換 (從內(nèi)核2.6開(kāi)始無(wú)效);
  6. X 死掉的進(jìn)程 (基本很少見(jiàn));
  7. Z 僵尸進(jìn)程;
  8. < 優(yōu)先級(jí)高的進(jìn)程
  9. N 優(yōu)先級(jí)較低的進(jìn)程
  10. L 有些頁(yè)被鎖進(jìn)內(nèi)存;
  11. s 進(jìn)程的領(lǐng)導(dǎo)者(在它之下有子進(jìn)程);
  12. 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)于我 && 博客

一個(gè)人可以走的更快 , 一群人可以走的更遠(yuǎn)

更多內(nèi)容可以進(jìn)入 Android Performance 查看

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容