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

وقتی چندین ردگیری را بااستفاده از 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. این ابزار تأخیر را برحسب میلی‌ثانیه بااستفاده از نمودار ویولنی ترسیم می‌کند تا توزیع زمان‌های راه‌اندازی را تجسم کند.

تفسیر نتایج

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

اجرای اسکریپت یک نمودار ویولنی تولید می‌کند که توزیع دومودی با دو اوج تأخیر متمایز را نشان می‌دهد (شکل ۴). موشواره را روی نقاط داده تکی در نمودار نگه دارید تا نام فایل _path را بررسی کنید و ردگیری‌های هر اوج را مقایسه کنید (شکل ۵):

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

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