大量追蹤記錄分析

使用 ProfilingManager 收集多個追蹤記錄後,逐一探索這些記錄來找出效能問題,就變得不切實際。大量追蹤記錄分析可讓您同時查詢追蹤記錄資料集,以便:

  • 找出常見的效能迴歸。
  • 計算統計分布 (例如 P50、P90、P99 延遲時間)。
  • 找出多個追蹤記錄的模式。
  • 找出異常追蹤記錄,瞭解及偵錯效能問題。

本節說明如何使用 Perfetto Python 批次追蹤記錄處理器,分析一組本機儲存追蹤記錄的啟動指標,並找出離群追蹤記錄,以便進一步分析。

設計查詢

執行大量分析的第一步是建立 PerfettoSQL 查詢。

在本節中,我們將提供一個範例查詢,用於測量應用程式啟動延遲時間。具體來說,您可以測量從 activityStart 到第一個產生的影格 (Choreographer#doFrame 切片首次出現) 的時間長度,以測量應用程式控制範圍內的應用程式啟動延遲時間。圖 1 顯示要查詢的部分。

追蹤記錄的時間軸檢視畫面,醒目顯示從 activityStart 事件到第一個 Choreographer#doFrame 事件的時間長度。
圖 1. 從「activityStart」到第一個影格生成之間的追蹤記錄區段。
CREATE OR REPLACE PERFETTO FUNCTION find_slices(pattern STRING) RETURNS
TABLE (name STRING, ts LONG, dur LONG) AS
SELECT name,ts,dur FROM slice WHERE name GLOB $pattern;

CREATE OR REPLACE PERFETTO FUNCTION generate_start_to_end_slices(startSlicePattern STRING, endSlicePattern STRING, inclusive BOOL) RETURNS
TABLE(name STRING, ts LONG, dur LONG) AS
SELECT name, ts, MIN(startToEndDur) as dur
FROM
  (SELECT S.name as name, S.ts as ts, E.ts + IIF($inclusive, E.dur, 0) - S.ts as startToEndDur
  FROM find_slices($startSlicePattern) as S CROSS JOIN find_slices($endSlicePattern) as E
  WHERE startToEndDur > 0)
GROUP BY name, ts;

SELECT ts,name,dur from generate_start_to_end_slices('activityStart','*Choreographer#doFrame [0-9]*', true)

您可以在 Perfetto UI 中執行查詢,然後使用查詢結果產生偵錯追蹤記錄 (圖 2),並在時間軸中以視覺化方式呈現 (圖 3)。

Perfetto UI 的螢幕截圖,顯示如何為啟動查詢建立偵錯追蹤記錄。
圖 2. 為啟動查詢建立偵錯追蹤記錄。
Perfetto UI 的時間軸檢視畫面,顯示為啟動查詢生成的偵錯追蹤記錄。
圖 3. 已為啟動查詢產生偵錯追蹤記錄。

設定 Python 環境

在本機電腦上安裝 Python 和必要程式庫:

pip install perfetto pandas plotly

建立大量追蹤記錄分析指令碼

下列指令碼範例使用 Perfetto 的 Python BatchTraceProcessor,在多個追蹤記錄中執行查詢。

from perfetto.batch_trace_processor import BatchTraceProcessor
import glob
import plotly.express as px

# Collect all trace files in the local directory
traces = glob.glob('*.perfetto-trace')

if not traces:
    print("No .perfetto-trace files found in the current directory.")
    exit(1)

if __name__ == '__main__':
    # Process all traces in parallel to aggregate metrics across runs
    with BatchTraceProcessor(traces) as btp:
        query = """
        CREATE OR REPLACE PERFETTO FUNCTION find_slices(pattern STRING) RETURNS
        TABLE (name STRING, ts LONG, dur LONG) AS
        SELECT name,ts,dur FROM slice WHERE name GLOB $pattern;

        CREATE OR REPLACE PERFETTO FUNCTION generate_start_to_end_slices(startSlicePattern STRING, endSlicePattern STRING, inclusive BOOL) RETURNS
        TABLE(name STRING, ts LONG, dur LONG) AS
        SELECT name, ts, MIN(startToEndDur) as dur
        FROM
          (SELECT S.name as name, S.ts as ts, E.ts + IIF($inclusive, E.dur, 0) - S.ts as startToEndDur
          FROM find_slices($startSlicePattern) as S CROSS JOIN find_slices($endSlicePattern) as E
          WHERE startToEndDur > 0)
        GROUP BY name, ts;

        SELECT ts,name,dur / 1000000 as dur_ms from generate_start_to_end_slices('activityStart','*Choreographer#doFrame [0-9]*', true)
        """
        df = btp.query_and_flatten(query)
        # Plot the distribution of startup times, tracking trace file paths on
        # hover
        violin = px.violin(df, x='dur_ms', hover_data='_path', title='startup time', points='all')
        violin.show()

瞭解指令碼

執行 Python 指令碼時,系統會執行下列動作:

  1. 指令碼會在本機目錄中搜尋所有後置字串為 .perfetto-trace 的 Perfetto 追蹤記錄,並將這些記錄做為分析的來源追蹤記錄。
  2. 這項工具會執行大量追蹤記錄查詢,計算啟動時間的子集,也就是從 activityStart 追蹤記錄切片到應用程式產生第一個影格的時間。
  3. 系統會使用小提琴圖繪製延遲時間 (以毫秒為單位),以視覺化方式呈現啟動時間分布情形。

解讀結果

小提琴圖:顯示查詢的啟動延遲時間分布情形。
圖 4. 查詢啟動延遲時間的小提琴圖。

執行指令碼後,指令碼會產生圖表。在這種情況下,圖表會顯示雙峰分布,有兩個明顯的峰值 (圖 4)。

接著,找出兩個母體之間的差異。這有助於您更詳細地檢查個別追蹤記錄。在這個範例中,圖表設定為將滑鼠游標懸停在資料點 (延遲時間) 上時,即可識別追蹤記錄檔案名稱。接著,您可以開啟高延遲群組中的其中一個追蹤記錄。

開啟高延遲群組的追蹤記錄 (圖 5) 時,您會看到啟動期間執行的額外配量,名為 MyFlaggedFeature (圖 6)。相反地,從延遲時間較低的母體 (最左側的峰值) 選取追蹤記錄,可確認沒有該配量 (圖 7)。這項比較結果顯示,為部分使用者啟用的特定功能旗標會觸發迴歸。

醒目顯示高延遲追蹤記錄的圖表。
圖 5. 小提琴圖中的高延遲資料點。
追蹤記錄,醒目顯示因 MyFlaggedFeature 切片而導致的高延遲啟動。
圖 6:高延遲追蹤記錄啟動,並額外顯示「MyFlaggedFeature」配量。
追蹤記錄,醒目顯示不含 MyFlaggedFeature 切片的低延遲啟動。
圖 7. 低延遲追蹤啟動。

這個範例說明如何使用大量追蹤分析,其他用途包括從欄位中擷取統計資料來評估影響、偵測迴歸等。