ProfilingManager का इस्तेमाल करके कई ट्रेस इकट्ठा करने के बाद, परफ़ॉर्मेंस से जुड़ी समस्याओं का पता लगाने के लिए, हर ट्रेस को अलग-अलग एक्सप्लोर करना मुश्किल हो जाता है. बल्क ट्रेस विश्लेषण की मदद से, ट्रेस के डेटासेट को एक साथ क्वेरी किया जा सकता है, ताकि:
- परफ़ॉर्मेंस में आम तौर पर होने वाली गिरावट की पहचान करना.
- सांख्यिकीय डिस्ट्रिब्यूशन का हिसाब लगाना. जैसे, P50, P90, P99 लेटेंसी.
- कई ट्रेस में पैटर्न ढूंढना.
- परफ़ॉर्मेंस की समस्याओं को समझने और उन्हें डीबग करने के लिए, आउटलायर ट्रेस ढूंढें.
इस सेक्शन में, Perfetto Python Batch Trace Processor का इस्तेमाल करने का तरीका बताया गया है. इससे, डिवाइस पर सेव किए गए ट्रेस के सेट में स्टार्टअप मेट्रिक का विश्लेषण किया जा सकता है. साथ ही, ज़्यादा बारीकी से विश्लेषण करने के लिए, आउटलायर ट्रेस का पता लगाया जा सकता है.
क्वेरी डिज़ाइन करें
सबसे पहले, PerfettoSQL क्वेरी बनाएं. इससे वह मेट्रिक निकाली जाती है जिसकी आपको तुलना करनी है.
यहां दिए गए उदाहरण में, ऐप्लिकेशन से कंट्रोल होने वाले स्टार्टअप लेटेंसी को 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) में देखा जा सकता है.
Python एनवायरमेंट सेट अप करना
अपने कंप्यूटर पर Python और इसकी ज़रूरी लाइब्रेरी इंस्टॉल करें:
pip install perfetto pandas plotly
एक साथ कई ट्रेस का विश्लेषण करने वाली स्क्रिप्ट बनाना
यहां दी गई सैंपल स्क्रिप्ट, Perfetto के 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). प्लॉट में अलग-अलग डेटा पॉइंट पर कर्सर घुमाकर, _path फ़ाइल नाम की जांच करें. साथ ही, हर पीक से ट्रेस की तुलना करें (इमेज 5):
- ज़्यादा इंतज़ार के समय वाले ट्रेस (दाईं ओर की पीक): Perfetto यूज़र इंटरफ़ेस (यूआई) में इस ग्रुप के किसी ट्रेस को खोलने पर, स्टार्टअप के दौरान चलने वाली एक अतिरिक्त
MyFlaggedFeatureस्लाइस दिखती है (इमेज 6). - कम इंतज़ार के समय वाले ट्रेस (बाईं ओर की पीक): तेज़ ग्रुप से ट्रेस खोलने पर, यह पुष्टि होती है कि
MyFlaggedFeatureमौजूद नहीं है (इमेज 7). इससे पता चलता है कि उपयोगकर्ताओं के सबसेट के लिए चालू किए गए फ़ीचर फ़्लैग की वजह से, स्टार्टअप रिग्रेशन हुआ.
MyFlaggedFeature स्लाइस और जोड़ें.
इस उदाहरण में, बल्क ट्रेस ऐनलिसिस का इस्तेमाल करने के कई तरीकों में से एक तरीका बताया गया है. इसके अलावा, इस डेटा का इस्तेमाल करके, असर का आकलन करने के लिए फ़ील्ड से आंकड़े निकाले जा सकते हैं, रिग्रेशन का पता लगाया जा सकता है, और अन्य काम किए जा सकते हैं.