বাল্ক ট্রেস বিশ্লেষণ

একবার আপনি ProfilingManager ব্যবহার করে একাধিক ট্রেস সংগ্রহ করে ফেললে, পারফরম্যান্সের সমস্যা খুঁজে বের করার জন্য সেগুলোকে আলাদাভাবে বিশ্লেষণ করা অবাস্তব হয়ে পড়ে। বাল্ক ট্রেস অ্যানালাইসিস আপনাকে একই সাথে ট্রেসের একটি ডেটাসেট কোয়েরি করার সুযোগ দেয়, যার মাধ্যমে আপনি:

  • সাধারণ কর্মক্ষমতা অবনতিগুলো চিহ্নিত করুন।
  • পরিসংখ্যানগত বিন্যাস গণনা করুন (উদাহরণস্বরূপ, P50, P90, P99 লেটেন্সি)।
  • একাধিক ট্রেস জুড়ে প্যাটার্ন খুঁজুন।
  • পারফরম্যান্স সংক্রান্ত সমস্যা বুঝতে ও ডিবাগ করতে আউটলায়ার ট্রেসগুলো খুঁজে বের করুন।

এই অংশে দেখানো হয়েছে কীভাবে পারফেটটো পাইথন ব্যাচ ট্রেস প্রসেসর ব্যবহার করে স্থানীয়ভাবে সংরক্ষিত একাধিক ট্রেসের স্টার্টআপ মেট্রিক্স বিশ্লেষণ করা যায় এবং গভীরতর বিশ্লেষণের জন্য ব্যতিক্রমী ট্রেসগুলো সনাক্ত করা যায়।

কোয়েরি ডিজাইন করুন

বাল্ক অ্যানালাইসিস করার প্রথম ধাপ হলো একটি PerfettoSQL কোয়েরি তৈরি করা।

এই অংশে, আমরা একটি উদাহরণ কোয়েরি উপস্থাপন করছি যা অ্যাপ স্টার্টআপ ল্যাটেন্সি পরিমাপ করে। বিশেষত, আপনি activityStart থেকে প্রথম ফ্রেম তৈরি হওয়া পর্যন্ত (অর্থাৎ Choreographer#doFrame স্লাইসের প্রথম উপস্থিতি) সময়কাল পরিমাপ করে এমন অ্যাপ স্টার্টআপ ল্যাটেন্সি পরিমাপ করতে পারেন যা আপনার অ্যাপের নিয়ন্ত্রণে রয়েছে। চিত্র ১-এ কোয়েরি করার অংশটি দেখানো হয়েছে।

একটি ট্রেসের টাইমলাইন ভিউ, যেখানে activityStart ইভেন্ট থেকে প্রথম Choreographer#doFrame ইভেন্ট পর্যন্ত সময়কাল হাইলাইট করা হয়েছে।
চিত্র ১। `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)

আপনি পারফেটটো UI-এর মধ্যে কোয়েরিটি চালাতে পারেন এবং তারপর কোয়েরির ফলাফল ব্যবহার করে একটি ডিবাগ ট্র্যাক তৈরি করতে পারেন (চিত্র ২) ও টাইমলাইনের মধ্যে তা দেখতে পারেন (চিত্র ৩)।

পারফেটটো UI-এর একটি স্ক্রিনশট, যেখানে দেখানো হয়েছে কীভাবে একটি স্টার্টআপ কোয়েরির জন্য ডিবাগ ট্র্যাক তৈরি করতে হয়।
চিত্র ২. একটি স্টার্টআপ কোয়েরির জন্য একটি ডিবাগ ট্র্যাক তৈরি করুন।
পারফেটটো UI-এর একটি টাইমলাইন ভিউ, যেখানে একটি স্টার্টআপ কোয়েরির জন্য তৈরি হওয়া ডিবাগ ট্র্যাকটি দেখানো হচ্ছে।
চিত্র ৩. একটি স্টার্টআপ কোয়েরির জন্য তৈরি হওয়া ডিবাগ ট্র্যাক।

পাইথন পরিবেশ সেট আপ করুন

আপনার লোকাল মেশিনে পাইথন এবং এর প্রয়োজনীয় লাইব্রেরিগুলো ইনস্টল করুন :

pip install perfetto pandas plotly

বাল্ক ট্রেস বিশ্লেষণ স্ক্রিপ্ট তৈরি করুন

নিম্নলিখিত নমুনা স্ক্রিপ্টটি পারফেটোর পাইথন 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()

স্ক্রিপ্টটি বুঝুন

যখন আপনি পাইথন স্ক্রিপ্টটি চালান, তখন এটি নিম্নলিখিত কাজগুলো সম্পাদন করে:

  1. স্ক্রিপ্টটি আপনার স্থানীয় ডিরেক্টরিতে .perfetto-trace প্রত্যয়যুক্ত সমস্ত পারফেটটো ট্রেস অনুসন্ধান করে এবং বিশ্লেষণের জন্য সেগুলিকে উৎস ট্রেস হিসাবে ব্যবহার করে।
  2. এটি একটি বাল্ক ট্রেস কোয়েরি চালায় যা activityStart ট্রেস স্লাইস থেকে আপনার অ্যাপ দ্বারা তৈরি প্রথম ফ্রেম পর্যন্ত সময়ের সাথে সঙ্গতিপূর্ণ স্টার্টআপ টাইমের উপসেটটি গণনা করে।
  3. এটি স্টার্টআপ সময়ের বন্টন দৃশ্যমান করার জন্য একটি ভায়োলিন প্লট ব্যবহার করে লেটেন্সি মিলিসেকেন্ডে প্রদর্শন করে।

ফলাফল ব্যাখ্যা করুন

একটি ভায়োলিন প্লট যা জিজ্ঞাসিত স্টার্টআপ লেটেন্সিগুলোর বন্টন প্রদর্শন করছে।
চিত্র ৪. জিজ্ঞাসিত স্টার্টআপ লেটেন্সিগুলোর ভায়োলিন প্লট।

স্ক্রিপ্টটি চালানোর পর, এটি একটি প্লট তৈরি করে। এক্ষেত্রে, প্লটটিতে দুটি স্বতন্ত্র চূড়াসহ একটি দ্বিমুখী বিন্যাস দেখা যায় (চিত্র ৪)।

এরপর, দুটি পপুলেশনের মধ্যে পার্থক্যটি খুঁজে বের করুন। এটি আপনাকে প্রতিটি ট্রেস আরও বিস্তারিতভাবে পরীক্ষা করতে সাহায্য করবে। এই উদাহরণে, প্লটটি এমনভাবে সাজানো হয়েছে যে, আপনি যখন ডেটা পয়েন্টগুলোর (ল্যাটেন্সি) উপর মাউস নিয়ে যাবেন, তখন ট্রেসের ফাইলের নামগুলো শনাক্ত করতে পারবেন। তারপর আপনি উচ্চ-ল্যাটেন্সি গ্রুপের অন্তর্ভুক্ত ট্রেসগুলোর মধ্যে একটি খুলতে পারবেন।

যখন আপনি উচ্চ-ল্যাটেন্সি গ্রুপ থেকে একটি ট্রেস খুলবেন (চিত্র ৫), তখন আপনি স্টার্টআপের সময় MyFlaggedFeature নামের একটি অতিরিক্ত স্লাইস চলতে দেখবেন (চিত্র ৬)। এর বিপরীতে, নিম্ন-ল্যাটেন্সি গ্রুপ থেকে একটি ট্রেস নির্বাচন করলে (সর্ববামের চূড়াটি) সেই একই স্লাইসের অনুপস্থিতি নিশ্চিত হয় (চিত্র ৭)। এই তুলনা থেকে বোঝা যায় যে, ব্যবহারকারীদের একটি উপগোষ্ঠীর জন্য সক্রিয় করা একটি নির্দিষ্ট ফিচার ফ্ল্যাগই এই রিগ্রেশনকে ট্রিগার করে।

একটি প্লট উচ্চ লেটেন্সি ট্রেস তুলে ধরেছে।
চিত্র ৫. ভায়োলিন প্লটে উচ্চ লেটেন্সি ডেটা পয়েন্ট।
MyFlaggedFeature স্লাইসের কারণে উচ্চ লেটেন্সি স্টার্টআপ তুলে ধরে একটি ট্রেস।
চিত্র ৬। একটি অতিরিক্ত `MyFlaggedFeature` স্লাইস সহ উচ্চ লেটেন্সির ট্রেস স্টার্টআপ।
MyFlaggedFeature স্লাইস ছাড়া কম লেটেন্সিতে স্টার্টআপ তুলে ধরে এমন একটি ট্রেস।
চিত্র ৭. স্বল্প বিলম্বে ট্রেস চালু হওয়া।

এই উদাহরণটি বাল্ক ট্রেস অ্যানালাইসিস ব্যবহারের অনেকগুলো পদ্ধতির মধ্যে একটি প্রদর্শন করে। এর অন্যান্য ব্যবহারগুলোর মধ্যে রয়েছে প্রভাব পরিমাপের জন্য মাঠ পর্যায় থেকে পরিসংখ্যান সংগ্রহ, রিগ্রেশন শনাক্তকরণ এবং আরও অনেক কিছু।