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

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

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

এই বিভাগে দেখানো হয়েছে যে কীভাবে Perfetto Python Batch Trace Processor ব্যবহার করে স্থানীয়ভাবে সেভ করা ট্রেসের সেট জুড়ে স্টার্টআপ মেট্রিক্স বিশ্লেষণ করা যায় এবং আরও গভীর বিশ্লেষণের জন্য আউটলায়ার ট্রেস লোকেট করা যায়।

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

বাল্ক বিশ্লেষণ করার প্রথম ধাপ হল 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)

আপনি Perfetto UI-এর মধ্যে কোয়েরি এক্সিকিউট করতে পারবেন এবং তারপরে কোয়েরির ফলাফল ব্যবহার করে ডিবাগ ট্র্যাক (ছবি ২) তৈরি করতে এবং টাইমলাইনের (ছবি ৩) মধ্যে এটি ভিজ্যুয়ালাইজ করতে পারবেন।

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

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 স্ক্রিপ্ট রান করলে, এটি নিম্নলিখিত অ্যাকশনগুলি করে:

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

ফলাফল ব্যাখ্যা করো

কোয়েরি করা স্টার্টআপ লেটেন্সির ডিস্ট্রিবিউশন দেখানো ভায়োলিন প্লট।
ছবি ৪. কোয়েরি করা স্টার্টআপ লেটেন্সির ভায়োলিন প্লট।

আপনি স্ক্রিপ্টটি এক্সিকিউট করার পরে, স্ক্রিপ্টটি একটি প্লট তৈরি করে। এই ক্ষেত্রে, প্লটটি দুটি স্বতন্ত্র পিক সহ একটি বাইমোডাল ডিস্ট্রিবিউশন দেখায় (ছবি ৪)।

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

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

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

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