Sistem performansıyla ilgili analizler edinmek için izlemeyi kullanma

Sistemdeki etkinlikleri ve sayaçları kaydetmek, her birini zaman çizelgesinde görselleştirmek için izlemeyi kullanın. Android'deki standart izleme aracı Perfetto'dur. Daha fazla bilgi edinmek için Tracing 101 (İzleme hakkında temel bilgiler) başlıklı makaleyi inceleyin.

Kodunuza izleme kodu ekleme

Uygulamadan etkinlik almak için koda izleme noktaları eklenerek uygulamanın izlenmesi gerekir. Enstrümanlaştırılmamış bölümler izlerde gösterilmez.

SDV izleme örneği, izleme entegrasyonunun demosudur. Talimatlar ve izleme yapılandırması örneği içerir. system/software_defined_vehicle/core_services/samples/tracing/ konumunda bulunur.

Rust

Rust için önerilen yaklaşım, tracing paketini kullanarak ATrace etkinlikleri yayınlamaktır. Perfetto, veri kaynağı olarak ATrace'i destekler. Rust bağlamaları kullanıma sunulduğunda ve kullanım alanlarının nasıl geliştiğine bağlı olarak Perfetto SDK'ya geçmeyi planlıyoruz.

İzleme varsayılanlarını Android.bp öğesine ekleyin:

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

Aboneyi başlatın. Bu işlem, süreç başına yalnızca bir kez yapılabilir:

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

Başlatma çağrısını atlayabilirsiniz. Bu durumda izleme başlatılmaz ve Perfetto, uygulamadan enstrümantasyon etkinliklerini toplamaz.

İzleme noktaları ekleyin. Daha fazla örneği system/software_defined_vehicle/core_services/samples/tracing/rust_tracing_api_demo/tracing.rs bölümünde bulabilirsiniz.

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++ izleme, etkinlikleri izlemek için Perfetto SDK'sını kullanır. İzleme varsayılanlarını Android.bp'ya ekleyin:

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

Kategorileri tanımlayın. Kategorileri birden fazla modülde kullanıyorsanız bunları ortak bir kitaplığa taşıyın. Örneğin, system/software_defined_vehicle/core_services/samples/tracing/cpp_service/tracing_categories.h.

Başlıkta:

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

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

Statik depolama makrosunu bir yöntemde değil, .cpp kaynak dosyasında kullanın. Kategorileri bileşenler arasında paylaşıyorsanız kategorileri içeren üstbilgiye karşılık gelen kaynak dosyayı kullanın.

PERFETTO_TRACK_EVENT_STATIC_STORAGE();

int main() {
    ...
}

Perfetto'yu başlatmak için sistem arka ucunu başlatın ve izleme etkinliklerini kaydedin:


#include <sdv/tracing_init.h>

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

Enstrümantasyon ekleyin. Daha fazla örneği system/software_defined_vehicle/core_services/samples/tracing/cpp_service/client.cpp adresinde bulabilirsiniz.

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 örneğinde olduğu gibi, bu kod da iki iç içe dilim ve kullanıcı arayüzünde anlık etkinlik için bir işaretçi oluşturur. Bir etkinlik seçildiğinde hata ayıklama bağımsız değişkeni değerleri gösterilir.

İz toplama

İzleme kaydetmek için record\_android\_trace komut satırı komut dosyasını, görüntülemek için ise Perfetto web kullanıcı arayüzünü kullanın.

Kaydı yapılandırma

record_android_trace için textproto biçiminde bir yapılandırma sağlamanız gerekir. Daha fazla bilgi edinmek için Perfetto dokümanına bakın.

SDV deposunda örnek bir yapılandırma (system/software_defined_vehicle/core_services/samples/tracing/config/trace_cfg.pbtx) bulunur. Bu dosya çeşitli veri kaynakları içerir ve özelleştirilebilir veya olduğu gibi kullanılabilir.

Yapılandırma oluşturmak için Perfetto kullanıcı arayüzünü kullanma

Perfetto kullanıcı arayüzünde Yeni izleme kaydet'e gidip kayıt ayarlarını ve probları düzenleyerek özel bir yapılandırma oluşturabilir ve mevcut seçenekleri keşfedebilirsiniz. Ardından, oluşturulan komutu görmek ve yapılandırma içeriklerini almak için "Kayıt komutu" görünümünü açabilirsiniz.

Uygulama içi enstrümantasyon görünürlüğünü yapılandırma

Rust enstrümantasyonu ATrace'i kullanır. Bu, dokümanın ftrace_config bölümünde yapılandırılır. SDV bileşenleri ATRACE_TAG_APP etiketine sahiptir ve uygulama bazında etkinleştirilebilir. Örnek yapılandırma, tüm uygulamaları etkinleştirir.

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'sında izleme etkinliklerini kullanırız. Bu bir track_event veri kaynağıdır (doc).

Kategorileri ve etiketleri track_event_config alanında etkinleştirebilir veya devre dışı bırakabilirsiniz. Özel slow ve debug etiketleri hariç her kategori bitiş etiketi varsayılan olarak etkindir. Yalnızca belirli kategorileri etkinleştirmek istiyorsanız diğer tüm kategorileri devre dışı bırakmanız gerekir. Örneğin, disabled_categories: "*" ile şu şekilde:

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

İz kaydetme

Android deposunun kök dizininde bir terminal açın. envsetup yapmanıza gerek yoktur. Kayıt metni external/perfetto/tools/record_android_trace dilinde.

Komut dosyasını örnek yapılandırmayla çalıştırın:

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

Kaydı erken durdurmak için Ctrl + C tuşlarına basın.

Bu işlem, izlemeyi kaydetmek ve ardından izlemeyi ana makineye (genellikle ~/traces) çekmek için adb shell perfetto komutunu tetikler. İzleme toplandığında araç, izlemeyi görüntülemek için bir tarayıcı penceresi açar.

Faydalı argümanlar:

  • Belirli bir seri numarasına sahip cihazı kullanmak için -s SERIAL. Örneğin -s 0.0.0.0:6520

  • --no-open-browser, izlemeyi sunmak için bir URL oluşturur ancak tarayıcıyı açmaz. Bağlantı noktası yönlendirme ayarınız olduğunda (genellikle 9001) uzak oturumlar için kullanışlıdır.

  • -n, --no-open, tarama oturumundan sonra taramaya hizmet edecek URL'yi oluşturmaz veya tarayıcıyı açmaz. "Open trace file" (İzleme dosyasını aç) seçeneğini tıklayıp dosyayı seçerek Perfetto kullanıcı arayüzünde dosyaları açmaya devam edebilirsiniz.

  • -o <path> simgesini tıklayarak çıktı yolunu ayarlayın.

Kullanım ayrıntıları

Bu bölümde, izleme sistemi kullanılırken faydalı olabilecek ayrıntılar verilmektedir.

SDV bileşenlerinde iz enstrümantasyonu

İzleme enstrümanı olan aracılarda, aksi belirtilmediği sürece izleme, hata ayıklanabilir derlemelerde (-eng, -userdebug) varsayılan olarak kullanılabilir. Bir izleme topladığınızda, ek yapılandırma olmadan işlemlerin etkinliklerini görmeniz gerekir.

Kitaplıklar genellikle izlemeyi otomatik olarak ilk kullanıma hazırlamaz. Rust'ta kitaplığı kullanan ikili programın, sdv_tracing::init_tracing() kullanarak işlem için izlemeyi ilk kullanıma hazırlaması gerekir. Daha fazla bilgi edinmek için Kodunuza izleme kodu ekleme başlıklı makaleyi inceleyin.

Ara katman yazılımı

Yayınlama/Abone Olma Kitaplığı: libsdv_middleware_dt

Etkinlikler:

  • Yayıncı: Konuları yayınlama ve kaydetme.
  • Abone: Abone olma ve anketlere katılma.

Etkinleştirme: İkili programda sdv_tracing::init_tracing() veya sdv_tracing::try_init_tracing() çağrısı yapın.

gRPC Kitaplığı: libsdvmiddleware_rpc_grpc_transport

Etkinlikler:

  • RPC istemcisi: Başlatma, sunucuya bağlanma ve RPC yöntemi çağrıları.
  • RPC sunucusu: Başlatma, hizmet keşfine kaydetme, RPC yöntemleri ekleme ve çağırma.

Etkinleştirme: İkili sistemde sdv_tracing::init_tracing() veya sdv_tracing::try_init_tracing()'ı arayın.

SOME/IP
  • Süreç: sdv_someip_broker_agent. \
  • Etkinlikler: Mesaj işleme ve çeviri, etkinlik aboneliği.
Yaşam döngüsü yöneticisi
  • Süreç: sdv_lifecycle_agent. \
  • Etkinlikler: Hizmet işlemleri (başlatma, durdurma, kaydetme, kaydı silme)
Araç güç modu
  • Süreç: sdv_vpm_agent. \
  • Etkinlikler: Güç durumu değişiklikleri ve abonelikler.
Veri Tüneli

İzleme entegrasyonunu gelecekte desteklemeyi planlıyoruz.

İzlemenin performans ek yükü

Ek yük ölçümleri, performansın farklı sistemlerde ve özellikle emülatör ile gerçek donanım arasında farklılık gösterebileceği uyarısıyla birlikte gelir.

Rust

Ham karşılaştırma verileri AOSP'de mevcuttur. Veriler, Cuttlefish sanal makinesinde toplanmıştır.

  • Tek açıklıklı: tracing::info_span!(), #[tracing::instrument] ve benzerleri:
    • İzleme başlatılmamış: 1 ns.
    • İzleme başlatıldı ve devre dışı bırakıldı (izleme kaydı yapılmıyor): 30 ns.
    • İzleme etkin: 3 µs. Hata ayıklama alanı ek açıklamaları, dizgeleştirme karmaşıklığına bağlı olarak 1-2 µs ekleyebilir.
  • Tek etkinlik: tracing::info!() ve benzerleri:
    • İzleme başlatılmamış: 1 ns.
    • İzleme başlatıldı ve devre dışı bırakıldı: 30 ns.
    • İzleme etkin: 1,5 µsn. Hata ayıklama alanı ek açıklamaları, stringification karmaşıklığına bağlı olarak 0,5-1 µsn ekleyebilir.
C++

Performans sayıları, Perfetto'daki İzleme etkinlikleri dokümanının Performans bölümünden alınmıştır. Tablodaki Pixel 3'e ait süreler, Cuttlefish VM'deki gözlemlerimizle tutarlıdır.

Tek dilim: TRACE_EVENT() ve benzerleri. İzleme:

  • Devre dışı: 2 sn.
  • Etkin: 300 ns. Hata ayıklama alanı ek açıklamalarını kullanmak 50-100 ns ekleyebilir.