সিস্টেমের ইভেন্ট ও কাউন্টারগুলো রেকর্ড করতে এবং টাইমলাইনে প্রতিটি দেখতে ট্রেসিং ব্যবহার করুন। অ্যান্ড্রয়েডের স্ট্যান্ডার্ড ট্রেসিং টুল হলো পারফেটটো । আরও জানতে, ট্রেসিং ১০১ দেখুন।
আপনার কোডকে যন্ত্রায়িত করুন
অ্যাপ থেকে ইভেন্ট পেতে হলে কোডে ট্রেসপয়েন্ট যোগ করে এটিকে ইনস্ট্রুমেন্ট করতে হবে। যে অংশগুলো ইনস্ট্রুমেন্ট করা হয় না, সেগুলো ট্রেসে দেখা যাবে না।
SDV ট্রেসিং স্যাম্পল হলো ট্রেসিং ইন্টিগ্রেশনের একটি ডেমো, সাথে নির্দেশাবলী এবং ট্রেসিং কনফিগের একটি উদাহরণ রয়েছে। এটি system/software_defined_vehicle/core_services/samples/tracing/ -এ অবস্থিত।
মরিচা
রাস্টের জন্য প্রস্তাবিত পদ্ধতি হলো ATrace ইভেন্ট নির্গত করতে ট্রেসিং ক্রেট ব্যবহার করা। পারফেটটো একটি ডেটা সোর্স হিসেবে ATrace সমর্থন করে। রাস্ট বাইন্ডিং উপলব্ধ হলে এবং ব্যবহারের ক্ষেত্রগুলো কীভাবে বিকশিত হয় তার উপর নির্ভর করে আমরা পারফেটটো এসডিকে-তে স্থানান্তরিত হওয়ার পরিকল্পনা করছি।
Android.bp তে ট্রেসিং ডিফল্টগুলি যোগ করুন:
rust_binary {
...
defaults: [
...
"sdv_tracing@rust_defaults",
],
...
}
সাবস্ক্রাইবারকে চালু করুন। এটি প্রতি প্রসেসে শুধুমাত্র একবার করা যাবে:
fn main() {
// Initialize the subscriber, panic if it fails.
// sdv_tracing::try_init_tracing() is the version that returns a Result.
sdv_tracing::init_tracing()
...
}
আপনি ইনিশিয়ালাইজেশন কলটি বাদ দিতে পারেন। এমনটা করলে ট্রেসিং অনির্দিষ্ট থেকে যায় এবং পারফেটটো অ্যাপ থেকে ইন্সট্রুমেন্টেশন ইভেন্ট সংগ্রহ করবে না।
ট্রেসপয়েন্ট যোগ করুন। আপনি system/software_defined_vehicle/core_services/samples/tracing/rust_tracing_api_demo/tracing.rs -এ আরও নমুনা খুঁজে পেতে পারেন।
use tracing::{instrument, info_span};
// #[tracing::instrument] wraps the method into a tracing span and records arguments.
// Use #[instrument(skip(num))] if you don't want to record the argument.
#[instrument]
fn mul_by_100(num: i32) -> i32 {
// Create and enter a span with INFO verbosity, name, and a debug field annotation.
// The span will exit when dropped.
let _span = info_span!("This is a span", var=123).entered();
let result = num * 100;
// Emit an instant INFO event that records the result value.
// We recommend to fully qualify the crate when using events to avoid confusion with log records.
tracing::info!(result, "Completed");
result
}
সি++
C++ ট্রেসিং ইভেন্ট ট্র্যাক করতে পারফেটটো এসডিকে (Perfetto SDK) ব্যবহার করে। Android.bp তে ট্রেসিং ডিফল্টগুলো যোগ করুন:
cc_binary {
...
defaults: [
...
"sdv_tracing@cc_defaults",
],
...
}
ক্যাটাগরিগুলো সংজ্ঞায়িত করুন। যদি আপনি একাধিক মডিউলে ক্যাটাগরিগুলো ব্যবহার করেন, তবে সেগুলোকে একটি সাধারণ লাইব্রেরিতে স্থানান্তর করুন। উদাহরণস্বরূপ, system/software_defined_vehicle/core_services/samples/tracing/cpp_service/tracing_categories.h ।
হেডারে:
#include "perfetto/tracing/tracing.h"
#include "perfetto/tracing/track_event.h"
PERFETTO_DEFINE_CATEGORIES(
perfetto::Category("sample")
.SetTags("tag")
.SetDescription("Sample events"));
স্ট্যাটিক স্টোরেজ ম্যাক্রোটি কোনো মেথডের মধ্যে না রেখে একটি .cpp সোর্স ফাইলে রাখুন। যদি আপনি কম্পোনেন্টগুলোর মধ্যে ক্যাটাগরিগুলো শেয়ার করেন, তাহলে ক্যাটাগরিযুক্ত হেডারের সাথে সঙ্গতিপূর্ণ সোর্স ফাইলটি ব্যবহার করুন।
PERFETTO_TRACK_EVENT_STATIC_STORAGE();
int main() {
...
}
Perfetto চালু করতে, সিস্টেম ব্যাকএন্ড চালু করুন এবং ট্র্যাক ইভেন্টগুলি নিবন্ধন করুন:
#include <sdv/tracing_init.h>
int main() {
...
android::sdv::InitPerfettoWithTrackEvents<perfetto::TrackEvent>();
...
}
ইনস্ট্রুমেন্টেশন যোগ করুন। system/software_defined_vehicle/core_services/samples/tracing/cpp_service/client.cpp ফাইলে আরও নমুনা দেখুন।
int32_t mulBy100(int32_t num) {
// Start a slice that will get closed at the end of the scope.
TRACE_EVENT("client", "mulBy100", "num", num);
TRACE_EVENT("client", "This is a slice", "var", 123);
int32_t result = num * 100;
// Instant events have zero duration. They are drawn as markers on the track.
TRACE_EVENT_INSTANT("client", "Completed", "result", result);
return result;
}
রাস্ট উদাহরণের মতোই, এই কোডটি UI-তে দুটি নেস্টেড স্লাইস এবং ইনস্ট্যান্ট ইভেন্টের জন্য একটি মার্কার তৈরি করে। যখন কোনো ইভেন্ট নির্বাচন করা হয়, তখন ডিবাগ আর্গুমেন্টের মানগুলো দেখানো হয়।
একটি চিহ্ন সংগ্রহ করুন
ট্রেস রেকর্ড করতে record\_android\_trace কমান্ড লাইন স্ক্রিপ্ট এবং তা দেখতে Perfetto ওয়েব UI ব্যবহার করুন।
ক্যাপচার কনফিগার করুন
আপনাকে record_android_trace এর জন্য textproto ফরম্যাটে একটি কনফিগ প্রদান করতে হবে। আরও জানতে Perfetto ডকুমেন্টেশন দেখুন।
SDV রিপোজিটরিতে একটি নমুনা কনফিগারেশন রয়েছে ( system/software_defined_vehicle/core_services/samples/tracing/config/trace_cfg.pbtx )। এই ফাইলটিতে বেশ কয়েকটি ডেটা সোর্স অন্তর্ভুক্ত রয়েছে এবং এটি কাস্টমাইজ করা বা অপরিবর্তিতভাবে ব্যবহার করা যেতে পারে।
একটি কনফিগারেশন তৈরি করতে Perfetto UI ব্যবহার করুন
আপনি পারফেটটো UI-তে 'রেকর্ড নিউ ট্রেস'- এ গিয়ে রেকর্ডিং সেটিংস এবং প্রোবগুলো অ্যাডজাস্ট করে একটি কাস্টম কনফিগ তৈরি করতে ও উপলব্ধ অপশনগুলো দেখতে পারেন। এরপর আপনি 'রেকর্ডিং কমান্ড' ভিউ খুলে তৈরি হওয়া কমান্ডটি দেখতে এবং সেখান থেকে কনফিগের বিষয়বস্তুগুলো সংগ্রহ করতে পারেন।
ইন-অ্যাপ ইন্সট্রুমেন্টেশন দৃশ্যমানতা কনফিগার করুন
রাস্ট ইন্সট্রুমেন্টেশন ATrace ব্যবহার করে। এটি ডকুমেন্টেশনের ftrace_config সেকশনে কনফিগার করা হয়। SDV কম্পোনেন্টগুলোতে ATRACE_TAG_APP ট্যাগ থাকে এবং এগুলো অ্যাপ-ভিত্তিক সক্রিয় করা যায়। স্যাম্পল কনফিগারেশনটি সমস্ত অ্যাপ সক্রিয় করে রাখে।
data_sources: {
config {
name: "linux.ftrace"
ftrace_config {
# Setting atrace_apps to "*" enable ATrace events for all apps.
# You can set it to a pattern to match specific processes by name.
# Use multiple atrace_apps entries to enable multiple processes.
atrace_apps: "*"
}
}
} আমরা C++ Perfetto SDK-তে ট্র্যাক ইভেন্ট ব্যবহার করি। এটি একটি track_event ডেটা সোর্স ( ডকুমেন্টেশন )।
আপনি track_event_config ফিল্ডে ক্যাটাগরি এবং ট্যাগ সক্রিয় বা নিষ্ক্রিয় করতে পারেন। বিশেষ slow এবং debug ট্যাগ ছাড়া, প্রতিটি ক্যাটাগরির শেষ ট্যাগ ডিফল্টরূপে সক্রিয় থাকে। আপনি যদি শুধুমাত্র নির্দিষ্ট ক্যাটাগরি সক্রিয় করতে চান, তাহলে আপনাকে অন্য সবগুলো নিষ্ক্রিয় করতে হবে, যেমন disabled_categories: "*" ব্যবহার করে, ঠিক এখানের মতো:
data_sources: {
config {
name: "track_event"
track_event_config {
enabled_categories: "the_best_category_in_the_world"
disabled_categories: "*"
}
}
}একটি চিহ্ন রেকর্ড করুন
অ্যান্ড্রয়েড রিপোজিটরি রুটে একটি টার্মিনাল খুলুন। envsetup করার প্রয়োজন নেই। রেকর্ডিং স্ক্রিপ্টটি external/perfetto/tools/record_android_trace এ রয়েছে।
নমুনা কনফিগারেশন দিয়ে স্ক্রিপ্টটি চালান:
external/perfetto/tools/record_android_trace --config system/software_defined_vehicle/core_services/samples/tracing/config/trace_cfg.pbtx
রেকর্ডিং আগেভাগে বন্ধ করতে Ctrl + C চাপুন।
এর ফলে adb shell perfetto একটি ট্রেস রেকর্ড করতে শুরু করে এবং তারপর ট্রেসটিকে হোস্টে, সাধারণত ~/traces ফোল্ডারে, নিয়ে আসে। ট্রেসটি সংগ্রহ করা হয়ে গেলে, টুলটি ট্রেসটি দেখানোর জন্য একটি ব্রাউজার উইন্ডো খোলে।
সহায়ক যুক্তি:
একটি নির্দিষ্ট সিরিয়াল দিয়ে ডিভাইসটি ব্যবহার করতে
-s SERIALব্যবহার করুন। উদাহরণস্বরূপ-s 0.0.0.0:6520--no-open-browserট্রেস দেখানোর জন্য একটি ইউআরএল তৈরি করবে, কিন্তু ব্রাউজার খুলবে না। রিমোট সেশনের জন্য এটি উপযোগী, বিশেষ করে যখন আপনার পোর্ট ফরওয়ার্ডিং সেট আপ করা থাকে (সাধারণত ৯০০১)।-n, --no-openট্রেসিং সেশনের পরে ব্রাউজার খুলবে না বা ট্রেস পরিবেশন করার জন্য URL তৈরি করবে না। তবে, আপনি পারফেটটো UI-তে 'Open trace file'-এ ক্লিক করে এবং ফাইলটি নির্বাচন করে ফাইলগুলো খুলতে পারবেন।আউটপুট পাথ সেট করতে
-o <path>করুন।
ব্যবহারের বিবরণ
এই বিভাগে এমন কিছু বিবরণ দেওয়া হয়েছে যা ট্রেসিং সিস্টেমটি ব্যবহার করার সময় সহায়ক হতে পারে।
এসডিভি উপাদানগুলিতে ট্রেস ইন্সট্রুমেন্টেশন
ট্রেসিং ইন্সট্রুমেন্টেশন সহ এজেন্টগুলিতে, অন্যথায় নির্দিষ্ট না করা থাকলে, ডিবাগযোগ্য বিল্ডগুলিতে ( -eng , -userdebug ) ট্রেসিং ডিফল্টরূপে উপলব্ধ থাকে। যখন আপনি একটি ট্রেস সংগ্রহ করবেন, তখন অতিরিক্ত কনফিগারেশন ছাড়াই প্রসেসগুলির ইভেন্টগুলি দেখতে পাবেন।
লাইব্রেরিগুলো সাধারণত স্বয়ংক্রিয়ভাবে ট্রেসিং শুরু করে না। রাস্টে, যে বাইনারিটি লাইব্রেরিটি ব্যবহার করে, তাকে sdv_tracing::init_tracing() ব্যবহার করে প্রসেসটির জন্য ট্রেসিং শুরু করতে হয়। আরও জানতে আপনার কোড ইন্সট্রুমেন্ট করুন (Instrument your code ) অংশটি দেখুন।
মিডলওয়্যার
প্রকাশনা/সাবস্ক্রাইবিং লাইব্রেরি : libsdv_middleware_dt
ঘটনা:
- প্রকাশক: বিষয়বস্তু প্রকাশ ও নিবন্ধন।
- সাবস্ক্রাইবার: সাবস্ক্রাইব করা এবং ভোটগ্রহণ।
সক্রিয় করতে: বাইনারিতে sdv_tracing::init_tracing() অথবা sdv_tracing::try_init_tracing() কল করুন।
gRPC লাইব্রেরি : libsdvmiddleware_rpc_grpc_transport
ঘটনা:
- আরপিসি ক্লায়েন্ট: চালু করা, সার্ভারের সাথে সংযোগ স্থাপন এবং আরপিসি মেথড কল করা।
- আরপিসি সার্ভার: চালু করা, সার্ভিস ডিসকভারিতে নিবন্ধন করা, আরপিসি মেথড যোগ করা এবং কল করা।
সক্রিয় করতে: বাইনারিতে sdv_tracing::init_tracing() অথবা sdv_tracing::try_init_tracing() কল করুন।
কিছু/আইপি
- প্রক্রিয়া:
sdv_someip_broker_agent. \ - ইভেন্ট: বার্তা প্রক্রিয়াকরণ ও অনুবাদ, ইভেন্ট সাবস্ক্রিপশন।
জীবনচক্র ব্যবস্থাপক
- প্রক্রিয়া:
sdv_lifecycle_agent. \ - ঘটনাসমূহ: পরিষেবা কার্যক্রম - চালু করা, বন্ধ করা, নিবন্ধন করা, নিবন্ধন বাতিল করা।
গাড়ির পাওয়ার মোড
- প্রক্রিয়া:
sdv_vpm_agent. \ - ইভেন্ট: পাওয়ার অবস্থার পরিবর্তন এবং সাবস্ক্রিপশন।
ডেটা টানেল
আমরা ভবিষ্যতে ট্রেসিং ইন্টিগ্রেশন সমর্থন করার পরিকল্পনা করছি।
ট্রেসিংয়ের পারফরম্যান্স ওভারহেড
ওভারহেড পরিমাপের ক্ষেত্রে এই সাধারণ সতর্কবাণীটি মনে রাখতে হবে যে, পারফরম্যান্স বিভিন্ন সিস্টেমে এবং বিশেষ করে এমুলেটর ও আসল হার্ডওয়্যারের মধ্যে ভিন্ন হতে পারে।
মরিচা
কাঁচা বেঞ্চমার্ক ডেটা AOSP-তে পাওয়া যায় । ডেটাটি একটি Cuttlefish VM-এ সংগ্রহ করা হয়েছিল।
- একক স্প্যান:
tracing::info_span!(),#[tracing::instrument]এবং অনুরূপ:- ট্রেসিং শুরু করা হয়নি: ১ ন্যানোসেকেন্ড।
- ট্রেসিং শুরু এবং নিষ্ক্রিয় করা হয়েছে (কোনো ট্রেস রেকর্ডিং হচ্ছে না): ৩০ ন্যানোসেকেন্ড।
- ট্রেসিং সক্রিয় থাকলে: ৩ মাইক্রোসেকেন্ড। স্ট্রিংফিকেশনের জটিলতার উপর নির্ভর করে ডিবাগ ফিল্ড অ্যানোটেশনের জন্য ১-২ মাইক্রোসেকেন্ড অতিরিক্ত সময় লাগতে পারে।
- একক ইভেন্ট:
tracing::info!()এবং অনুরূপ:- ট্রেসিং শুরু করা হয়নি: ১ ন্যানোসেকেন্ড।
- ট্রেসিং শুরু এবং বন্ধ করা হয়েছে: ৩০ ন্যানোসেকেন্ড।
- ট্রেসিং সক্রিয় থাকলে: ১.৫ মাইক্রোসেকেন্ড।
stringificationজটিলতার উপর নির্ভর করে ডিবাগ ফিল্ড অ্যানোটেশন ০.৫-১ মাইক্রোসেকেন্ড পর্যন্ত সময় যোগ করতে পারে।
সি++
পারফরম্যান্সের সংখ্যাগুলো পারফেটোর 'ট্র্যাক ইভেন্টস' ডকের 'পারফরম্যান্স' বিভাগ থেকে নেওয়া হয়েছে। সারণিতে থাকা পিক্সেল ৩-এর সময়গুলো কাটলফিশ ভিএম-এ আমাদের পর্যবেক্ষণের সাথে সামঞ্জস্যপূর্ণ।
একক স্লাইস: TRACE_EVENT() এবং অনুরূপ। ট্রেসিং:
- অক্ষম: ২ ন্যানোসেকেন্ড।
- সক্রিয় অবস্থায়: ৩০০ ন্যানোসেকেন্ড। ডিবাগ ফিল্ড অ্যানোটেশন ব্যবহার করলে আরও ৫০-১০০ ন্যানোসেকেন্ড যোগ হতে পারে।