تحليل بيانات التتبُّع بشكل مجمّع

بعد جمع عمليات تتبُّع متعددة باستخدام ProfilingManager، يصبح استكشافها بشكل فردي للعثور على مشاكل الأداء غير عملي. يتيح لك تحليل التتبّعات المجمّعة الاستعلام عن مجموعة بيانات من التتبّعات في الوقت نفسه من أجل:

  • تحديد حالات تراجع الأداء الشائعة
  • احتساب التوزيعات الإحصائية (على سبيل المثال، وقت الاستجابة P50 وP90 وP99)
  • العثور على أنماط في عدة عمليات تتبُّع
  • يمكنك العثور على آثار القيم الشاذة لفهم مشاكل الأداء وتصحيحها.

يوضّح هذا القسم كيفية استخدام معالج تتبُّع الدفعات في Perfetto Python لتحليل مقاييس بدء التشغيل على مستوى مجموعة من عمليات التتبُّع المخزّنة محليًا وتحديد عمليات التتبُّع الشاذة لإجراء تحليل أكثر تفصيلاً.

تصميم طلب البحث

أولاً، أنشئ طلب بحث PerfettoSQL يستخرج المقياس الذي تريد مقارنته. يقيس المثال التالي وقت استجابة بدء التشغيل الذي يتحكّم فيه التطبيق من activityStart إلى أول لقطة يتم عرضها (Choreographer#doFrame)، كما هو موضّح في الشكل 1.

عرض مخطط زمني لعملية تتبُّع، مع تمييز المدة من حدث 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).

لوحة نتائج طلب البحث في واجهة مستخدم Perfetto توضّح كيفية إنشاء مسار تصحيح الأخطاء لطلب بحث بدء التشغيل.
الشكل 2. إنشاء مسار تصحيح الأخطاء لطلب بحث بدء التشغيل
عرض المخطط الزمني في واجهة مستخدم Perfetto الذي يعرض مسار تصحيح الأخطاء الذي تم إنشاؤه لطلب بحث بدء التشغيل
الشكل 3. تم إنشاء مقطع صوتي لتصحيح الأخطاء لطلب بحث عند بدء التشغيل.

إعداد بيئة Python

ثبِّت Python على جهازك ومكتباته المطلوبة:

pip install perfetto pandas plotly

إنشاء نص برمجي لتحليل التتبُّع المجمّع

ينفّذ النص البرمجي النموذجي التالي طلب البحث في عمليات تتبُّع متعددة باستخدام Perfetto's 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. ويتم رسم وقت الاستجابة بالملي ثانية باستخدام مخطط كمان لتصوّر توزيع أوقات بدء التشغيل.

تفسير النتائج

مخطط كمان يعرض توزيع وقت استجابة بدء التشغيل الذي تم الاستعلام عنه.
الشكل 4. مخطط كماني لمدد الاستجابة عند بدء التشغيل التي تم الاستعلام عنها

يؤدي تشغيل النص البرمجي إلى إنشاء مخطط كماني يعرض توزيعًا ثنائي الوضع مع ذروتين مختلفتين لوقت الاستجابة (الشكل 4). مرِّر مؤشر الماوس فوق نقاط البيانات الفردية في الرسم البياني لفحص اسم ملف _path ومقارنة عمليات التتبُّع من كل ذروة (الشكل 5):

  • عمليات التتبُّع ذات وقت الاستجابة العالي (الذروة اليمنى): يؤدي فتح عملية تتبُّع من هذه المجموعة في واجهة مستخدم Perfetto إلى الكشف عن شريحة MyFlaggedFeature إضافية تعمل أثناء بدء التشغيل (الشكل 6).
  • التتبّعات ذات وقت الاستجابة المنخفض (الذروة اليسرى): يؤكّد فتح تتبّع من المجموعة الأسرع غياب MyFlaggedFeature (الشكل 7)، ما يشير إلى أنّ علامة الميزة المفعَّلة لمجموعة فرعية من المستخدمين تسبّبت في تراجع أداء بدء التشغيل.
رسم بياني يسلّط الضوء على تتبُّع وقت الاستجابة الطويل
الشكل 5: نقطة بيانات ذات وقت استجابة مرتفع في رسم بياني كماني
تتبُّع يبرز وقت الاستجابة الطويل لبدء التشغيل بسبب شريحة MyFlaggedFeature
الشكل 6: بدء تتبُّع وقت الاستجابة الطويل باستخدام شريحة MyFlaggedFeature إضافية
تتبُّع يبرز بدء التشغيل بوقت استجابة منخفض بدون شريحة MyFlaggedFeature
الشكل 7: بدء تتبُّع وقت الاستجابة السريع

يوضّح هذا المثال إحدى الطرق العديدة التي يمكنك من خلالها استخدام تحليل التتبُّع المجمّع. وتشمل حالات الاستخدام الأخرى استخراج الإحصاءات من المجال لقياس التأثير، ورصد حالات التراجع، والمزيد.