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.
perfcollect
adalah 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.
Unduh
perfcollect
.curl -OL https://aka.ms/perfcollect
Buat skrip dapat dieksekusi.
chmod +x perfcollect
Instal prasyarat pelacakan - ini adalah pustaka pelacakan aktual.
sudo ./perfcollect install
Ini akan menginstal prasyarat berikut di komputer Anda:
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.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
Memiliki dua shell yang tersedia - satu untuk mengontrol pelacakan, disebut sebagai [Jejak], dan satu untuk menjalankan aplikasi, disebut sebagai [Aplikasi].
[Pelacakan] Mulai koleksi.
sudo ./perfcollect collect sampleTrace
Output yang Diharapkan:
Collection started. Press CTRL+C to stop.
[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_
daripadaCOMPlus_
untuk variabel lingkungan yang mengonfigurasi perilaku run-time .NET. Namun, prefiksCOMPlus_
akan terus berfungsi. Jika Anda menggunakan versi runtime .NET sebelumnya, Anda masih harus menggunakan prefiksCOMPlus_
untuk variabel lingkungan.[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
[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.
Salin file trace.zip dari Linux ke komputer Windows.
Unduh PerfView dari https://aka.ms/perfview.
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 lttngTrace
di . 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:
Instal
dotnet-symbol
:dotnet tool install -g dotnet-symbol
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
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.