使用 ProfilingManager 收集多個追蹤記錄後,逐一檢查這些記錄來找出效能問題就變得不切實際。大量追蹤分析功能可讓您同時查詢追蹤資料集,以便:
- 找出常見的效能迴歸問題。
- 計算統計分布情形 (例如 P50、P90、P99 延遲時間)。
- 找出多個追蹤記錄的模式。
- 找出離群追蹤記錄,瞭解及偵錯效能問題。
本節說明如何使用 Perfetto Python 批次追蹤記錄處理器,分析一組本機儲存的追蹤記錄中的啟動指標,並找出離群值追蹤記錄,以進行更深入的分析。
設計查詢
如要執行大量分析,首先要建立 PerfettoSQL 查詢。
在本節中,我們將提供一個查詢範例,用來測量應用程式啟動延遲時間。具體來說,您可以測量從 activityStart 到產生第一個影格 (第一次出現 Choreographer#doFrame 切片) 的時間長度,藉此測量應用程式啟動延遲,這項指標在您的應用程式控制範圍內。圖 1 顯示要查詢的部分。
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)。
設定 Python 環境
在本機電腦上安裝 Python 和必要程式庫:
pip install perfetto pandas plotly
建立大量追蹤記錄分析指令碼
下列範例指令碼會使用 Perfetto 的 Python BatchTraceProcessor,在多個追蹤記錄中執行查詢。
from perfetto.batch_trace_processor import BatchTraceProcessor
import glob
import plotly.express as px
traces = glob.glob('*.perfetto-trace')
if __name__ == '__main__':
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)
violin = px.violin(df, x='dur_ms', hover_data='_path', title='startup time', points='all')
violin.show()
瞭解指令碼
執行 Python 指令碼時,系統會執行下列動作:
- 這個指令碼會在您的本機目錄中搜尋所有以
.perfetto-trace為後置字元的 Perfetto 追蹤記錄,並將這些記錄做為分析的來源追蹤記錄。 - 這項查詢會執行大量追蹤作業,計算與啟動時間子集對應的時間,也就是從
activityStart追蹤記錄切片到應用程式產生的第一個影格。 - 系統會使用小提琴圖繪製延遲時間 (以毫秒為單位),以視覺化方式呈現啟動時間的分布情形。
解讀結果
執行指令碼後,指令碼會產生繪圖。在本例中,圖表顯示雙峰分布,有兩個明顯的峰值 (圖 4)。
接著,找出這兩個母體的差異。這有助於您更詳細地檢查個別追蹤記錄。在本例中,圖表已設定完畢,因此當您將游標懸停在資料點 (延遲時間) 上時,可以識別追蹤檔案名稱。接著,您可以開啟屬於高延遲群組的其中一個追蹤記錄。
從高延遲群組開啟追蹤記錄時 (圖 5),您會發現啟動期間執行的額外切片,名為 MyFlaggedFeature (圖 6)。反之,從低延遲群體 (最左側的尖峰) 選取追蹤記錄,即可確認缺少相同切片 (圖 7)。這項比較結果指出,為部分使用者啟用的特定功能標記會觸發迴歸。
這個範例說明如何使用大量追蹤記錄分析,這只是其中一種方式。其他用途包括從欄位中擷取統計資料來評估影響、偵測迴歸等。