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 bagaimana 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 berfungsi langsung di kontainer Docker. Karena itu, alat-alat ini adalah metode yang disukai 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-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 sespan

Jika Anda ingin menggunakan alat diagnostik CLI global .NET Core untuk mendiagnosis proses dalam kontainer yang berbeda, perhatikan 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 sespan 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:

  • PerfCollectSYS_ADMIN membutuhkan kemampuan (untuk menjalankan perf alat), jadi pastikan kontainer dimulai dengan kemampuan tersebut.

  • 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

    .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 sespan

Jika Anda ingin menjalankan PerfCollect dalam satu kontainer untuk memprofilkan 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).
  • Kedua kontainer harus berbagi namespace proses.

Menggunakan createdump dalam kontainer

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

Alternatif untuk dotnet-dump, createdump dapat digunakan untuk membuat cadangan inti di Linux yang berisi informasi asli dan terkelola. Alat createdump ini diinstal dengan runtime .NET Core dan dapat ditemukan di samping libcoreclr.so (biasanya di "/usr/share/dotnet/shared/Microsoft.NETCore.App/[version]"). Alat ini bekerja sama dalam kontainer seperti di lingkungan Linux non-kontainer dengan pengecualian tunggal yang diperlukan SYS_PTRACE alat, sehingga kontainer Docker harus dimulai dengan kemampuan tersebut.

Menggunakan createdump dalam kontainer sespan

Jika Anda ingin menggunakan createdump untuk membuat cadangan dari proses dalam kontainer yang berbeda, pengalamannya hampir sama kecuali untuk perbedaan ini:

  • Kontainer yang berjalan createdump harus memiliki SYS_PTRACE kemampuan (bukan kontainer target).
  • Kedua kontainer harus berbagi namespace proses.