تحليل التتبُّع المجمّع

بعد جمع عمليات تتبُّع متعددة باستخدام 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).

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

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

رسم بياني يوضّح تتبُّع وقت الاستجابة الطويل
الشكل 5: نقطة بيانات ذات وقت استجابة مرتفع في رسم بياني كماني
تتبُّع يسلّط الضوء على وقت الاستجابة الطويل لبدء التشغيل بسبب شريحة MyFlaggedFeature
الشكل 6: بدء تتبُّع وقت الاستجابة الطويل باستخدام شريحة `MyFlaggedFeature` إضافية.
تتبُّع يسلّط الضوء على بدء التشغيل بوقت استجابة منخفض بدون شريحة MyFlaggedFeature
الشكل 7: بدء تتبُّع وقت الاستجابة السريع

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