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

本文是 Systrace 系列文章的第二篇,主要是講解一些分析 Systrace 的預備知識, 有了這些預備知識, 分析 Systrace 纔會事半功倍, 更快也更有效率地找到問題點.linux

本文介紹瞭如何查看 Systrace 中的線程狀態 , 如何對進程的喚醒信息進行分析, 如何解讀信息區的數據, 以及介紹了經常使用的快捷鍵. 經過本篇文章的學習, 相信你能夠掌握進程和線程相關的一些信息, 也知道如何查看複雜的 Systrace 中包含的關鍵信息android

系列文章目錄

  1. Systrace 簡介
  2. Systrace 基礎知識 - Systrace 預備知識
  3. Systrace 基礎知識 - Why 60 fps ?
  4. Systrace 基礎知識 - SystemServer 解讀
  5. Systrace 基礎知識 - SurfaceFlinger 解讀
  6. Systrace 基礎知識 - Input 解讀
  7. Systrace 基礎知識 - Vsync 解讀
  8. Systrace 基礎知識 - MainThread 和 RenderThread 解讀
  9. Systrace 基礎知識 - Triple Buffer 解讀
  10. Systrace 基礎知識 - CPU Info 解讀
  11. Systrace 實戰 - 分析應用冷啓動時間問題
  12. Systrace 實戰 - 分析應用熱啓動時間問題
  13. Systrace 實戰 - 分析列表卡頓問題
  14. Systrace 實戰 - 分析窗口動畫卡頓問題
  15. Systrace 實戰 - 分析進程亂跑致使的性能問題
  16. Systrace 實戰 - 分析 IO 致使的性能問題
  17. Systrace 實戰 - 分析 Memory 致使的性能問題
  18. Systrace 實戰 - Systrace 與 MethodTrace 結合使用
  19. Systrace 實戰 - 分析硬件加速問題

正文

線程狀態查看

Systrace 會用不一樣的顏色來標識不一樣的線程狀態, 在每一個方法上面都會有對應的線程狀態來標識目前線程所處的狀態.
經過查看線程狀態咱們能夠知道目前的瓶頸是什麼, 是 CPU 執行慢仍是由於 Binder 調用, 又或是進行 IO 操做, 又或是拿不到 CPU 時間片函數

線程狀態主要有下面幾個性能

綠色 : 運行中

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

做用:咱們常常會查看 Running 狀態的線程,查看其運行的時間,與競品作對比,分析快或者慢的緣由:動畫

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

藍色 : 可運行

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

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

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

白色 : 休眠中

線程沒有工做要作,多是由於線程在互斥鎖上被阻塞。orm

做用 : 這裏通常是在等事件驅動
cdn

橘色 : 不可中斷的睡眠態

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

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

紫色 : 可中斷的睡眠態

線程在另外一個內核操做(一般是內存管理)上被阻塞。

做用:通常是陷入了內核態,有些狀況下是正常的,有些狀況下是不正常的,須要按照具體的狀況取分析

進程喚醒信息分析

Systrace 會標識出一個很是有用的信息,能夠幫助咱們進行跨進程調用相關的分析。

一個進程被喚醒的信息每每比較重要,知道他被誰喚醒,那麼咱們也就知道了他們之間的調用等待關係,若是出現一段比較長的 sleep 狀況,而後被喚醒,那麼咱們就能夠去看是誰喚醒了這個線程,對應的就能夠查看喚醒者的信息,看看爲何喚醒者這麼晚才喚醒。

一個常見的狀況是:應用進程使用 Binder 與 SystemServer 的 AMS 線程進行通訊,可是剛好 AMS 的這個函數正在等待鎖釋放(或者這個函數自己執行時間很長),那麼應用進程就須要等待比較長的時間,若是剛好是應用進程的主線程在進行等待,那麼就會出現性能問題,好比響應慢或者卡頓,這就是爲何後臺有大量的進程在運行,或者跑完 Monkey 以後,整機性能會降低的一個主要緣由。

Systrace 能夠標示出這個的一個緣由是,一個任務在進入 Running 狀態以前,會先進入 Runnable 狀態進行等待,而 Systrace 會把這個狀態也標示在 Systrace 上(很是短,須要放大進行看)

拉到最上面查看對應的 cpu 上的 taks 信息,會標識這個 task 在被喚醒以前的狀態:

順便貼一下 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 預備知識

關於我

小廠系統研發工程師 , 更多信息能夠點擊 關於我 , 很是但願和你們一塊兒交流 , 共同進步 .

一我的能夠走的更快 , 一羣人能夠走的更遠

相關文章
相關標籤/搜索