Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Alat diagnostik yang sama yang berguna untuk mendiagnosis masalah .NET dalam skenario lain juga berfungsi dalam kontainer. Alat dapat dijalankan dalam kontainer yang sama dengan proses target, dari host, atau dari kontainer sidecar.
Menggunakan alat .NET CLI dalam kontainer
Alat-alat ini berlaku untuk: ✔️ .NET Core 3.1 SDK dan versi yang lebih baru
Semua alat diagnostik CLI dotnet-* dapat berfungsi saat dijalankan dalam kontainer yang sama dengan aplikasi yang mereka periksa tetapi waspadai potensi bintik-bintik masalah ini:
- Alat yang dijalankan di dalam kontainer akan tunduk pada batas sumber daya kontainer. Alat dapat berjalan lambat atau gagal jika batas sumber daya terlalu rendah. Sebagian besar alat memiliki persyaratan sederhana tetapi
dotnet-dumpdandotnet-gcdumpdapat menggunakan memori dan ruang disk yang cukup besar saat menargetkan proses yang memiliki jejak memori besar.dotnet-tracedandotnet-countersmungkin juga membuat file besar jika dikonfigurasi untuk mengambil sejumlah besar peristiwa pelacakan atau data rangkaian waktu metrik. -
dotnet-dumpakan menyebabkan proses pendukung yang membutuhkan izin ptrace berjalan. Linux memiliki banyak opsi konfigurasi keamanan yang dapat memengaruhi apakah ini berhasil sehingga dalam beberapa kasus Anda mungkin perlu menyesuaikan konfigurasi keamanan kontainer. Lihat FAQ dump untuk panduan selengkapnya tentang mendiagnosis hak istimewa keamanan. - Saat menjalankan alat di dalam kontainer, Anda dapat menginstalnya terlebih dahulu saat membangun kontainer atau mengunduhnya sesuai permintaan. Menginstalnya terlebih dahulu membuatnya lebih mudah ketika Anda membutuhkannya tetapi meningkatkan ukuran kontainer dan menciptakan permukaan serangan yang lebih besar yang dapat dieksploitasi oleh aktor jahat.
Gunakan alat .NET CLI di dalam kontainer sidecar atau dari host
Alat diagnostik CLI dotnet-* juga mendukung untuk dijalankan dari host atau dalam kontainer sidecar. Ini sebagian besar menghindari keterbatasan ukuran, keamanan, dan sumber daya yang berjalan dalam kontainer yang sama tetapi memiliki beberapa persyaratan tambahan agar alat berhasil berkomunikasi.
Saat mengidentifikasi proses target untuk diperiksa menggunakan instruksi baris perintah --process-id atau alat --name, ini memerlukan:
- Kontainer harus berbagi namespace proses sehingga alat dalam kontainer sidecar dapat mengakses proses dalam kontainer target.
- Alat ini memerlukan akses ke port diagnostik Unix Domain Socket yang ditulis runtime .NET 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."
Jika Anda tidak ingin berbagi namespace proses dan direktori /tmp , banyak alat juga mendukung opsi baris perintah yang lebih canggih --diagnostic-port . Ini memungkinkan Anda secara langsung menentukan jalur ke port diagnostik dari proses target dalam sistem file pada host atau sidecar. Direktori /tmp dari kontainer target harus dipetakan di suatu tempat agar jalur ini dapat diakses, tetapi tidak harus dibagikan dengan host atau sidecar /tmp.
Catatan
Bahkan saat menjalankan peralatan diagnostik dari host atau sidecar, proses yang dituju mungkin masih diminta untuk melakukan pekerjaan yang meningkatkan penggunaan sumber dayanya di dalam container yang ditargetkan. Kami telah mengamati bahwa dotnet-dump dapat menyebabkan proses target untuk memuat dalam memori virtual dalam jumlah besar saat mengumpulkan dump memori. Alat lain dapat menyebabkan dampak yang lebih kecil meskipun kami belum melihat ini menyebabkan masalah dalam praktiknya. Misalnya, dotnet-trace meminta proses target untuk mengalokasikan buffer peristiwa dan dotnet-counters meminta wilayah memori kecil tempat data metrik dikumpulkan. Kami merekomendasikan pengujian untuk memastikan batas memori Anda tidak terlalu rendah sehingga penggunaan alat menyebabkan OS menghentikan kontainer Anda.
Catatan
Saat dotnet-dump menulis file cadangan ke disk, jalur output ditafsirkan dalam konteks tampilan proses target dari sistem file. Ini mungkin berbeda dengan kontainer host atau sidecar.
Gunakan PerfCollect dalam kontainer
Alat ini berlaku untuk: ✔️ .NET Core 2.1 dan versi yang lebih baru
PerfCollect Skrip berguna untuk mengumpulkan jejak performa yang berisi peristiwa kernel seperti sampel CPU atau sakelar konteks. Jika menggunakan PerfCollect dalam kontainer, ingatlah persyaratan berikut:
PerfCollectmemerlukan kemampuan tambahan untuk menjalankanperf. Serangkaian kemampuan minimal yang diperlukan adalahPERFMONdanSYS_PTRACE. Beberapa lingkungan memerlukanSYS_ADMIN. Pastikan untuk memulai kontainer dengan kemampuan yang diperlukan. Jika set minimal tidak berfungsi, coba dengan set lengkap.PerfCollectmengharuskan beberapa variabel lingkungan diatur sebelum aplikasi dimulai pembuatan profil. Ini dapat diatur baik di Dockerfile atau saat Anda 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=1DOTNET_EnableEventLog=1
Catatan
Saat menjalankan aplikasi dengan .NET 7, Anda juga harus mengatur DOTNET_EnableWriteXorExecute=0 selain variabel lingkungan sebelumnya.
Gunakan PerfCollect dalam kontainer sidecar
Jika Anda ingin menjalankan PerfCollect dalam satu kontainer untuk membuat profil proses .NET dalam kontainer yang berbeda, pengalamannya hampir sama. Perbedaannya adalah:
- Variabel lingkungan yang disebutkan sebelumnya (
DOTNET_PerfMapEnableddanDOTNET_EnableEventLog) harus diatur untuk kontainer target (bukan yang berjalanPerfCollect). - Kontainer yang berjalan
PerfCollectharus memiliki kemampuanSYS_ADMIN(bukan pada kontainer target). - Dua kontainer harus berbagi ruang proses namespace.