評估成效

使用 Simpleperf 評估裝置效能。Simpleperf 是原生剖析工具,適用於 Android 上的應用程式和原生程序。使用 CPU 分析器即時檢查應用程式的 CPU 使用情形和執行緒活動。

使用者可看到兩種效能指標:

  • 可預測的效能,使用者可明顯感受到。使用者介面是否會掉格,或持續以 60 FPS 的速度算繪畫面?音訊播放時是否沒有殘影或爆音?使用者觸控螢幕後,顯示器要過多久才會顯示效果?
  • 長時間作業所需的時間長度 (例如開啟應用程式)。

第一個比第二個更明顯。使用者通常會注意到卡頓,但除非並排比較兩部裝置,否則無法分辨 500 毫秒和 600 毫秒的應用程式啟動時間。觸控延遲時間會立即顯現,並大幅影響裝置的感知效能。

因此,在快速裝置中,除了維持 UI 管道運作所需的項目外,UI 管道是系統中最重要的項目。也就是說,UI 管道應優先處理流暢 UI 所需的任何其他工作。為維持流暢的 UI,如果可以執行 UI 工作,就必須延遲背景同步、通知傳送和類似工作。為了維持流暢的 UI,可以犧牲較長作業的效能 (例如 HDR+ 執行階段、應用程式啟動等)。

容量與抖動

考量裝置效能時,容量抖動是兩項有意義的指標。

容量

容量是指裝置在一段時間內擁有的某項資源總量。這可以是 CPU 資源、GPU 資源、I/O 資源、網路資源、記憶體頻寬或任何類似指標。檢查全系統效能時,抽象化個別元件並假設單一指標決定效能,可能會有幫助 (特別是在調整新裝置時,因為該裝置上執行的工作負載可能固定)。

系統容量會因線上運算資源而異。變更 CPU/GPU 頻率是變更容量的主要方式,但也有其他方式,例如變更線上 CPU 核心數量。因此,系統容量與耗電量相應;容量變更時,耗電量也會有類似的變化。

特定時間點所需容量絕大部分取決於正在執行的應用程式。因此,平台能調整特定工作負載所需容量的幅度不大,且只能透過執行階段改善 (Android 架構、ART、Bionic、GPU 編譯器/驅動程式、核心) 達成。

時基誤差

雖然工作負載所需的容量很容易判斷,但延遲抖動的概念較為模糊。如要瞭解抖動如何阻礙快速系統,建議閱讀「The Case of the Missing Supercomputer Performance: Achieving Optimal Performance on the 8,192 processors of ASCI Q」一文。(這項調查旨在瞭解 ASCI Q 超級電腦為何未達到預期效能,並介紹如何最佳化大型系統。)

本頁面使用「抖動」一詞,說明 ASCI Q 紙本文件所稱的「雜訊」。抖動是隨機的系統行為,會導致可察覺的工作無法執行。這類工作通常必須執行,但可能沒有嚴格的時間規定,因此會在任何特定時間執行。由於抖動是隨機發生,因此很難證明特定工作負載不存在抖動。此外,也很難證明已知抖動來源是導致特定效能問題的原因。最常使用的抖動原因診斷工具 (例如追蹤或記錄) 可能會產生自己的抖動。

在 Android 實際導入作業中,可能導致抖動的原因包括:

  • 排程器延遲
  • 中斷處理常式
  • 驅動程式程式碼執行時間過長,且停用先占或中斷
  • 長時間執行的軟中斷
  • 鎖定爭用 (應用程式、架構、核心驅動程式、繫結器鎖定、mmap 鎖定)
  • 檔案描述元爭用,其中優先順序較低的執行緒會保留檔案的鎖定,導致優先順序較高的執行緒無法執行
  • 在工作佇列中執行 UI 重要程式碼,導致程式碼延遲
  • CPU 閒置狀態轉換
  • 記錄
  • I/O 延遲
  • 建立不必要的程序 (例如 CONNECTIVITY_CHANGE 廣播)
  • 可用記憶體不足導致頁面快取輾轉現象

特定時段的延遲時間可能不會隨著容量增加而減少,也可能減少。舉例來說,如果驅動程式在等待從 i2c 匯流排讀取資料時停用中斷,無論 CPU 是 384 MHz 或 2 GHz,都會花費固定時間。如果涉及延遲,增加容量並非改善效能的可行解決方案。因此,在受到延遲限制的情況下,更快的處理器通常不會提升效能。

最後,與容量不同的是,時基誤差幾乎完全屬於系統供應商的領域。

記憶體用量

傳統上,記憶體消耗量是造成效能不佳的原因。雖然耗用本身不是效能問題,但可能會透過 lowmemorykiller 負荷、服務重新啟動和頁面快取輾轉現象,導致時基誤差。減少記憶體用量可以避免效能不佳的直接原因,但可能還有其他目標改善措施也能避免這些原因 (例如固定架構,防止架構在不久後分頁時分頁)。

分析初始裝置效能

從功能正常但效能不佳的系統著手,並嘗試透過個別使用者可見的效能不佳案例修正系統行為,並非明智之舉。因為效能不佳通常不容易重現 (即抖動) 或屬於應用程式問題,完整系統中的變數太多,因此這項策略無法有效發揮作用。因此,您很容易誤判原因,並在錯失系統性機會的情況下,僅做出微小的改善。

請改用下列一般方法啟動新裝置:

  1. 讓系統啟動至 UI,並執行所有驅動程式和一些基本頻率調控器設定 (如要變更頻率調控器設定,請重複執行下列所有步驟)。
  2. 請確保核心支援 sched_blocked_reason 追蹤點,以及顯示管道中的其他追蹤點,這些追蹤點會標示影格傳送到螢幕的時間。
  3. 執行輕量且一致的工作負載 (例如 UiBenchTouchLatency 中的球體測試),同時擷取整個 UI 管道的長時間追蹤記錄 (從透過 IRQ 接收輸入內容到最終掃描輸出)。
  4. 修正在輕量級且一致的工作負載中偵測到的掉格問題。
  5. 重複步驟 3 到 4,直到你每次都能以零掉格率執行 20 秒以上為止。
  6. 繼續處理其他使用者可見的卡頓來源。

在裝置啟動初期,您還可以執行下列簡單操作:

  • 確認核心是否具有 sched_blocked_reason 追蹤點修補程式。這個追蹤點會在 systrace 中啟用 sched 追蹤類別,並提供負責在該執行緒進入不中斷睡眠狀態時休眠的函式。因為不間斷的睡眠是抖動的常見指標,因此對成效分析至關重要。
  • 確認 GPU 和顯示管道的追蹤記錄充足。在近期的 Qualcomm SOC 上,可使用下列指令啟用追蹤點:
  • adb shell "echo 1 > /d/tracing/events/kgsl/enable"
    adb shell "echo 1 > /d/tracing/events/mdss/enable"
    

    執行 systrace 時,這些事件會保持啟用狀態,因此您可以在 mdss_fb0 區段中,查看追蹤記錄中顯示管道 (MDSS) 的額外資訊。在 Qualcomm SOC 上,標準系統追蹤檢視畫面不會顯示任何 GPU 的額外資訊,但結果會出現在追蹤記錄本身 (詳情請參閱「瞭解系統追蹤記錄」)。

    您希望這類顯示追蹤功能提供單一事件,直接指出影格已傳送至螢幕。從這裡,您可以判斷是否已成功達到影格時間;如果事件 Xn 在事件 Xn-1 之後不到 16.7 毫秒發生 (假設螢幕更新率為 60 Hz),則表示您沒有發生卡頓。如果 SOC 未提供這類信號,請與供應商合作取得信號。如果沒有明確的影格完成信號,就極難偵錯抖動問題。

使用合成基準

合成基準有助於確保裝置具備基本功能。不過,將基準視為裝置效能的替代指標並無意義。

根據 SOC 的經驗,SOC 之間合成基準測試效能的差異,與可察覺的 UI 效能 (掉格數、第 99 個百分位數的影格時間等) 差異並無關聯。合成基準僅為容量基準;延遲只會從基準的大量作業中竊取時間,進而影響這些基準的測量效能。因此,合成基準分數大多與使用者感受到的效能無關。

假設有兩個 SOC 執行 Benchmark X,可顯示 1000 個 UI 影格,並回報總顯示時間 (分數越低越好)。

  • SOC 1 會以 10 毫秒轉譯 Benchmark X 的每個影格,並獲得 10,000 分。
  • SOC 2 會在 1 毫秒內顯示 99% 的影格,但 1% 的影格則需要 100 毫秒,因此得分為 19,900 分,大幅優於 SOC 1。

如果基準測試結果能反映實際 UI 效能,SOC 2 就無法使用。假設刷新率為 60 Hz,SOC 2 每運作 1.5 秒就會出現影格延遲。同時,SOC 1 (根據 Benchmark X 較慢的 SOC) 會完全流暢。

使用錯誤報告

錯誤報告有時可用於效能分析,但由於這類報告非常龐大,因此很少用於偵錯偶發的抖動問題。這些記錄檔可能會提供系統在特定時間執行的作業相關提示,特別是如果卡頓發生在應用程式轉換期間 (這會記錄在錯誤報告中)。錯誤報告也能指出系統何時發生更廣泛的問題,可能導致有效容量減少 (例如熱能管理機制或記憶體片段化)。

使用 TouchLatency

TouchLatency 是 Pixel 和 Pixel XL 偏好的週期性工作負載,許多不良行為的例子都來自於此。這項工具位於 frameworks/base/tests/TouchLatency,提供兩種模式:觸控延遲和彈跳球 (如要切換模式,請按一下右上角的按鈕)。

彈跳球測試非常簡單:無論使用者輸入什麼內容,球都會在畫面上不斷彈跳。這通常也是難完美執行的測試,但越接近無掉格執行,裝置效能就越好。彈跳球測試很困難,因為這是微不足道但完全一致的工作負載,以極低的時脈執行 (這假設裝置有頻率調控器;如果裝置改為以固定時脈執行,請在第一次執行彈跳球測試時,將 CPU/GPU 時脈調降至接近最低值)。隨著系統進入閒置狀態,時脈也逐漸降低,每個影格所需的 CPU/GPU 時間就會增加。您可以觀看球體並查看畫面抖動情形,也可以在系統追蹤記錄中查看錯過的影格。

由於工作負載非常一致,因此與大多數使用者可見的工作負載相比,您更容易找出大多數的抖動來源,方法是追蹤每個遺失影格期間系統上執行的確切項目,而不是 UI 管道。時脈越低,就越可能因任何抖動而導致影格遺失,進而放大抖動的影響。因此,TouchLatency 越接近 60 FPS,就越不可能發生導致大型應用程式中出現間歇性、難以重現的卡頓問題。

由於時脈速度通常 (但並非一律) 不會影響抖動,因此請使用以極低時脈執行的測試來診斷抖動,原因如下:

  • 並非所有抖動都與時脈速度無關,許多來源只會耗用 CPU 時間。
  • 調控器應會降低時脈,讓平均影格時間接近期限,因此執行非 UI 工作的時間可能會超過期限,導致影格遭到捨棄。