Mengumpulkan diagnostik dalam kontainer

Alat diagnostik yang sama yang berguna untuk mendiagnosis masalah .NET Core dalam skenario lain juga berfungsi di kontainer Docker. Namun, beberapa alat memerlukan langkah-langkah khusus untuk bekerja dalam kontainer. Artikel ini membahas cara alat untuk mengumpulkan jejak performa dan mengumpulkan cadangan dapat digunakan dalam kontainer Docker.

Menggunakan alat .NET CLI dalam kontainer

Alat-alat ini berlaku untuk: ✔️ .NET Core 3.1 SDK dan versi yang lebih baru

Alat diagnostik CLI global .NET Core (penghitung dotnet, dotnet-dump, dotnet-gcdump, dotnet-monitor, dan dotnet-trace) dirancang untuk bekerja di berbagai lingkungan dan semuanya harus bekerja langsung dalam kontainer Docker. Karena itu, alat-alat ini adalah metode pilihan untuk mengumpulkan informasi diagnostik untuk skenario .NET Core yang menargetkan .NET Core 3.1 atau yang lebih baru dalam kontainer.

Anda juga dapat menginstal alat ini tanpa .NET SDK dengan mengunduh varian file tunggal dari tautan di paragraf sebelumnya. Penginstalan ini memerlukan penginstalan global runtime .NET versi 3.1 atau yang lebih baru, yang dapat Anda peroleh mengikuti salah satu metode yang ditentukan dalam dokumentasi penginstalan .NET atau dengan menggunakan salah satu kontainer runtime resmi.

Menggunakan alat CLI global .NET Core dalam kontainer sidecar

Jika Anda ingin menggunakan alat diagnostik CLI global .NET Core untuk mendiagnosis proses dalam kontainer yang berbeda, ingatlah persyaratan tambahan berikut:

  1. Kontainer harus berbagi namespace proses (sehingga alat dalam kontainer sidecar dapat mengakses proses dalam kontainer target).
  2. Alat diagnostik CLI global .NET Core memerlukan akses ke file yang ditulis runtime .NET Core ke direktori /tmp, sehingga direktori /tmp harus dibagi antara target dan kontainer sidecar melalui pemasangan volume. Ini dapat dilakukan, misalnya, dengan meminta kontainer berbagi volume umum atau volume Kubernetes emptyDir. Jika Anda mencoba menggunakan alat diagnostik dari kontainer sidecar tanpa berbagi direktori /tmp, Anda akan mendapatkan kesalahan tentang proses "tidak menjalankan runtime .NET yang kompatibel."

Menggunakan PerfCollect dalam kontainer

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

PerfCollect Skrip ini berguna untuk mengumpulkan jejak performa dan merupakan alat yang direkomendasikan untuk mengumpulkan jejak sebelum .NET Core 3.0. Jika menggunakan PerfCollect dalam kontainer, ingatlah persyaratan berikut:

  • PerfCollect memerlukan kemampuan tambahan untuk menjalankan perf alat. Serangkaian kemampuan minimal yang diperlukan adalah PERFMON dan SYS_PTRACE. Beberapa lingkungan memerlukan SYS_ADMIN. Pastikan untuk memulai kontainer dengan kemampuan yang diperlukan. Jika set minimal tidak berfungsi, coba dengan set lengkap.

  • PerfCollect mengharuskan beberapa variabel lingkungan diatur sebelum aplikasi dimulai pembuatan profil. Ini dapat diatur baik di Dockerfile atau saat memulai kontainer. Karena variabel ini tidak boleh diatur di lingkungan produksi normal, biasanya hanya menambahkannya saat memulai kontainer yang akan diprofilkan. Dua variabel yang diperlukan PerfCollect adalah:

    • DOTNET_PerfMapEnabled=1
    • DOTNET_EnableEventLog=1

Catatan

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

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.

Menggunakan PerfCollect dalam kontainer sidecar

Jika Anda ingin menjalankan PerfCollect dalam satu kontainer untuk membuat profil proses .NET Core dalam kontainer yang berbeda, pengalamannya hampir sama kecuali untuk perbedaan ini:

  • Variabel lingkungan yang disebutkan sebelumnya (DOTNET_PerfMapEnabled dan DOTNET_EnableEventLog) harus diatur untuk kontainer target (bukan yang berjalan PerfCollect).
  • Kontainer yang berjalan PerfCollect harus memiliki SYS_ADMIN kemampuan (bukan kontainer target).
  • Dua kontainer harus berbagi namespace proses.