אחרי שאוספים עקבות רבים באמצעות ProfilingManager, כבר לא מעשי לבדוק אותם בנפרד כדי למצוא בעיות בביצועים. ניתוח של עקבות רבים בבת אחת מאפשר לכם להשתמש במערך הנתונים כדי:
- לזהות ירידות נפוצות בביצועים.
- לחשב התפלגויות סטטיסטיות (לדוגמה, זמן טעינה P50, P90, P99).
- לזהות דפוסים.
- לאתר עקבות חריגים כדי להבין בעיות בביצועים ולנפות באגים.
בקטע הזה מוסבר איך להשתמש ב-Perfetto Python Batch Trace Processor כדי לנתח מדדי הפעלה בקבוצה של דוחות קריסות שמאוחסנים באופן מקומי, ולאתר דוחות קריסות חריגים לניתוח מעמיק יותר.
עיצוב השאילתה
קודם כל, יוצרים שאילתת PerfettoSQL שמחלצת את המדד שרוצים להשוות.
בדוגמה הבאה נמדד זמן הטעינה שנמצא בשליטת האפליקציה, מ-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 ואז להשתמש בתוצאות כדי ליצור רצועת ניפוי באגים (איור 2) ולהציג אותה בציר הזמן (איור 3).
הגדרת סביבת Python
מתקינים את Python במחשב המקומי ואת הספריות הנדרשות:
pip install perfetto pandas plotly
יצירת הסקריפט לניתוח מעקב בכמות גדולה
הסקריפט לדוגמה הבא מריץ את השאילתה בכמה מעקבים באמצעות BatchTraceProcessor של Perfetto.
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, הוא מבצע את הפעולות הבאות:
- הסקריפט מחפש בספרייה המקומית את כל קובצי המעקב של Perfetto עם הסיומת
.perfetto-traceומשתמש בהם כקובצי מעקב של מקורות לניתוח. - הכלי מריץ שאילתת מעקב בכמות גדולה שמחשבת את קבוצת המשנה של זמן ההפעלה שמתאימה לזמן מהפרוסה
activityStartועד לפריימים הראשונים שנוצרו על ידי האפליקציה. - הוא משרטט את זמן הטעינה באלפיות שנייה באמצעות תרשים כינור כדי להציג את פיזור זמני ההפעלה.
איך לפרש את התוצאות
הפעלת הסקריפט יוצרת תרשים כינור שמציג התפלגות דו-מודאלית עם שני שיאים נפרדים של זמן אחזור (איור 4). להציב את הסמן מעל נקודות על הגרף ספציפיות בתרשים כדי לבדוק את שם הקובץ של _path ולהשוות בין נתוני מעקב מכל שיא (איור 5):
- עקבות עם זמן טעינה ארוך (השיא הימני): כשפותחים עקבות מהקבוצה הזו בממשק המשתמש של Perfetto, רואים פרוסה נוספת של
MyFlaggedFeatureשפועלת במהלך ההפעלה (איור 6). - עקבות עם זמן אחזור נמוך (השיא השמאלי): פתיחת עקבות מהקבוצה המהירה יותר מאשרת ש-
MyFlaggedFeatureלא קיים (איור 7), מה שמצביע על כך ש-feature flag שהופעל עבור קבוצת משנה של משתמשים גרם לרגרסיה בהפעלה.
MyFlaggedFeature נוספת.
בדוגמה הזו רואים דרך אחת להשתמש בניתוח עקבות בכמות גדולה. תרחישי שימוש נוספים כוללים הפקה של נתונים סטטיסטיים מהשדה כדי לאמוד את ההשפעה, לזהות רגרסיות ועוד.