Bagikan melalui


Menyelidiki penghitung kinerja (penghitung dotnet)

Artikel ini berlaku untuk: ✔️ dotnet-counters versi 3.0.47001 dan versi yang lebih baru.

Penghitung dapat dibaca dari aplikasi yang menjalankan .NET 5 atau yang lebih baru.

Instal

Ada tiga cara untuk mengunduh dan menggunakan dotnet-counters:

  • Eksekusi satu bidikan (disarankan):

    Dimulai dengan .NET 10.0.100, Anda dapat menjalankan dotnet-counters tanpa penginstalan permanen menggunakan dnx:

    dnx dotnet-counters [options]
    

    Contohnya:

    dnx dotnet-counters monitor --process-id 1234
    

    Pendekatan ini secara otomatis mengunduh dan menjalankan versi terbaru tanpa memodifikasi sistem Anda secara permanen.

  • alat global dotnet:

    Untuk menginstal versi rilis terbaru paket dotnet-countersNuGet untuk penggunaan yang sering digunakan, gunakan perintah penginstalan alat dotnet :

    dotnet tool install --global dotnet-counters
    

    Perintah ini menginstal dotnet-counters biner ke jalur .NET SDK Tools Anda, yang dapat Anda tambahkan ke PATH Anda untuk dengan mudah memanggil alat yang diinstal secara global.

  • Pengunduhan langsung:

    Unduh alat yang dapat dijalankan yang cocok dengan platform Anda:

    OS Platform
    Windows x86 | x64 | Arm | Arm-x64
    Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64

Catatan

Untuk menggunakan dotnet-counters pada aplikasi x86, Anda memerlukan alat versi x86 yang sesuai.

Sinopsis

dotnet-counters [-h|--help] [--version] <command>

Deskripsi

dotnet-counters adalah alat pemantauan performa untuk pemantauan kesehatan ad-hoc dan penyelidikan performa tingkat pertama. Ini dapat mengamati nilai penghitung kinerja yang diterbitkan melalui EventCounter API atau Meter API. Misalnya, Anda dapat dengan cepat memantau hal-hal seperti penggunaan CPU atau tingkat pengecualian yang dilemparkan di aplikasi .NET Core Anda untuk melihat apakah ada sesuatu yang mencurigakan sebelum menyelami penyelidikan performa yang lebih serius menggunakan PerfView atau dotnet-trace.

Opsi

  • --version

    Menampilkan versi dotnet-counters utilitas.

  • -h|--help

    Tampilkan bantuan baris perintah.

Perintah

Perintah
penghitung dotnet mengumpulkan
monitor penghitung dotnet
dotnet-counters ps

penghitung dotnet mengumpulkan

Kumpulkan nilai penghitung yang dipilih secara berkala dan ekspor ke dalam format file tertentu untuk pasca-pemrosesan.

Sinopsis

dotnet-counters collect [-h|--help] [-p|--process-id] [-n|--name] [--diagnostic-port] [--refresh-interval] [--counters <COUNTERS>] [--format] [-o|--output] [-- <command>]

Opsi

  • -p|--process-id <PID>

    ID proses untuk mengumpulkan data penghitung.

    Catatan

    Di Linux dan macOS, menggunakan opsi ini memerlukan aplikasi target dan dotnet-counters untuk berbagi variabel lingkungan yang sama TMPDIR . Jika tidak, perintah akan kehabisan waktu.

  • -n|--name <name>

    Nama proses untuk mengumpulkan data penghitung.

    Catatan

    Di Linux dan macOS, menggunakan opsi ini memerlukan aplikasi target dan dotnet-counters untuk berbagi variabel lingkungan yang sama TMPDIR . Jika tidak, perintah akan kehabisan waktu.

  • --diagnostic-port <port-address[,(listen|connect)]>

    Mengatur port diagnostik yang digunakan untuk berkomunikasi dengan proses yang akan dipantau. dotnet-counters dan runtime .NET di dalam proses target harus menyetujui alamat port, dengan satu mendengarkan dan yang lainnya menyambungkan. dotnet-counters secara otomatis menentukan port yang benar saat melampirkan menggunakan --process-id opsi atau --name , atau saat meluncurkan proses menggunakan -- <command> opsi . Biasanya hanya perlu menentukan port secara eksplisit saat menunggu proses yang akan dimulai di masa depan atau berkomunikasi ke proses yang berjalan di dalam kontainer yang bukan bagian dari namespace proses saat ini.

    Perbedaannya port-address dengan OS:

    • Linux dan macOS - jalur ke soket domain Unix seperti /foo/tool1.socket.
    • Windows - jalur ke pipa bernama seperti \\.\pipe\my_diag_port1.
    • Android, iOS, dan tvOS - IP:port seperti 127.0.0.1:9000.

    Secara default, dotnet-counters mendengarkan di alamat yang ditentukan. Anda dapat meminta dotnet-counters untuk terhubung sebagai gantinya dengan menambahkan ,connect setelah alamat. Misalnya, --diagnostic-port /foo/tool1.socket,connect akan terhubung ke proses runtime .NET yang mendengarkan /foo/tool1.socket soket domain Unix.

    Untuk informasi tentang cara menggunakan opsi ini untuk mulai memantau penghitung dari pengaktifan aplikasi, lihat menggunakan port diagnostik.

  • --refresh-interval <SECONDS>

    Jumlah detik untuk ditunda antara memperbarui penghitung yang ditampilkan

  • --counters <COUNTERS>

    Daftar penghitung yang dipisahkan koma. Penghitung dapat ditentukan provider_name[:counter_name]. Jika provider_name digunakan tanpa daftar penghitung yang memenuhi syarat, maka semua penghitung dari penyedia ditampilkan. Untuk menemukan nama penyedia dan penghitung, lihat metrik bawaan. Untuk EventCounters, provider_name adalah nama EventSource dan untuk Meter,provider_name adalah nama Meter.

  • --format <csv|json>

    Format yang akan diekspor. Saat ini tersedia: csv, json.

  • -o|--output <output>

    Nama file output.

  • -- <command>

    Setelah parameter konfigurasi koleksi, pengguna dapat menambahkan -- diikuti dengan perintah untuk memulai aplikasi .NET. dotnet-counters meluncurkan proses dengan perintah yang disediakan dan mengumpulkan metrik yang diminta. Ini sering berguna untuk mengumpulkan metrik untuk jalur startup aplikasi dan dapat digunakan untuk mendiagnosis atau memantau masalah yang terjadi lebih awal sebelum atau tidak lama setelah titik masuk utama.

    Catatan

    Menggunakan opsi ini memantau proses .NET pertama yang berkomunikasi kembali ke alat, yang berarti jika perintah Anda meluncurkan beberapa aplikasi .NET, itu hanya akan mengumpulkan aplikasi pertama. Oleh karena itu, disarankan Anda menggunakan opsi ini pada aplikasi mandiri, atau menggunakan dotnet exec <app.dll> opsi .

    Catatan

    Jika Anda meluncurkan .NET executable melalui dotnet-counters, input/output-nya akan dialihkan dan Anda tidak akan dapat berinteraksi dengan stdin/stdout-nya. Anda dapat keluar dari alat melalui Ctrl+C atau SIGTERM untuk mengakhiri alat dan proses anak dengan aman. Jika proses turunan keluar sebelum alat, alat juga akan keluar. Jika Anda perlu menggunakan stdin/stdout, Anda dapat menggunakan opsi --diagnostic-port. Untuk informasi selengkapnya, lihat Menggunakan port diagnostik.

Catatan

Untuk mengumpulkan metrik menggunakan dotnet-counters, metrik perlu dijalankan sebagai pengguna yang sama dengan pengguna yang menjalankan proses target atau sebagai root. Jika tidak, alat akan gagal membuat koneksi dengan proses target.

Contoh

  • Kumpulkan semua penghitung pada interval refresh 3 detik dan hasilkan csv sebagai output:

    > dotnet-counters collect --process-id 1902 --refresh-interval 3 --format csv
    
    --counters is unspecified. Monitoring System.Runtime counters by default.
    Starting a counter session. Press Q to quit.
    
  • Mulai dotnet mvc.dll sebagai proses turunan dan mulai kumpulkan penghitung runtime bahasa umum dan ASP.NET penghitung Core Hosting dari startup dan simpan sebagai output JSON:

    > dotnet-counters collect --format json --counters System.Runtime,Microsoft.AspNetCore.Hosting -- dotnet mvc.dll
    Starting a counter session. Press Q to quit.
    File saved to counter.json
    

monitor penghitung dotnet

Menampilkan nilai yang direfresh secara berkala penghitung terpilih.

Sinopsis

dotnet-counters monitor [-h|--help] [-p|--process-id] [-n|--name] [--diagnostic-port] [--refresh-interval] [--counters] [-- <command>]

Opsi

  • -p|--process-id <PID>

    ID proses yang akan dipantau.

  • -n|--name <name>

    Nama proses yang akan dipantau.

  • --diagnostic-port

    Nama port diagnostik yang akan dibuat. Lihat menggunakan port diagnostik untuk cara menggunakan opsi ini untuk mulai memantau penghitung dari pengaktifan aplikasi.

  • --refresh-interval <SECONDS>

    Jumlah detik untuk ditunda antara memperbarui penghitung yang ditampilkan

  • --counters <COUNTERS>

    Daftar penghitung yang dipisahkan koma. Penghitung dapat ditentukan provider_name[:counter_name]. Jika provider_name digunakan tanpa daftar penghitung yang memenuhi syarat, maka semua penghitung dari penyedia ditampilkan. Untuk menemukan nama penyedia dan penghitung, lihat metrik bawaan. Untuk EventCounters, provider_name adalah nama EventSource dan untuk Meter,provider_name adalah nama Meter.

  • -- <command>

    Setelah parameter konfigurasi koleksi, Anda dapat menambahkan -- diikuti dengan perintah untuk memulai aplikasi .NET. dotnet-counters akan meluncurkan proses dengan perintah yang disediakan dan memantau metrik yang diminta. Ini sering berguna untuk mengumpulkan metrik untuk jalur startup aplikasi dan dapat digunakan untuk mendiagnosis atau memantau masalah yang terjadi lebih awal sebelum atau tidak lama setelah titik masuk utama.

    Catatan

    Menggunakan opsi ini memantau proses .NET pertama yang berkomunikasi kembali ke alat, yang berarti jika perintah Anda meluncurkan beberapa aplikasi .NET, itu hanya akan mengumpulkan aplikasi pertama. Oleh karena itu, disarankan Anda menggunakan opsi ini pada aplikasi mandiri, atau menggunakan dotnet exec <app.dll> opsi .

    Catatan

    Meluncurkan .NET executable melalui dotnet-counters akan mengalihkan input/output-nya dan Anda tidak akan dapat berinteraksi dengan stdin/stdout-nya. Anda dapat keluar dari alat melalui Ctrl+C atau SIGTERM untuk mengakhiri alat dan proses anak dengan aman. Jika proses turunan keluar sebelum alat, alat juga akan keluar. Jika Anda perlu menggunakan stdin/stdout, Anda dapat menggunakan opsi --diagnostic-port. Untuk informasi selengkapnya, lihat Menggunakan port diagnostik.

Catatan

Di Linux dan macOS, perintah ini mengharapkan aplikasi target dan dotnet-counters untuk membagikan variabel lingkungan TMPDIR yang sama.

Catatan

Untuk memantau metrik menggunakan dotnet-counters, metrik perlu dijalankan sebagai pengguna yang sama dengan pengguna yang menjalankan proses target atau sebagai root.

Catatan

Jika Anda melihat pesan kesalahan yang mirip dengan yang berikut ini: [ERROR] System.ComponentModel.Win32Exception (299): A 32 bit processes cannot access modules of a 64 bit process., Anda mencoba menggunakan dotnet-counters bitness yang tidak cocok terhadap proses target. Pastikan untuk mengunduh bitness alat yang benar di link instal.

Contoh

  • Pantau semua penghitung dari System.Runtime pada interval refresh 3 detik:

    > dotnet-counters monitor --process-id 1902  --refresh-interval 3 --counters System.Runtime
    Press p to pause, r to resume, q to quit.
        Status: Running
    Name                                              Current Value
    [System.Runtime]
        dotnet.assembly.count ({assembly})                               115
        dotnet.gc.collections ({collection})
            gc.heap.generation
            ------------------
            gen0                                                           5
            gen1                                                           1
            gen2                                                           1
        dotnet.gc.heap.total_allocated (By)                       1.6947e+08
        dotnet.gc.last_collection.heap.fragmentation.size (By)
            gc.heap.generation
            ------------------
            gen0                                                           0
            gen1                                                     348,248
            gen2                                                           0
            loh                                                           32
            poh                                                            0
        dotnet.gc.last_collection.heap.size (By)
            gc.heap.generation
            ------------------
            gen0                                                           0
            gen1                                                  18,010,920
            gen2                                                   5,065,600
            loh                                                       98,384
            poh                                                    3,407,048
        dotnet.gc.last_collection.memory.committed_size (By)      66,842,624
        dotnet.gc.pause.time (s)                                           0.05
        dotnet.jit.compilation.time (s)                                    1.317
        dotnet.jit.compiled_il.size (By)                             574,886
        dotnet.jit.compiled_methods ({method})                         6,008
        dotnet.monitor.lock_contentions ({contention})                   194
        dotnet.process.cpu.count ({cpu})                                  16
        dotnet.process.cpu.time (s)
            cpu.mode
            --------
            system                                                         4.953
            user                                                           6.266
        dotnet.process.memory.working_set (By)                             1.3217e+08
        dotnet.thread_pool.queue.length ({work_item})                      0
        dotnet.thread_pool.thread.count ({thread})                       133
        dotnet.thread_pool.work_item.count ({work_item})              71,188
        dotnet.timer.count ({timer})                                     124
    

    Catatan

    Jika aplikasi menggunakan .NET versi 8 atau yang lebih rendah, System.Runtime Meter tidak ada dalam versi tersebut dan dotnet-counters akan kembali untuk menampilkan System.Runtime EventCounters yang lebih lama sebagai gantinya. UI terlihat sedikit berbeda, seperti yang ditunjukkan di sini.

    [System.Runtime]
          % Time in GC since last GC (%)                                 0
          Allocation Rate (B / 1 sec)                                5,376
          CPU Usage (%)                                                  0
          Exception Count (Count / 1 sec)                                0
          GC Fragmentation (%)                                          48.467
          GC Heap Size (MB)                                              0
          Gen 0 GC Count (Count / 1 sec)                                 1
          Gen 0 Size (B)                                                24
          Gen 1 GC Count (Count / 1 sec)                                 1
          Gen 1 Size (B)                                                24
          Gen 2 GC Count (Count / 1 sec)                                 1
          Gen 2 Size (B)                                           272,000
          IL Bytes Jitted (B)                                       19,449
          LOH Size (B)                                              19,640
          Monitor Lock Contention Count (Count / 1 sec)                  0
          Number of Active Timers                                        0
          Number of Assemblies Loaded                                    7
          Number of Methods Jitted                                     166
          POH (Pinned Object Heap) Size (B)                             24
          ThreadPool Completed Work Item Count (Count / 1 sec)           0
          ThreadPool Queue Length                                        0
          ThreadPool Thread Count                                        2
          Working Set (MB)                                              19
    
  • Pantau hanya pengumpulan sampah dan alokasi tumpukan pengumpulan sampah dari System.Runtime:

    > dotnet-counters monitor --process-id 1902 --counters System.Runtime[dotnet.gc.collections,dotnet.gc.heap.total_allocated]
    
    Press p to pause, r to resume, q to quit.
    Status: Running
    
    Name                                  Current Value
    [System.Runtime]
        dotnet.gc.collections ({collection})
            gc.heap.generation
            ------------------
            gen0                                0
            gen1                                0
            gen2                                0
        dotnet.gc.heap.total_allocated (By)     9,943,384
    
    
  • Pantau nilai EventCounter dari EventSource yang ditentukan pengguna. Untuk informasi selengkapnya, lihat Tutorial: Mengukur performa menggunakan EventCounters di .NET Core.

    > dotnet-counters monitor --process-id 1902 --counters Samples-EventCounterDemos-Minimal
    
    Press p to pause, r to resume, q to quit.
        request                                      100
    
  • Luncurkan my-aspnet-server.exe dan pantau # rakitan yang dimuat dari startup-nya:

    > dotnet-counters monitor --counters System.Runtime[dotnet.assembly.count] -- my-aspnet-server.exe
    Press p to pause, r to resume, q to quit.
    Status: Running
    
    Name                               Current Value
    [System.Runtime]
    dotnet.assembly.count ({assembly})      11
    
  • Luncurkan my-aspnet-server.exe dengan arg1 dan arg2 sebagai argumen baris perintah dan pantau set kerja dan ukuran tumpukan GC dari startup-nya:

    > dotnet-counters monitor --counters System.Runtime[dotnet.process.memory.working_set,dotnet.gc.last_collection.heap.size] -- my-aspnet-server.exe arg1 arg2
    
    Name                                             Current Value
    [System.Runtime]
        dotnet.gc.last_collection.heap.size (By)
            gc.heap.generation
            ------------------
            gen0                                          560
            gen1                                      462,720
            gen2                                            0
            loh                                             0
            poh                                         8,184
        dotnet.process.memory.working_set (By)     48,431,104
    
    

dotnet-counters ps

Mencantumkan proses dotnet yang dapat dipantau oleh dotnet-counters. dotnet-counters versi 6.0.320703 dan yang lebih baru juga menampilkan argumen baris perintah yang dimulai oleh setiap proses, jika tersedia.

Sinopsis

dotnet-counters ps [-h|--help]

Contoh

Misalkan Anda memulai aplikasi yang berjalan lama menggunakan perintah dotnet run --configuration Release. Di jendela lain, Anda menjalankan perintah dotnet-counters ps. Output yang Anda lihat adalah sebagai berikut. Argumen baris perintah, jika ada, ditampilkan di versi 6.0.320703 dotnet-counters dan yang lebih baru.

> dotnet-counters ps

  21932 dotnet     C:\Program Files\dotnet\dotnet.exe   run --configuration Release
  36656 dotnet     C:\Program Files\dotnet\dotnet.exe

Port diagnostik

Port diagnostik adalah fitur runtime yang memungkinkan Anda untuk mulai memantau atau mengumpulkan penghitung dari startup aplikasi. Untuk melakukan ini menggunakan dotnet-counters, Anda dapat menggunakan dotnet-counters <collect|monitor> -- <command> seperti yang dijelaskan dalam contoh sebelumnya, atau menggunakan --diagnostic-port opsi .

Menggunakan dotnet-counters <collect|monitor> -- <command> untuk meluncurkan aplikasi sebagai proses anak adalah cara paling sederhana untuk memantaunya dengan cepat dari startupnya.

Namun, ketika Anda ingin mendapatkan kontrol yang lebih baik selama masa pakai aplikasi yang dipantau (misalnya, pantau aplikasi selama 10 menit pertama saja dan lanjutkan eksekusi) atau jika Anda perlu berinteraksi dengan aplikasi menggunakan CLI, menggunakan opsi --diagnostic-port memungkinkan Anda mengontrol aplikasi target yang dipantau dan dotnet-counters.

  1. Perintah berikut membuat dotnet-counters soket diagnostik bernama myport.sock dan menunggu koneksi.

    dotnet-counters collect --diagnostic-port myport.sock
    

    Output:

    Waiting for connection on myport.sock
    Start an application with the following environment variable: DOTNET_DiagnosticPorts=/home/user/myport.sock
    
  2. Di konsol terpisah, luncurkan aplikasi target dengan variabel lingkungan DOTNET_DiagnosticPorts yang diatur ke nilai dalam output dotnet-counters.

    export DOTNET_DiagnosticPorts=/home/user/myport.sock
    ./my-dotnet-app arg1 arg2
    

    Hal ini memungkinkan dotnet-counters untuk mulai mengumpulkan penghitung pada my-dotnet-app:

    Waiting for connection on myport.sock
    Start an application with the following environment variable: DOTNET_DiagnosticPorts=myport.sock
    Starting a counter session. Press Q to quit.
    

    Penting

    Meluncurkan aplikasi dotnet run Anda mungkin bermasalah karena CLI dotnet mungkin menelurkan banyak proses anak yang bukan aplikasi Anda dan dapat terhubung ke dotnet-counters sebelum aplikasi Anda, sehingga aplikasi Anda akan ditangguhkan saat runtime. Disarankan agar Anda langsung menggunakan versi aplikasi mandiri atau menggunakan dotnet exec untuk meluncurkan aplikasi.