تجزیه‌وتحلیل ردیابی انبوه

وقتی چندین ردیابی را بااستفاده از ProfilingManager جمع‌آوری کردید، کاوش کردن آن‌ها به‌صورت جداگانه برای پیدا کردن مشکلات عملکرد غیرعملی می‌شود. تجزیه‌وتحلیل ردیابی انبوه به شما امکان می‌دهد به‌طور هم‌زمان از مجموعه داده‌ای از ردیابی‌ها پُرسمان کنید تا:

  • پسرفت‌های عملکردی رایج را شناسایی کنید.
  • محاسبه توزیع‌های آماری (برای مثال، تأخیر P50،‏ P90،‏ P99).
  • الگوها را در چندین ردیابی پیدا کنید.
  • ردیابی‌های پرت را برای درک و اشکال‌زدایی مشکلات عملکرد پیدا کنید.

این بخش نشان می‌دهد که چگونه از پردازشگر ردیابی دسته‌ای Perfetto Python برای تجزیه‌وتحلیل سنجه‌های راه‌اندازی در مجموعه‌ای از ردیابی‌های ذخیره‌شده محلی و یافتن ردیابی‌های پرت برای تجزیه‌وتحلیل عمیق‌تر استفاده کنید.

طراحی کردن پُرسمان

اولین قدم برای انجام تجزیه‌وتحلیل انبوه، ایجاد پُرسمان PerfettoSQL است.

در این بخش، نمونه پُرسمانی را ارائه می‌دهیم که تأخیر راه‌اندازی برنامه را اندازه‌گیری می‌کند. به‌طور مشخص، می‌توانید مدت‌زمان از activityStart تا اولین فریم تولیدشده (اولین رخداد برش Choreographer#doFrame) را اندازه‌گیری کنید تا تأخیر راه‌اندازی برنامه را که تحت کنترل برنامه‌تان است اندازه‌گیری کنید. شکل ۱ بخش موردنظر برای پرسمان را نشان می‌دهد.

نمای خط زمان ردیابی، که مدت‌زمان از رویداد activityStart تا اولین رویداد Choreographer#doFrame را برجسته می‌کند.
شکل ۱. بخش ردیابی از `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 اجرا کنید و سپس از نتایج پُرسمان برای تولید قطعه اشکال‌زدایی (شکل ۲) و تجسم آن در خط زمان (شکل ۳) استفاده کنید.

نماگرفتی از واسط کاربر Perfetto که نحوه ایجاد قطعه اشکال‌زدایی برای پُرسمان راه‌اندازی را نشان می‌دهد.
شکل ۲. دسته هدف اشکال‌زدایی برای پُرسمان راه‌اندازی ایجاد کنید.
نمای خط زمان در واسط کاربر Perfetto که قطعه اشکال‌زدایی تولیدشده برای پُرسمان راه‌اندازی را نشان می‌دهد.
شکل ۳. قطعه اشکال‌زدایی برای پُرسمان راه‌اندازی تولید شد.

راه‌اندازی محیط 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 با پسوند .perfetto-trace جستجو می‌کند و از آن‌ها به‌عنوان ردگیری‌های منبع برای تجزیه‌وتحلیل استفاده می‌کند.
  2. این سنجه پُرسمان ردیابی انبوهی را اجرا می‌کند که زیرمجموعه زمان راه‌اندازی را محاسبه می‌کند. این زیرمجموعه با زمان بین برش ردیابی activityStart تا اولین قابی که برنامه‌تان تولید می‌کند مطابقت دارد.
  3. این ابزار تأخیر را برحسب میلی‌ثانیه بااستفاده از نمودار ویولنی ترسیم می‌کند تا توزیع زمان‌های راه‌اندازی را تجسم کند.

تفسیر کردن نتایج

نمودار ویولنی که توزیع تأخیرهای راه‌اندازی پرس‌وجوشده را نشان می‌دهد.
شکل ۴. نمودار ویولنی تأخیرهای راه‌اندازی پرسمان‌شده.

پس‌از اجرای دستورات، دستورات طرحی را تولید می‌کند. در این مورد، نمودار توزیع دومدی با دو قله متمایز را نشان می‌دهد (شکل ۴).

سپس، تفاوت بین دو جامعه را پیدا کنید. این کار به شما کمک می‌کند ردیابی‌های تکی را با جزئیات بیشتر بررسی کنید. در این مثال، نمودار به‌گونه‌ای تنظیم شده است که وقتی نشانگر را روی نقاط داده (تأخیرها) نگه می‌دارید، می‌توانید نام فایل‌های ردیابی را شناسایی کنید. سپس می‌توانید یکی از ردیابی‌هایی را که بخشی از گروه تأخیر بالا است باز کنید.

وقتی ردیابی را از گروه تأخیر بالا باز می‌کنید (شکل ۵)، بخش اضافه‌ای به‌نام MyFlaggedFeature پیدا خواهید کرد که درطول راه‌اندازی اجرا می‌شود (شکل ۶). برعکس، انتخاب ردیابی از جمعیت با تأخیر کمتر (قله سمت چپ) تأیید می‌کند که همان برش وجود ندارد (شکل ۷). این مقایسه نشان می‌دهد که یک پرچم ویژگی خاص، که برای زیرمجموعه‌ای از کاربران فعال شده است، باعث ایجاد رگرسیون می‌شود.

ردیابی تأخیر زیاد در نمودار برجسته شده است.
شکل ۵. نقطه داده با تأخیر بالا در نمودار ویولنی.
ردیابی‌ای که راه‌اندازی با تأخیر بالا را به‌دلیل برش MyFlaggedFeature برجسته می‌کند.
شکل ۶. راه‌اندازی ردیابی تأخیر بالا با یک برش اضافی `MyFlaggedFeature`.
ردیابی‌ای که راه‌اندازی با تأخیر کم را بدون برش MyFlaggedFeature برجسته می‌کند.
شکل ۷. راه‌اندازی ردیابی تأخیر کم.

این مثال یکی از روش‌های متعددی را نشان می‌دهد که می‌توانید از تحلیل انبوه ردگیری استفاده کنید. سایر موارد استفاده شامل استخراج آمار از فیلد برای سنجش تأثیر، تشخیص رگرسیون، و موارد دیگر است.