بعد جمع عمليات تتبُّع متعددة باستخدام ProfilingManager، يصبح استكشافها
بشكل فردي للعثور على مشاكل الأداء غير عملي. يتيح لك تحليل التتبّعات المجمّعة الاستعلام عن مجموعة بيانات من التتبّعات في الوقت نفسه من أجل:
- تحديد حالات تراجع الأداء الشائعة
- احتساب التوزيعات الإحصائية (على سبيل المثال، وقت الاستجابة P50 وP90 وP99)
- العثور على أنماط في عدة عمليات تتبُّع
- يمكنك العثور على آثار القيم الشاذة لفهم مشاكل الأداء وتصحيحها.
يوضّح هذا القسم كيفية استخدام معالج تتبُّع الدفعات في Perfetto Python لتحليل مقاييس بدء التشغيل على مستوى مجموعة من عمليات التتبُّع المخزَّنة محليًا وتحديد عمليات التتبُّع الشاذة لإجراء تحليل أكثر تفصيلاً.
تصميم طلب البحث
الخطوة الأولى لإجراء تحليل مجمّع هي إنشاء طلب بحث PerfettoSQL.
في هذا القسم، نقدّم مثالاً على طلب بحث يقيس وقت استجابة بدء تشغيل التطبيق.
على وجه التحديد، يمكنك قياس المدة من activityStart إلى أول إطار يتم إنشاؤه (أول ظهور لشريحة Choreographer#doFrame) لقياس وقت استجابة بدء تشغيل التطبيق الذي يقع ضمن نطاق تحكّم تطبيقك. يوضح الشكل 1
القسم المطلوب الاستعلام عنه.
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).
إعداد بيئة 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 البرمجي، ينفّذ الإجراءات التالية:
- يبحث النص البرمجي في الدليل المحلي عن جميع تتبُّعات Perfetto التي تنتهي بـ
.perfetto-traceويستخدمها كمصادر للتتبُّع من أجل التحليل. - ويتم تشغيل طلب تتبُّع مجمّع يحسب المجموعة الفرعية لوقت بدء التشغيل
المقابلة للوقت من شريحة تتبُّع
activityStartإلى أول إطار يتم إنشاؤه بواسطة تطبيقك. - ويتم رسم وقت الاستجابة بالملي ثانية باستخدام رسم بياني كماني لتصوّر توزيع أوقات بدء التشغيل.
تفسير النتائج
بعد تنفيذ النص البرمجي، ينشئ النص البرمجي مخططًا. في هذه الحالة، يُظهر الرسم البياني توزيعًا ثنائي النسق مع قمتين متميزتين (الشكل 4).
بعد ذلك، ابحث عن الفرق بين المجموعتين. يساعدك ذلك في فحص التتبّعات الفردية بمزيد من التفصيل. في هذا المثال، تم إعداد المخطط بحيث عند التمرير فوق نقاط البيانات (أوقات الاستجابة)، يمكنك تحديد أسماء ملفات التتبع. يمكنك بعد ذلك فتح أحد عمليات التتبُّع التي تشكّل جزءًا من مجموعة وقت الاستجابة العالي.
عند فتح تتبُّع من مجموعة وقت الاستجابة العالي (الشكل 5)، ستظهر لك
شريحة إضافية باسم MyFlaggedFeature تعمل أثناء بدء التشغيل (الشكل 6).
في المقابل، يؤدي اختيار تتبُّع من مجموعة البيانات ذات وقت الاستجابة الأقل (القمة في أقصى اليسار) إلى تأكيد غياب هذه الشريحة نفسها (الشكل 7). تشير هذه المقارنة إلى أنّ علامة ميزة معيّنة، تم تفعيلها لمجموعة فرعية من المستخدمين، تؤدي إلى حدوث تراجع في الأداء.
يوضّح هذا المثال إحدى الطرق العديدة التي يمكنك من خلالها استخدام تحليل التتبُّع المجمّع. وتشمل حالات الاستخدام الأخرى استخراج الإحصاءات من المجال لقياس التأثير، ورصد حالات التراجع، والمزيد.