Menggunakan pelacakan untuk mendapatkan insight tentang performa sistem

Gunakan pelacakan untuk merekam peristiwa dan penghitung di sistem serta memvisualisasikan setiap peristiwa dan penghitung pada linimasa. Alat pelacakan standar di Android adalah Perfetto. Untuk mempelajari lebih lanjut, lihat Pelacakan 101.

Melengkapi kode Anda

Untuk mendapatkan peristiwa dari aplikasi, aplikasi harus dilengkapi dengan menambahkan titik pelacakan ke dalam kode. Bagian yang tidak dilengkapi tidak akan muncul dalam pelacakan.

Contoh pelacakan SDV adalah demo integrasi pelacakan, beserta petunjuk dan contoh konfigurasi pelacakan. Contoh ini terletak di system/software_defined_vehicle/core_services/samples/tracing/.

Karat

Pendekatan yang direkomendasikan untuk Karat adalah menggunakan crate pelacakan untuk memancarkan peristiwa ATrace. Perfetto mendukung ATrace sebagai sumber data. Kami berencana untuk beralih ke Perfetto SDK saat binding Karat tersedia dan bergantung pada perkembangan kasus penggunaan.

Tambahkan setelan default pelacakan ke Android.bp:

rust_binary {
...
    defaults: [
        ...
        "sdv_tracing@rust_defaults",
    ],
...
}

Lakukan inisialisasi pelanggan. Hal ini hanya dapat dilakukan satu kali per proses:

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()
    ...
}

Anda dapat menghilangkan panggilan inisialisasi. Jika melakukannya, pelacakan akan dibiarkan tidak diinisialisasi dan Perfetto tidak akan mengumpulkan peristiwa instrumentasi dari aplikasi.

Tambahkan titik pelacakan. Anda dapat menemukan contoh lainnya di 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++

Pelacakan C++ menggunakan Perfetto SDK untuk melacak peristiwa. Tambahkan setelan default pelacakan ke Android.bp:

cc_binary {
...
    defaults: [
...
        "sdv_tracing@cc_defaults",
    ],
...
}

Tentukan kategori. Jika Anda menggunakan kategori di beberapa modul, pindahkan kategori tersebut ke library umum. Misalnya, system/software_defined_vehicle/core_services/samples/tracing/cpp_service/tracing_categories.h.

Di header:

#include "perfetto/tracing/tracing.h"
#include "perfetto/tracing/track_event.h"

PERFETTO_DEFINE_CATEGORIES(
        perfetto::Category("sample")
                .SetTags("tag")
                .SetDescription("Sample events"));

Tempatkan makro penyimpanan statis dalam file sumber .cpp, bukan dalam metode. Jika Anda membagikan kategori di seluruh komponen, gunakan file sumber yang sesuai dengan header dengan kategori.

PERFETTO_TRACK_EVENT_STATIC_STORAGE();

int main() {
    ...
}

Untuk menginisialisasi Perfetto, inisialisasi backend sistem dan daftarkan peristiwa pelacakan:


#include <sdv/tracing_init.h>

int main() {
  ...
  android::sdv::InitPerfettoWithTrackEvents<perfetto::TrackEvent>();
  ...
}

Tambahkan instrumentasi. Lihat contoh lainnya di 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;
}

Seperti dalam contoh Karat, kode ini menghasilkan dua irisan bertingkat dan penanda untuk peristiwa instan di UI. Nilai argumen debug ditampilkan saat peristiwa dipilih.

Mengumpulkan rekaman aktivitas

Gunakan skrip command line record\_android\_trace untuk merekam rekaman aktivitas dan Perfetto web UI untuk melihatnya.

Mengonfigurasi pengambilan

Anda harus menyediakan konfigurasi untuk record_android_trace dalam format textproto. Lihat dokumen Perfetto untuk mempelajari lebih lanjut.

Repositori SDV berisi contoh konfigurasi (system/software_defined_vehicle/core_services/samples/tracing/config/trace_cfg.pbtx). File ini mencakup beberapa sumber data dan dapat disesuaikan atau digunakan apa adanya.

Menggunakan Perfetto UI untuk membuat konfigurasi

Anda dapat mengonfigurasi konfigurasi kustom dan menjelajahi opsi yang tersedia dengan membuka Rekam rekaman aktivitas baru di Perfetto UI, menyesuaikan setelan perekaman dan probe. Kemudian, Anda dapat membuka tampilan "Perintah perekaman" untuk melihat perintah yang dihasilkan dan mendapatkan konten konfigurasi dari sana.

Mengonfigurasi visibilitas instrumentasi dalam aplikasi

Instrumentasi Karat menggunakan ATrace. Instrumentasi ini dikonfigurasi di bagian ftrace_config dokumen. Komponen SDV memiliki tag ATRACE_TAG_APP dan dapat diaktifkan per aplikasi. Contoh konfigurasi mengaktifkan semua aplikasi.

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: "*"
        }
    }
}

Kami menggunakan peristiwa pelacakan di C++ Perfetto SDK. Ini adalah track_event sumber data (dokumen).

Anda dapat mengaktifkan atau menonaktifkan kategori dan tag di track_event_config kolom. Setiap tag akhir kategori diaktifkan secara default, kecuali untuk tag slow dan debug khusus. Jika hanya ingin mengaktifkan kategori tertentu, Anda harus menonaktifkan semua kategori lainnya, misalnya dengan disabled_categories: "*" seperti di sini:

data_sources: {
    config {
        name: "track_event"
        track_event_config {
            enabled_categories: "the_best_category_in_the_world"
            disabled_categories: "*"
        }
    }
}

Merekam rekaman aktivitas

Buka terminal di root repositori Android. Tidak perlu melakukan envsetup. Skrip perekaman ada di external/perfetto/tools/record_android_trace.

Jalankan skrip dengan contoh konfigurasi:

external/perfetto/tools/record_android_trace --config system/software_defined_vehicle/core_services/samples/tracing/config/trace_cfg.pbtx

Untuk menghentikan perekaman lebih awal, pilih Ctrl + C.

Tindakan ini akan memicu adb shell perfetto untuk merekam rekaman aktivitas, lalu menarik rekaman aktivitas ke host, biasanya di ~/traces. Saat rekaman aktivitas dikumpulkan, alat ini akan membuka jendela browser untuk menampilkan rekaman aktivitas.

Argumen yang berguna:

  • -s SERIAL untuk menggunakan perangkat dengan serial tertentu. Misalnya -s 0.0.0.0:6520

  • --no-open-browser akan membuat URL untuk menayangkan rekaman aktivitas, tetapi tidak akan membuka browser. Hal ini berguna untuk sesi jarak jauh saat Anda menyiapkan penerusan port (biasanya 9001).

  • -n, --no-open tidak akan membuka browser atau membuat URL untuk menayangkan rekaman aktivitas setelah sesi pelacakan. Anda tetap dapat membuka file di Perfetto UI dengan mengklik "Open trace file" dan memilih file.

  • -o <path> untuk menetapkan jalur output.

Detail penggunaan

Bagian ini memberikan detail yang mungkin berguna saat menggunakan sistem pelacakan.

Melacak instrumentasi di komponen SDV

Di agen dengan instrumentasi pelacakan, pelacakan tersedia secara default pada build yang dapat di-debug (-eng, -userdebug), kecuali jika ditentukan lain. Saat mengumpulkan rekaman aktivitas, Anda akan melihat peristiwa untuk proses tanpa konfigurasi tambahan.

Library biasanya tidak otomatis menginisialisasi pelacakan. Di Rust, program biner yang menggunakan library harus melakukan inisialisasi pelacakan untuk proses menggunakan sdv_tracing::init_tracing(). Lihat Melengkapi kode Anda untuk mempelajari lebih lanjut.

Middleware

Library Publikasi/Langganan: libsdv_middleware_dt

Acara:

  • Penayang: Memublikasikan dan mendaftarkan topik.
  • Pelanggan: Berlangganan dan melakukan polling.

Mengaktifkan: Panggil sdv_tracing::init_tracing() atau sdv_tracing::try_init_tracing() di program biner.

Library gRPC: libsdvmiddleware_rpc_grpc_transport

Acara:

  • Klien RPC: Memulai, menghubungkan ke server, dan panggilan metode RPC.
  • Server RPC: Memulai, mendaftar dengan Penemuan Layanan, menambahkan dan memanggil metode RPC.

Mengaktifkan: Panggil sdv_tracing::init_tracing() atau sdv_tracing::try_init_tracing() di biner.

SOME/IP
  • Proses: 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
  • Peristiwa: Pemrosesan dan terjemahan pesan, langganan peristiwa.
Pengelola siklus proses
  • Proses: 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
  • Peristiwa: Operasi layanan - meluncurkan, menghentikan, mendaftarkan, membatalkan pendaftaran.
Mode daya kendaraan
  • Proses: 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
  • Peristiwa: Perubahan status daya dan langganan.
Terowongan Data

Kami berencana mendukung integrasi pelacakan di masa mendatang.

Overhead performa pelacakan

Pengukuran overhead dilengkapi dengan peringatan biasa bahwa performa dapat berbeda di berbagai sistem dan terutama antara emulator dan hardware sebenarnya.

Karat

Data tolok ukur mentah tersedia di AOSP. Data dikumpulkan di VM Cuttlefish.

  • Rentang tunggal: tracing::info_span!(), #[tracing::instrument] dan yang serupa:
    • Pelacakan tidak diinisialisasi: 1 ns.
    • Pelacakan diinisialisasi dan dinonaktifkan (tidak ada perekaman rekaman aktivitas): 30 ns.
    • Pelacakan diaktifkan: 3 µs. Anotasi kolom debug dapat menambahkan 1-2 µs, bergantung pada kompleksitas stringifikasi.
  • Peristiwa tunggal: tracing::info!() dan yang serupa:
    • Pelacakan tidak diinisialisasi: 1 ns.
    • Pelacakan diinisialisasi dan dinonaktifkan: 30 ns.
    • Pelacakan diaktifkan: 1,5 µs. Anotasi kolom debug dapat menambahkan 0,5-1 µs, bergantung pada kompleksitas stringification.
C++

Angka performa berasal dari bagian Performa dokumen Peristiwa pelacakan di Perfetto. Waktu untuk Pixel 3 dalam tabel konsisten dengan pengamatan kami di VM Cuttlefish.

Irisan tunggal: TRACE_EVENT() dan yang serupa. Pelacakan:

  • Dinonaktifkan: 2 ns.
  • Diaktifkan: 300 ns. Menggunakan anotasi kolom debug dapat menambahkan 50-100 ns.