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

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

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

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

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

الخطوة الأولى لإجراء تحليل مجمّع هي إنشاء طلب بحث 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

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

ينفّذ النص البرمجي النموذجي التالي طلب البحث في عمليات تتبُّع متعددة باستخدام أداة Python 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()

فهم النص البرمجي

عند تشغيل النص البرمجي بلغة Python، يتم تنفيذ الإجراءات التالية:

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

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

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

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

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

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

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

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