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