Bagikan melalui


EventPipe

EventPipe adalah komponen runtime yang dapat digunakan untuk mengumpulkan data pelacakan, mirip dengan ETW atau LTTng. Tujuan dari EventPipe adalah untuk memungkinkan pengembang .NET dengan mudah melacak aplikasi .NET mereka tanpa harus mengandalkan komponen OS-native khusus platform seperti ETW atau LTTng.

EventPipe adalah mekanisme di balik banyak alat diagnostik dan dapat digunakan untuk mengonsumsi peristiwa yang dipancarkan oleh runtime serta peristiwa kustom yang ditulis dengan EventSource.

Artikel ini adalah gambaran umum tingkat tinggi dari EventPipe. Ini menjelaskan kapan dan bagaimana menggunakan EventPipe, dan cara mengonfigurasinya agar paling sesuai dengan kebutuhan Anda.

Dasar-dasar EventPipe

Peristiwa agregat EventPipe yang dipancarkan oleh komponen runtime - misalnya, kompilator Just-In-Time atau pengumpul sampah - dan peristiwa yang ditulis dari instans EventSource di pustaka dan kode pengguna.

Peristiwa kemudian diserialisasikan dalam .nettrace format file dan dapat ditulis langsung ke file atau dialirkan melalui port diagnostik untuk konsumsi di luar proses.

Untuk mempelajari selengkapnya tentang format serialisasi EventPipe, lihat dokumentasi format EventPipe.

EventPipe vs. ETW/LTTng

EventPipe adalah bagian dari runtime .NET (CoreCLR) dan dirancang untuk bekerja dengan cara yang sama di semua platform yang didukung .NET Core. Ini memungkinkan alat pelacakan berdasarkan EventPipe, seperti dotnet-counters, , dotnet-gcdumpdan dotnet-trace, untuk bekerja dengan mulus di seluruh platform.

Namun, karena EventPipe adalah komponen bawaan runtime, cakupannya terbatas pada kode terkelola dan runtime itu sendiri. EventPipe tidak dapat digunakan untuk melacak beberapa peristiwa tingkat bawah, seperti menyelesaikan tumpukan kode asli atau mendapatkan berbagai peristiwa kernel. Jika Anda menggunakan interop C/C++ di aplikasi atau ingin melacak runtime itu sendiri (yang ditulis dalam C++), atau ingin diagnostik yang lebih dalam ke dalam perilaku aplikasi yang memerlukan peristiwa kernel (yaitu, peristiwa peralihan konteks utas asli) Anda harus menggunakan ETW atau perf/LTTng.

Perbedaan utama lainnya antara EventPipe dan ETW/LTTng adalah persyaratan hak istimewa admin/root. Untuk melacak aplikasi menggunakan ETW atau LTTng, Anda harus menjadi admin/root. Dengan menggunakan EventPipe, Anda dapat melacak aplikasi selama pelacak (misalnya, dotnet-trace) dijalankan sebagai pengguna yang sama dengan pengguna yang meluncurkan aplikasi.

Tabel berikut adalah ringkasan perbedaan antara EventPipe dan ETW/LTTng.

Fitur EventPipe ETW LTTng
Lintas platform Ya Tidak (hanya pada Windows) Tidak (hanya pada distro Linux yang didukung)
Memerlukan hak istimewa admin/root Tidak Ya Ya
Bisa mendapatkan peristiwa OS/kernel Tidak Ya Ya
Dapat mengatasi tumpukan panggilan asli Tidak Ya Ya

Menggunakan EventPipe untuk melacak aplikasi .NET Anda

Anda dapat menggunakan EventPipe untuk melacak aplikasi .NET Anda dalam banyak cara:

Setelah membuat nettrace file yang berisi peristiwa EventPipe, Anda dapat melihat file di PerfView atau Visual Studio. Di platform non-Windows, Anda dapat mengonversi nettrace file ke speedscope format atau Chromium melacak dengan menggunakan perintah konversi dotnet-trace dan melihatnya dengan speedscope atau Chrome DevTools.

Anda juga dapat menganalisis jejak EventPipe secara terprogram dengan TraceEvent.

Alat yang menggunakan EventPipe

Ini adalah cara term mudah untuk menggunakan EventPipe untuk melacak aplikasi Anda. Untuk mempelajari selengkapnya tentang cara menggunakan masing-masing alat ini, lihat dokumentasi setiap alat.

  • dotnet-counters memungkinkan Anda memantau dan mengumpulkan berbagai metrik yang dipancarkan oleh runtime .NET dan pustaka inti, serta metrik kustom yang dapat Anda tulis.

  • dotnet-gcdump memungkinkan Anda mengumpulkan cadangan timbunan GC dari proses langsung untuk menganalisis timbunan terkelola aplikasi.

  • dotnet-trace memungkinkan Anda mengumpulkan jejak aplikasi untuk menganalisis performa.

Melacak menggunakan variabel lingkungan

Mekanisme yang disukai untuk menggunakan EventPipe adalah menggunakan dotnet-trace atau pustaka Microsoft.Diagnostics.NETCore.Client .

Namun, Anda dapat menggunakan variabel lingkungan berikut untuk menyiapkan sesi EventPipe pada aplikasi dan membuatnya menulis jejak langsung ke file. Untuk menghentikan pelacakan, keluar dari aplikasi.

  • DOTNET_EnableEventPipe: Atur ini ke 1 untuk memulai sesi EventPipe yang menulis langsung ke file. Nilai defaultnya adalah 0.

  • DOTNET_EventPipeOutputPath: Jalur ke file pelacakan EventPipe output saat dikonfigurasi untuk dijalankan melalui DOTNET_EnableEventPipe. Nilai defaultnya adalah trace.nettrace, yang akan dibuat di direktori yang sama dengan tempat aplikasi berjalan.

    Catatan

    Karena .NET 6, instans string {pid} di DOTNET_EventPipeOutputPath diganti dengan id proses proses yang sedang dilacak.

  • DOTNET_EventPipeCircularMB: Nilai heksadesimal yang mewakili ukuran buffer internal EventPipe dalam megabyte. Nilai konfigurasi ini hanya digunakan ketika EventPipe dikonfigurasi untuk dijalankan melalui DOTNET_EnableEventPipe. Ukuran buffer default adalah 1024MB yang diterjemahkan ke variabel lingkungan ini diatur ke 400, karena == 0x4001024 .

    Catatan

    Jika proses target menulis peristiwa terlalu sering, proses ini dapat meluapkan buffer ini dan beberapa peristiwa mungkin dihilangkan. Jika terlalu banyak peristiwa yang dihilangkan, tingkatkan ukuran buffer untuk melihat apakah jumlah peristiwa yang dihilangkan berkurang. Jika jumlah peristiwa yang dihilangkan tidak berkurang dengan ukuran buffer yang lebih besar, itu mungkin karena pembaca lambat yang mencegah buffer proses target dibersihkan.

  • DOTNET_EventPipeProcNumbers: Atur ini ke 1 untuk mengaktifkan pengambilan nomor prosesor di header peristiwa EventPipe. Nilai defaultnya adalah 0.

  • DOTNET_EventPipeConfig: Menyiapkan konfigurasi sesi EventPipe saat memulai sesi EventPipe dengan DOTNET_EnableEventPipe. Sintaksisnya adalah sebagai berikut:

    <provider>:<keyword>:<level>

    Anda juga dapat menentukan beberapa penyedia dengan menggabungkannya dengan koma:

    <provider1>:<keyword1>:<level1>,<provider2>:<keyword2>:<level2>

    Jika variabel lingkungan ini tidak diatur tetapi EventPipe diaktifkan oleh DOTNET_EnableEventPipe, variabel akan mulai melacak dengan mengaktifkan penyedia berikut dengan kata kunci dan tingkat berikut:

    • Microsoft-Windows-DotNETRuntime:4c14fccbd:5
    • Microsoft-Windows-DotNETRuntimePrivate:4002000b:5
    • Microsoft-DotNETCore-SampleProfiler:0:5

    Untuk mempelajari lebih lanjut tentang beberapa penyedia terkenal di .NET, lihat Penyedia Peristiwa terkenal.

Catatan

.NET 6 menstandarkan pada prefiks DOTNET_ daripada COMPlus_ untuk variabel lingkungan yang mengonfigurasi perilaku run-time .NET. Namun, prefiks COMPlus_ akan terus berfungsi. Jika Anda menggunakan versi runtime .NET sebelumnya, Anda masih harus menggunakan prefiks COMPlus_ untuk variabel lingkungan.