EventPipe
EventPipe adalah komponen runtime yang dapat digunakan untuk mengumpulkan data pelacakan, mirip dengan ETW atau perf_events. Tujuan dari EventPipe adalah untuk memungkinkan pengembang .NET dengan mudah melacak aplikasi .NET mereka tanpa harus mengandalkan komponen hak istimewa tinggi khusus platform seperti ETW atau perf_events.
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/perf_events
EventPipe adalah bagian dari runtime .NET 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-gcdump
dan 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. Peristiwa EventPipe hanya menyertakan stacktrace dengan informasi bingkai kode terkelola. Jika Anda ingin peristiwa yang dihasilkan dari pustaka mode pengguna lain yang tidak dikelola, pengambilan sampel CPU untuk kode asli, atau peristiwa kernel, Anda harus menggunakan alat pelacakan khusus OS seperti ETW atau perf_events. Di Linux alat perfcollect membantu mengotomatiskan menggunakan perf_events dan LTTng.
Perbedaan utama lainnya antara EventPipe dan ETW/perf_events adalah persyaratan hak istimewa admin/root. Untuk melacak aplikasi menggunakan ETW atau perf_events 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/perf_events.
Fitur | EventPipe | ETW | perf_events |
---|---|---|---|
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:
Gunakan salah satu alat diagnostik yang dibangun di atas EventPipe.
Gunakan pustaka Microsoft.Diagnostics.NETCore.Client untuk menulis alat Anda sendiri untuk mengonfigurasi dan memulai sesi EventPipe.
Gunakan variabel lingkungan untuk memulai EventPipe.
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 ke1
untuk memulai sesi EventPipe yang menulis langsung ke file. Nilai defaultnya adalah0
.DOTNET_EventPipeOutputPath
: Jalur ke file pelacakan EventPipe output saat dikonfigurasi untuk dijalankan melaluiDOTNET_EnableEventPipe
. Nilai defaultnya adalahtrace.nettrace
, yang akan dibuat di direktori yang sama dengan tempat aplikasi berjalan.Catatan
Karena .NET 6, instans string
{pid}
diDOTNET_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 melaluiDOTNET_EnableEventPipe
. Ukuran buffer default adalah 1024MB yang diterjemahkan ke variabel lingkungan ini diatur ke400
, karena ==0x400
1024
.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 ke1
untuk mengaktifkan pengambilan nomor prosesor di header peristiwa EventPipe. Nilai defaultnya adalah0
.DOTNET_EventPipeConfig
: Menyiapkan konfigurasi sesi EventPipe saat memulai sesi EventPipe denganDOTNET_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.