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

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

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

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

طراحی پرس و جو

اولین قدم برای انجام یک تحلیل گروهی، ایجاد یک کوئری PerfettoSQL است.

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

نمای جدول زمانی از یک ردیابی، که مدت زمان از رویداد 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 که مسیر اشکال‌زدایی تولید شده برای یک پرس‌وجوی راه‌اندازی را نشان می‌دهد.
شکل ۳. مسیر اشکال‌زدایی ایجاد شده برای یک پرس‌وجوی راه‌اندازی.

محیط پایتون را تنظیم کنید

پایتون و کتابخانه‌های مورد نیاز آن را روی دستگاه محلی خود نصب کنید :

pip install perfetto pandas plotly

اسکریپت تحلیل ردیابی انبوه را ایجاد کنید

اسکریپت نمونه زیر، با استفاده از پردازنده پایتون BatchTraceProcessor مربوط به Perfetto، پرس‌وجو را در چندین مسیر اجرا می‌کند.

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()

فیلمنامه را درک کنید

وقتی اسکریپت پایتون را اجرا می‌کنید، اقدامات زیر را انجام می‌دهد:

  1. این اسکریپت در دایرکتوری محلی شما به دنبال تمام ردپاهای Perfetto که با پسوند .perfetto-trace هستند، جستجو می‌کند و از آنها به عنوان ردپاهای منبع برای تجزیه و تحلیل استفاده می‌کند.
  2. این یک کوئری ردیابی انبوه اجرا می‌کند که زیرمجموعه‌ای از زمان راه‌اندازی مربوط به زمان از برش ردیابی activityStart تا اولین فریم تولید شده توسط برنامه شما را محاسبه می‌کند.
  3. این برنامه با استفاده از نمودار ویولونی، تأخیر را بر حسب میلی‌ثانیه رسم می‌کند تا توزیع زمان‌های راه‌اندازی را به تصویر بکشد.

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

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

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

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

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

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

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