استخدام التتبُّع للحصول على إحصاءات حول أداء النظام

استخدِم ميزة "التتبُّع" لتسجيل الأحداث والعدادات على النظام وعرض كلّ منها على مخطط زمني. أداة التتبُّع العادية في Android هي Perfetto. لمعرفة المزيد، يُرجى الاطّلاع على مقالة أساسيات التتبُّع.

إضافة أدوات التتبُّع إلى الرمز

للحصول على الأحداث من التطبيق، يجب إضافة أدوات التتبُّع إلى الرمز. لن تظهر الأقسام التي لم تتم إضافة أدوات التتبُّع إليها في عمليات التتبُّع.

يعرض نموذج تتبُّع المركبة المعرّفة بالبرامج (SDV) عملية دمج التتبُّع، بالإضافة إلى التعليمات ومثال على إعدادات التتبُّع. يمكنك العثور عليه في system/software_defined_vehicle/core_services/samples/tracing/.

الصدأ (Rust)

الطريقة المقترَحة للغة Rust هي استخدام حزمة tracing لإنشاء أحداث ATrace. تتوافق أداة Perfetto مع ATrace كمصدر بيانات. نخطط للتبديل إلى حزمة Perfetto SDK عندما تتوفّر روابط Rust، وذلك استنادًا إلى كيفية تطوّر حالات الاستخدام.

أضِف الإعدادات التلقائية للتتبُّع إلى 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()
    ...
}

يمكنك حذف طلب بدء التشغيل. سيؤدي ذلك إلى ترك ميزة "التتبُّع" غير مفعّلة ولن تجمع أداة Perfetto أحداث أدوات التتبُّع من التطبيق.

أضِف أدوات التتبُّع. يمكنك العثور على مزيد من النماذج في 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++‎

تستخدم ميزة "التتبُّع" في 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;
}

كما في مثال Rust، يُنشئ هذا الرمز شريحتَين متداخلتَين وعلامة للحدث الفوري في واجهة المستخدم. تظهر قيم وسيطة تصحيح الأخطاء عند اختيار حدث.

تجميع عملية تتبُّع

استخدِم النص البرمجي record\_android\_trace في سطر الأوامر لتسجيل عملية تتبُّع، واستخدِم واجهة مستخدم Perfetto على الويب لعرضها.

ضبط عملية الالتقاط

عليك تقديم إعدادات لـ record_android_trace بتنسيق textproto. لمزيد من المعلومات، يُرجى الاطّلاع على مستندات Perfetto.

يحتوي مستودع SDV على نموذج إعدادات (system/software_defined_vehicle/core_services/samples/tracing/config/trace_cfg.pbtx). يتضمّن هذا الملف عدة مصادر بيانات ويمكن تخصيصه أو استخدامه كما هو.

استخدِم واجهة مستخدم Perfetto لإنشاء إعدادات

يمكنك ضبط إعدادات مخصّصة واستكشاف الخيارات المتاحة من خلال الانتقال إلى تسجيل عملية تتبُّع جديدة في واجهة مستخدم Perfetto ، وتعديل إعدادات التسجيل وأجهزة التحقيق. بعد ذلك، يمكنك فتح طريقة العرض "أمر التسجيل" (Recording command) للاطّلاع على الأمر الذي تم إنشاؤه والحصول على محتويات الإعدادات منه.

ضبط إمكانية ظهور أدوات التتبُّع داخل التطبيق

تستخدم أدوات التتبُّع في Rust ميزة 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: "*"
        }
    }
}

تسجيل عملية تتبُّع

افتح نافذة طرفية في جذر مستودع Android. ليس عليك تنفيذ 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 لإنشاء عنوان URL لعرض عملية التتبُّع بدون فتح المتصفّح. يكون ذلك مفيدًا للجلسات عن بُعد عندما تكون قد أعددت عملية إعادة توجيه المنفذ (عادةً ما يكون 9001).

  • -n, --no-open لعدم فتح المتصفّح أو إنشاء عنوان URL لعرض عملية التتبُّع بعد جلسة التتبُّع. سيظل بإمكانك فتح الملفات في واجهة مستخدم Perfetto من خلال النقر على "فتح ملف التتبُّع" (Open trace file) واختيار الملف.

  • -o <path> لضبط مسار الإخراج.

تفاصيل الاستخدام

يقدّم هذا القسم تفاصيل قد تكون مفيدة عند استخدام نظام التتبُّع.

أدوات التتبُّع في مكوّنات SDV

في البرامج التي تتضمّن أدوات التتبُّع، تكون ميزة "التتبُّع" متاحة تلقائيًا في الإصدارات القابلة للتصحيح (-eng و-userdebug)، ما لم يتم تحديد خلاف ذلك. عند جمع عملية تتبُّع، من المفترض أن تظهر لك أحداث العمليات بدون إعدادات إضافية.

عادةً لا تبدأ المكتبات عملية التتبُّع تلقائيًا. في Rust، يجب أن يبدأ البرنامج الثنائي الذي يستخدم المكتبة عملية التتبُّع للعملية باستخدام sdv_tracing::init_tracing(). لمزيد من المعلومات، يُرجى الاطّلاع على قياس حالة التطبيق في الرمز لمعرفة المزيد.

برمجيات وسيطة

مكتبة النشر/الاشتراك: libsdv_middleware_dt

الأحداث:

  • الناشر: نشر المواضيع وتسجيلها.
  • المشترك: الاشتراك والاستطلاع.

التفعيل: استدعِ sdv_tracing::init_tracing() أو sdv_tracing::try_init_tracing() في الملف الثنائي.

مكتبة gRPC: libsdvmiddleware_rpc_grpc_transport

الأحداث:

  • عميل RPC: بدء الاتصال بالخادم واستدعاء طرق RPC.
  • خادم RPC: بدء التسجيل في "اكتشاف الخدمات" وإضافة طرق RPC واستدعاؤها.

التفعيل: استدعِ sdv_tracing::init_tracing() أو sdv_tracing::try_init_tracing() في الملف الثنائي.

SOME/IP
  • العملية: sdv_someip_broker_agent. Example Source: This is a test Example Translation: Dies ist ein Test Source: This is a test with another placeholder Translation: Dies ist ein Test mit einem anderen Platzhalter
  • الأحداث: معالجة الرسائل وترجمتها والاشتراك في الأحداث.
مدير مراحل النشاط
  • العملية: sdv_lifecycle_agent. Example Source: This is a test Example Translation: Dies ist ein Test Source: This is a test with another placeholder Translation: Dies ist ein Test mit einem anderen Platzhalter
  • الأحداث: عمليات الخدمة، مثل بدء التشغيل والإيقاف والتسجيل وإلغاء التسجيل.
وضع طاقة المركبة
  • العملية: sdv_vpm_agent. Example Source: This is a test Example Translation: Dies ist ein Test Source: This is a test with another placeholder Translation: Dies ist ein Test mit einem anderen Platzhalter
  • الأحداث: تغييرات حالة الطاقة والاشتراكات.
نفق البيانات

نخطط لإتاحة عملية دمج التتبُّع في وقت لاحق.

العبء على الأداء الناتج عن ميزة "التتبُّع"

تأتي قياسات العبء مع التحذير المعتاد بأنّ الأداء قد يختلف بين الأنظمة المختلفة، وخاصةً بين المحاكي والأجهزة الفعلية.

الصدأ (Rust)

تتوفّر بيانات الاختبار المعياري الأولية في AOSP. تم جمع البيانات على جهاز افتراضي Cuttlefish.

  • نطاق واحد: tracing::info_span!() و#[tracing::instrument] وما شابه:
    • ميزة "التتبُّع" غير مفعّلة: 1 نانو ثانية.
    • ميزة "التتبُّع" مفعّلة وغير نشطة (لا يتم تسجيل أي عملية تتبُّع): 30 نانو ثانية.
    • ميزة "التتبُّع" مفعّلة: 3 ميكرو ثانية. يمكن أن تضيف تعليقات الحقول الخاصة بتصحيح الأخطاء من 1 إلى 2 ميكرو ثانية، وذلك استنادًا إلى مدى تعقيد عملية تحويل البيانات إلى سلسلة.
  • حدث واحد: tracing::info!() وما شابه:
    • ميزة "التتبُّع" غير مفعّلة: 1 نانو ثانية.
    • ميزة "التتبُّع" مفعّلة وغير نشطة: 30 نانو ثانية.
    • ميزة "التتبُّع" مفعّلة: 1.5 ميكرو ثانية. يمكن أن تضيف تعليقات الحقول الخاصة بتصحيح الأخطاء من 0.5 إلى 1 ميكرو ثانية، وذلك استنادًا إلى مدى تعقيد عملية stringification.
C++‎

أرقام الأداء مأخوذة من قسم الأداء (Performance) في مستند أحداث التتبُّع (Track events) في Perfetto. تتطابق الأوقات الخاصة بهاتف Pixel 3 في الجدول مع ملاحظاتنا على جهاز Cuttlefish الافتراضي.

شريحة واحدة: TRACE_EVENT() وما شابه. التتبُّع:

  • غير مفعّلة: 2 نانو ثانية.
  • مفعّلة: 300 نانو ثانية. يمكن أن تضيف تعليقات الحقول الخاصة بتصحيح الأخطاء من 50 إلى 100 نانو ثانية.