本文是 Systrace 系列文章的第二篇,主要是講解一些分析 Systrace 的預備知識, 有了這些預備知識, 分析 Systrace 纔會事半功倍, 更快也更有效率地找到問題點.
本文介紹瞭如何查看 Systrace 中的線程狀態 , 如何對進程的喚醒信息進行分析, 如何解讀信息區的數據, 以及介紹了常用的快捷鍵. 通過本篇文章的學習, 相信你可以掌握進程和線程相關的一些信息, 也知道如何查看複雜的 Systrace 中包含的關鍵信息
系列文章目錄
- Systrace 簡介
- Systrace 基礎知識 - Systrace 預備知識
- Systrace 基礎知識 - Why 60 fps ?
- Systrace 基礎知識 - SystemServer 解讀
- Systrace 基礎知識 - SurfaceFlinger 解讀
- Systrace 基礎知識 - Input 解讀
- Systrace 基礎知識 - Vsync 解讀
- Systrace 基礎知識 - Vsync-App :基於 Choreographer 的渲染機制詳解
- Systrace 基礎知識 - MainThread 和 RenderThread 解讀
- Systrace 基礎知識 - Binder 和鎖競爭解讀
- Systrace 基礎知識 - Triple Buffer 解讀
- Systrace 基礎知識 - CPU Info 解讀
正文
線程狀態查看
Systrace 會用不同的顏色來標識不同的線程狀態, 在每個方法上面都會有對應的線程狀態來標識目前線程所處的狀態.
通過查看線程狀態我們可以知道目前的瓶頸是什麼, 是 CPU 執行慢還是因爲 Binder 調用, 又或是進行 IO 操作, 又或是拿不到 CPU 時間片
線程狀態主要有下面幾個
綠色 : 運行中
只有在該狀態的進程纔可能在CPU上運行。而同一時刻可能有多個進程處於可執行狀態,這些進程的task_struct結構(進程控制塊)被放入對應CPU的可執行隊列中(一個進程最多隻能出現在一個CPU的可執行隊列中)。進程調度器的任務就是從各個CPU的可執行隊列中分別選擇一個進程在該CPU上運行。
作用:我們經常會查看 Running 狀態的線程,查看其運行的時間,與競品做對比,分析快或者慢的原因:
- 是否頻率不夠?
- 是否跑在了小核上?
- 是否頻繁在 Running 和 Runnable 之間切換?爲什麼?
- 是否頻繁在 Running 和 Sleep 之間切換?爲什麼?
- 是否跑在了不該跑的核上面?比如不重要的線程佔用了超大核
藍色 : 可運行
線程可以運行但當前沒有安排,在等待 cpu 調度
作用:Runnable 狀態的線程狀態持續時間越長,則表示 cpu 的調度越忙,沒有及時處理到這個任務:
- 是否後臺有太多的任務在跑?
- 沒有及時處理是因爲頻率太低?
- 沒有及時處理是因爲被限制到某個 cpuset 裏面,但是 cpu 很滿?
- 此時 Running 的任務是什麼?爲什麼?
白色 : 休眠中
線程沒有工作要做,可能是因爲線程在互斥鎖上被阻塞。
作用 : 這裏一般是在等事件驅動
橘色 : 不可中斷的睡眠態 IO Block
線程在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 在被喚醒之前的狀態:
![]https://www.androidperformance.com/images//15638916674736.jpg)
順便貼一下 Linux 常見的進程狀態
- D 無法中斷的休眠狀態(通常 IO 的進程);
- R 正在可運行隊列中等待被調度的;
- S 處於休眠狀態;
- T 停止或被追蹤;
- W 進入內存交換 (從內核2.6開始無效);
- X 死掉的進程 (基本很少見);
- Z 殭屍進程;
- < 優先級高的進程
- N 優先級較低的進程
- L 有些頁被鎖進內存;
- s 進程的領導者(在它之下有子進程);
- 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 預備知識
關於我 && 博客
- 關於我 , 非常希望和大家一起交流 , 共同進步 .
- 博客內容導航
- 優秀博客文章記錄 - Android 性能優化必知必會
一個人可以走的更快 , 一羣人可以走的更遠
更多內容可以進入 Android Performance 查看