Melacak aplikasi .NET dengan PerfCollect

Artikel ini berlaku untuk: ✔️ .NET Core 2.1 SDK dan versi yang lebih baru

Ketika masalah performa ditemui di Linux, mengumpulkan jejak dengan perfcollect dapat digunakan untuk mengumpulkan informasi terperinci tentang apa yang terjadi pada komputer pada saat masalah performa.

perfcollectadalah skrip bash yang menggunakan Linux Trace Toolkit: generasi berikutnya (LTTng) untuk mengumpulkan peristiwa yang ditulis dari runtime atau EventSource apa pun, serta perf untuk mengumpulkan sampel CPU dari proses target.

Siapkan komputer Anda

Ikuti langkah-langkah ini untuk menyiapkan komputer Anda untuk mengumpulkan jejak performa dengan perfcollect.

Catatan

Jika Anda mengambil dari dalam kontainer, kontainer Anda harus memiliki kemampuan yang sesuai. Kemampuan minimal yang diperlukan adalah PERFMON dan SYS_PTRACE. Jika penangkapan gagal dengan set minimal, tambahkan SYS_ADMIN kemampuan ke kontainer. Untuk informasi selengkapnya tentang melacak aplikasi di dalam kontainer menggunakan PerfCollect, lihat Mengumpulkan diagnostik dalam kontainer.

  1. Unduh perfcollect.

    curl -OL https://aka.ms/perfcollect
    
  2. Buat skrip dapat dieksekusi.

    chmod +x perfcollect
    
  3. Instal prasyarat pelacakan - ini adalah pustaka pelacakan aktual.

    sudo ./perfcollect install
    

    Ini akan menginstal prasyarat berikut di komputer Anda:

    1. perf: subsistem Peristiwa Performa Linux dan aplikasi pengumpulan/penampil mode pengguna pendamping. perf adalah bagian dari sumber kernel Linux, tetapi biasanya tidak diinstal secara default.

    2. LTTng: Digunakan untuk mengambil data peristiwa yang dipancarkan pada waktu proses oleh CoreCLR. Data ini kemudian digunakan untuk menganalisis perilaku berbagai komponen runtime seperti GC, JIT, dan kumpulan utas.

Versi terbaru dari .NET Core dan alat linux perf mendukung resolusi otomatis nama metode untuk kode kerangka kerja.

Untuk menyelesaikan nama metode DARI DLL runtime asli (seperti libcoreclr.so), perfcollect akan menyelesaikan simbol untuk mereka ketika mengonversi data, tetapi hanya jika simbol untuk biner ini ada. Lihat Mendapatkan Simbol untuk bagian Runtime Asli untuk detailnya.

Mengumpulkan jejak

  1. Memiliki dua shell yang tersedia - satu untuk mengontrol pelacakan, disebut sebagai [Jejak], dan satu untuk menjalankan aplikasi, disebut sebagai [Aplikasi].

  2. [Pelacakan] Mulai koleksi.

    sudo ./perfcollect collect sampleTrace
    

    Output yang Diharapkan:

    Collection started.  Press CTRL+C to stop.
    
  3. [Aplikasi] Siapkan shell aplikasi dengan variabel lingkungan berikut - ini memungkinkan konfigurasi pelacakan CoreCLR.

    export DOTNET_PerfMapEnabled=1
    export DOTNET_EnableEventLog=1
    

    Catatan

    Saat menjalankan aplikasi dengan .NET 7, Anda juga harus mengatur DOTNET_EnableWriteXorExecute=0 selain variabel lingkungan sebelumnya. Contoh:

    export DOTNET_EnableWriteXorExecute=0
    

    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.

  4. [Aplikasi] Jalankan aplikasi - biarkan berjalan selama yang Anda butuhkan untuk menangkap masalah performa. Panjang yang tepat bisa sesingkat yang Anda butuhkan selama cukup menangkap jendela waktu di mana masalah performa yang ingin Anda selidiki terjadi.

    dotnet run
    
  5. [Pelacakan] Hentikan koleksi - tekan CTRL+C.

    ^C
    ...STOPPED.
    
    Starting post-processing. This may take some time.
    
    Generating native image symbol files
    ...SKIPPED
    Saving native symbols
    ...FINISHED
    Exporting perf.data file
    ...FINISHED
    Compressing trace files
    ...FINISHED
    Cleaning up artifacts
    ...FINISHED
    
    Trace saved to sampleTrace.trace.zip
    

    File pelacakan terkompresi sekarang disimpan di direktori kerja saat ini.

Menampilkan jejak

Ada sejumlah opsi untuk melihat jejak yang dikumpulkan. Jejak paling baik dilihat menggunakan PerfView di Windows, tetapi dapat dilihat langsung di Linux menggunakan PerfCollect dirinya sendiri atau TraceCompass.

Menggunakan PerfCollect untuk melihat file pelacakan

Anda dapat menggunakan perfcollect itu sendiri untuk melihat jejak yang Anda kumpulkan. Untuk melakukan ini, gunakan perintah berikut:

./perfcollect view sampleTrace.trace.zip

Secara default, ini akan menunjukkan jejak CPU aplikasi menggunakan perf.

Untuk melihat peristiwa yang dikumpulkan melalui LTTng, Anda dapat meneruskan bendera -viewer lttng untuk melihat peristiwa individual:

./perfcollect view sampleTrace.trace.zip -viewer lttng

Ini akan menggunakan babeltrace penampil untuk mencetak payload peristiwa:

# [01:02:18.189217659] (+0.020132603) ubuntu-xenial DotNETRuntime:ExceptionThrown_V1: { cpu_id = 0 }, { ExceptionType = "System.Exception", ExceptionMessage = "An exception happened", ExceptionEIP = 139875671834775, ExceptionHRESULT = 2148734208, ExceptionFlags = 16, ClrInstanceID = 0 }
# [01:02:18.189250227] (+0.020165171) ubuntu-xenial DotNETRuntime:ExceptionCatchStart: { cpu_id = 0 }, { EntryEIP = 139873639728404, MethodID = 139873626968120, MethodName = "void [helloworld] helloworld.Program::Main(string[])", ClrInstanceID = 0 }

Menggunakan PerfView untuk membuka file pelacakan

Untuk melihat tampilan agregat sampel CPU dan peristiwa, Anda dapat menggunakannya PerfView di komputer Windows.

  1. Salin file trace.zip dari Linux ke komputer Windows.

  2. Unduh PerfView dari https://aka.ms/perfview.

  3. Jalankan PerfView.exe

    PerfView.exe <path to trace.zip file>
    

PerfView akan menampilkan daftar tampilan yang didukung berdasarkan data yang terkandung dalam file pelacakan.

  • Untuk investigasi CPU, pilih tumpukan CPU.

  • Untuk informasi GC terperinci, pilih GCStats.

  • Untuk informasi JIT per proses/modul/metode, pilih JITStats.

  • Jika tidak ada tampilan untuk informasi yang Anda butuhkan, Anda dapat mencoba mencari peristiwa dalam tampilan peristiwa mentah. Pilih Peristiwa.

Untuk informasi selengkapnya tentang cara menginterpretasikan tampilan di PerfView, lihat tautan bantuan dalam tampilan itu sendiri, atau dari jendela utama di PerfView, pilih Panduan Pengguna Bantuan>.

Catatan

Peristiwa yang ditulis melalui System.Diagnostics.Tracing.EventSource API (termasuk peristiwa dari Framework) tidak akan muncul di bawah nama penyedianya. Sebaliknya, mereka ditulis sebagai EventSourceEvent peristiwa di bawah Microsoft-Windows-DotNETRuntime penyedia dan payload mereka diserialisasikan JSON.

Catatan

Jika Anda mengamati [unknown] /memfd:doublemapper bingkai dalam nama metode dan callstack, atur DOTNET_EnableWriteXorExecute=0 sebelum menjalankan aplikasi yang Anda lacak dengan perfcollect.

Menggunakan TraceCompass untuk membuka file pelacakan

Eclipse TraceCompass adalah opsi lain yang dapat Anda gunakan untuk melihat jejak. TraceCompass bekerja pada komputer Linux juga, jadi Anda tidak perlu memindahkan jejak Anda ke komputer Windows. Untuk menggunakan TraceCompass untuk membuka file pelacakan, Anda harus membuka zip file.

unzip myTrace.trace.zip

perfcollect akan menyimpan jejak LTTng yang dikumpulkan ke dalam format file CTF dalam subdirektori lttngTracedi . Secara khusus, file CTF akan terletak di direktori yang terlihat seperti lttngTrace/auto-20201025-101230\ust\uid\1000\64-bit\.

Anda dapat membuka file pelacakan CTF dengan TraceCompass memilih File -> Open Trace dan memilih metadata file.

Untuk detail selengkapnya, lihat TraceCompass dokumentasi.

Mendapatkan simbol untuk runtime bahasa umum asli

Sebagian besar waktu Anda tertarik dengan kode Anda sendiri, yang perfcollect diselesaikan secara default. Terkadang berguna untuk melihat apa yang terjadi di dalam DLL .NET (yang merupakan bagian terakhir), tetapi kadang-kadang apa yang terjadi di dll runtime asli (biasanya libcoreclr.so), menarik. perfcollect akan menyelesaikan simbol untuk ini ketika mengonversi datanya, tetapi hanya jika simbol untuk DLL asli ini ada (dan berada di samping pustaka tempatnya).

Ada perintah global yang disebut dotnet-symbol yang melakukan ini. Untuk menggunakan simbol dotnet untuk mendapatkan simbol runtime asli:

  1. Instal dotnet-symbol:

    dotnet tool install -g dotnet-symbol
    
  2. Unduh simbol. Jika versi runtime .NET Core yang diinstal adalah 2.1.0, perintah untuk melakukan ini adalah:

    mkdir mySymbols
    dotnet symbol --symbols --output mySymbols  /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0/lib*.so
    
  3. Salin simbol ke tempat yang benar.

    sudo cp mySymbols/* /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0
    

    Jika ini tidak dapat dilakukan karena Anda tidak memiliki akses tulis ke direktori yang sesuai, Anda dapat menggunakan perf buildid-cache untuk menambahkan simbol.

Setelah ini, Anda harus mendapatkan nama simbolis untuk dll asli saat Anda menjalankan perfcollect.

Mengumpulkan dalam kontainer Docker

Untuk informasi selengkapnya tentang cara menggunakan perfcollect di lingkungan kontainer, lihat Mengumpulkan diagnostik dalam kontainer.

Pelajari selengkapnya tentang opsi koleksi

Anda dapat menentukan bendera opsional berikut dengan agar lebih sesuai dengan perfcollect kebutuhan diagnostik Anda.

Kumpulkan untuk durasi tertentu

Saat Anda ingin mengumpulkan jejak untuk durasi tertentu, Anda dapat menggunakan -collectsec opsi diikuti dengan angka yang menentukan total detik untuk mengumpulkan jejak.

Mengumpulkan jejak threadtime

Menentukan -threadtime dengan perfcollect memungkinkan Anda mengumpulkan data penggunaan CPU per utas. Ini memungkinkan Anda menganalisis di mana setiap utas menghabiskan waktu CPU-nya.

Mengumpulkan jejak untuk memori terkelola dan performa pengumpul sampah

Opsi berikut memungkinkan Anda secara khusus mengumpulkan peristiwa GC dari runtime.

  • perfcollect collect -gccollectonly

Kumpulkan hanya satu set minimal peristiwa Koleksi GC. Ini adalah profil pengumpulan peristiwa GC paling sedikit verbose dengan dampak terendah pada performa aplikasi target. Perintah ini dianalogikan dengan PerfView.exe /GCCollectOnly collect perintah di PerfView.

  • perfcollect collect -gconly

Kumpulkan lebih banyak peristiwa pengumpulan GC verbose dengan peristiwa JIT, Loader, dan Pengecualian. Ini meminta lebih banyak peristiwa verbose (seperti informasi alokasi dan informasi gabungan GC) dan akan berdampak lebih besar pada performa aplikasi target daripada -gccollectonly opsi. Perintah ini dianalogikan dengan PerfView.exe /GCOnly collect perintah di PerfView.

  • perfcollect collect -gcwithheap

Kumpulkan peristiwa koleksi GC paling verbose, yang melacak kelangsungan hidup dan gerakan tumpukan juga. Ini memberikan analisis mendalam tentang perilaku GC tetapi akan dikenakan biaya performa tinggi karena setiap GC dapat memakan waktu lebih dari dua kali lebih lama. Sebaiknya Anda memahami implikasi performa menggunakan opsi pelacakan ini saat melacak di lingkungan produksi.