Android Systrace 基礎知識(2) -- 分析 Systrace 預備知識

本文是 Systrace 系列文章的第二篇,主要是講解一些分析 Systrace 的預備知識, 有了這些預備知識, 分析 Systrace 纔會事半功倍, 更快也更有效率地找到問題點.
本文介紹瞭如何查看 Systrace 中的線程狀態 , 如何對進程的喚醒信息進行分析, 如何解讀信息區的數據, 以及介紹了常用的快捷鍵. 通過本篇文章的學習, 相信你可以掌握進程和線程相關的一些信息, 也知道如何查看複雜的 Systrace 中包含的關鍵信息

系列文章目錄

  1. Systrace 簡介
  2. Systrace 基礎知識 - Systrace 預備知識
  3. Systrace 基礎知識 - Why 60 fps ?
  4. Systrace 基礎知識 - SystemServer 解讀
  5. Systrace 基礎知識 - SurfaceFlinger 解讀
  6. Systrace 基礎知識 - Input 解讀
  7. Systrace 基礎知識 - Vsync 解讀
  8. Systrace 基礎知識 - Vsync-App :基於 Choreographer 的渲染機制詳解
  9. Systrace 基礎知識 - MainThread 和 RenderThread 解讀
  10. Systrace 基礎知識 - Binder 和鎖競爭解讀
  11. Systrace 基礎知識 - Triple Buffer 解讀
  12. Systrace 基礎知識 - CPU Info 解讀

正文

線程狀態查看

Systrace 會用不同的顏色來標識不同的線程狀態, 在每個方法上面都會有對應的線程狀態來標識目前線程所處的狀態.
通過查看線程狀態我們可以知道目前的瓶頸是什麼, 是 CPU 執行慢還是因爲 Binder 調用, 又或是進行 IO 操作, 又或是拿不到 CPU 時間片

線程狀態主要有下面幾個

綠色 : 運行中

只有在該狀態的進程纔可能在CPU上運行。而同一時刻可能有多個進程處於可執行狀態,這些進程的task_struct結構(進程控制塊)被放入對應CPU的可執行隊列中(一個進程最多隻能出現在一個CPU的可執行隊列中)。進程調度器的任務就是從各個CPU的可執行隊列中分別選擇一個進程在該CPU上運行。

作用:我們經常會查看 Running 狀態的線程,查看其運行的時間,與競品做對比,分析快或者慢的原因:

  1. 是否頻率不夠?
  2. 是否跑在了小核上?
  3. 是否頻繁在 Running 和 Runnable 之間切換?爲什麼?
  4. 是否頻繁在 Running 和 Sleep 之間切換?爲什麼?
  5. 是否跑在了不該跑的核上面?比如不重要的線程佔用了超大核

15638915926547

藍色 : 可運行

線程可以運行但當前沒有安排,在等待 cpu 調度

作用:Runnable 狀態的線程狀態持續時間越長,則表示 cpu 的調度越忙,沒有及時處理到這個任務:

  1. 是否後臺有太多的任務在跑?
  2. 沒有及時處理是因爲頻率太低?
  3. 沒有及時處理是因爲被限制到某個 cpuset 裏面,但是 cpu 很滿?
  4. 此時 Running 的任務是什麼?爲什麼?

image

白色 : 休眠中

線程沒有工作要做,可能是因爲線程在互斥鎖上被阻塞。

作用 : 這裏一般是在等事件驅動
image

橘色 : 不可中斷的睡眠態 IO Block

線程在I / O上被阻塞或等待磁盤操作完成,一般底線都會標識出此時的 callsite :wait_on_page_locked_killable

作用:這個一般是標示 IO 操作慢,如果有大量的橘色不可中斷的睡眠態出現,那麼一般是由於進入了低內存狀態,申請內存的時候觸發 pageFault, linux 系統的 page cache 鏈表中有時會出現一些還沒準備好的 page(即還沒把磁盤中的內容完全地讀出來) , 而正好此時用戶在訪問這個 page 時就會出現 wait_on_page_locked_killable 阻塞了. 只有系統當 io 操作很繁忙時, 每筆的 io 操作都需要等待排隊時, 極其容易出現且阻塞的時間往往會比較長.

image

紫色 : 不可中斷的睡眠態

線程在另一個內核操作(通常是內存管理)上被阻塞。

作用:一般是陷入了內核態,有些情況下是正常的,有些情況下是不正常的,需要按照具體的情況去分析
image

進程喚醒信息分析

Systrace 會標識出一個非常有用的信息,可以幫助我們進行跨進程調用相關的分析。

一個進程被喚醒的信息往往比較重要,知道他被誰喚醒,那麼我們也就知道了他們之間的調用等待關係,如果出現一段比較長的 sleep 情況,然後被喚醒,那麼我們就可以去看是誰喚醒了這個線程,對應的就可以查看喚醒者的信息,看看爲什麼喚醒者這麼晚才喚醒。

一個常見的情況是:應用進程使用 Binder 與 SystemServer 的 AMS 線程進行通信,但是恰好 AMS 的這個函數正在等待鎖釋放(或者這個函數本身執行時間很長),那麼應用進程就需要等待比較長的時間,如果恰好是應用進程的主線程在進行等待,那麼就會出現性能問題,比如響應慢或者卡頓,這就是爲什麼後臺有大量的進程在運行,或者跑完 Monkey 之後,整機性能會下降的一個主要原因。

Systrace 可以標示出這個的一個原因是,一個任務在進入 Running 狀態之前,會先進入 Runnable 狀態進行等待,而 Systrace 會把這個狀態也標示在 Systrace 上(非常短,需要放大進行看)

拉到最上面查看對應的 cpu 上的 taks 信息,會標識這個 task 在被喚醒之前的狀態:
![]https://www.androidperformance.com/images//15638916674736.jpg)

順便貼一下 Linux 常見的進程狀態

  1. D 無法中斷的休眠狀態(通常 IO 的進程);
  2. R 正在可運行隊列中等待被調度的;
  3. S 處於休眠狀態;
  4. T 停止或被追蹤;
  5. W 進入內存交換 (從內核2.6開始無效);
  6. X 死掉的進程 (基本很少見);
  7. Z 殭屍進程;
  8. < 優先級高的進程
  9. N 優先級較低的進程
  10. L 有些頁被鎖進內存;
  11. s 進程的領導者(在它之下有子進程);
  12. l 多進程的(使用 CLONE_THREAD, 類似 NPTL pthreads);
    • 位於後臺的進程組;

信息區數據解析

進程狀態信息解析

函數 Slice 信息解析

Counter Sample 信息解析

Async Slice 信息解析

CPU Slice 信息解析

User Expectation 信息解析

位於整個 Systrace 最上面的部分,標識了 Rendering Response 和 Input Response

快捷鍵使用

快捷鍵的使用可以加快查看 Systrace 的速度,下面是一些常用的快捷鍵

  • W : 放大 Systrace , 放大可以更好地看清局部細節
  • S : 縮小 Systrace, 縮小以查看整體
  • A : 左移
  • D : 右移
  • M : 高亮選中當前鼠標點擊的段(這個比較常用,可以快速標識出這個方法的左右邊界和執行時間,方便上下查看)

鼠標模式快捷切換 : 主要是針對鼠標的工作模式進行切換 , 默認是 1 ,也就是選擇模式,查看 Systrace 的時候,需要經常在各個模式之間切換 , 所以點擊切換模式效率比較低,直接用快捷鍵切換效率要高很多

  • 數字鍵1 : 切換到 Selection 模式 , 這個模式下鼠標可以點擊某一個段查看其詳細信息, 一般打開 Systrace 默認就是這個模式 , 也是最常用的一個模式 , 配合 M 和 ASDW 可以做基本的操作
  • 數字鍵2 : 切換到 Pan 模式 , 這個模式下長按鼠標可以左右拖動, 有時候會用到
  • 數字鍵3 : 切換到 Zoom 模式 , 這個模式下長按鼠標可以放大和縮小, 有時候會用到
  • 數字鍵4 : 切換到 Timing 模式 , 這個模式下主要是用來衡量時間的,比如選擇一個起點, 選擇一個終點, 查看起點和終點這中間的操作所花費的時間.

本文知乎地址

由於博客留言交流不方便,點贊或者交流,可以移步本文的知乎界面

知乎 - Systrace 基礎知識 – 分析 Systrace 預備知識

掘金 - Systrace 基礎知識 – 分析 Systrace 預備知識

關於我 && 博客

  1. 關於我 , 非常希望和大家一起交流 , 共同進步 .
  2. 博客內容導航
  3. 優秀博客文章記錄 - Android 性能優化必知必會

一個人可以走的更快 , 一羣人可以走的更遠

更多內容可以進入 Android Performance 查看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章