次の方法で共有


パフォーマンス カウンターを調べる (dotnet-counters)

に適用されます。

カウンターは、.NET 5 以降を実行しているアプリケーションから読み取ることができます。

インストール

dotnet-countersをダウンロードして使用するには、次の 3 つの方法があります。

  • ワンショット実行 (推奨):

    .NET 10.0.100 以降では、dnxを使用して、永続的なインストールなしでdotnet-countersを実行できます。

    dnx dotnet-counters [options]
    

    例えば次が挙げられます。

    dnx dotnet-counters monitor --process-id 1234
    

    この方法では、システムを完全に変更することなく、最新バージョンが自動的にダウンロードされて実行されます。

  • dotnet グローバル ツール:

    頻繁に使用するために dotnet-countersNuGet パッケージ の最新リリース バージョンをインストールするには、 dotnet ツールのインストール コマンドを使用します。

    dotnet tool install --global dotnet-counters
    

    このコマンドは、 dotnet-counters バイナリを .NET SDK Tools パスにインストールします。これを PATH に追加して、グローバルにインストールされたツールを簡単に呼び出すことができます。

  • 直接ダウンロード:

    ご利用のプラットフォームに適したツールの実行可能ファイルをダウンロードします。

    OS プラットフォーム
    Windows x86 | x64 | Arm | Arm-x64
    Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64

注意

x86 アプリ上で dotnet-counters を使用するには、対応する x86 バージョンのツールが必要です。

構文

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

説明

dotnet-counters は、アドホックな正常性監視と第 1 レベルのパフォーマンス調査のためのパフォーマンス監視ツールです。 EventCounter API または Meter API を使用して公開されたパフォーマンス カウンターの値を監視できます。 たとえば、CPU 使用率や .NET Core アプリケーションでスローされる例外の発生率などを迅速に監視して、PerfView または dotnet-trace を使用した、より重大なパフォーマンス調査を開始する前に疑わしいものがあるかどうかを確認できます。

オプション

  • --version

    dotnet-counters ユーティリティのバージョンを表示します。

  • -h|--help

    コマンド ライン ヘルプを表示します。

コマンド

コマンド
dotnet-counters collect
dotnet-counters モニター
dotnet-counters ps

dotnet-counters collect

選択されたカウンター値を定期的に収集し、後処理用に指定されたファイル形式にエクスポートします。

構文

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

オプション

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

    カウンター データを収集するプロセスの ID。

    注意

    Linux と macOS では、このオプションを使用するには、ターゲット アプリケーションと dotnet-counters が同じ TMPDIR 環境変数を共有する必要があります。 それ以外の場合、このコマンドはタイムアウトします。

  • -n|--name <name>

    カウンター データを収集するプロセスの名前。

    注意

    Linux と macOS では、このオプションを使用するには、ターゲット アプリケーションと dotnet-counters が同じ TMPDIR 環境変数を共有する必要があります。 それ以外の場合、このコマンドはタイムアウトします。

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

    監視するプロセスとの通信に使用する 診断ポート を設定します。 dotnet-counters とターゲット プロセス内の .NET ランタイムは、ポート アドレスに同意し、1 つはリッスンし、もう 1 つは接続する必要があります。 dotnet-counters は、 --process-id または --name オプションを使用して接続するとき、または -- <command> オプションを使用してプロセスを起動するときに、正しいポートを自動的に決定します。 通常、ポートを明示的に指定する必要があるのは、将来開始されるプロセスを待機するとき、または現在のプロセス名前空間の一部ではないコンテナー内で実行されているプロセスと通信する場合のみです。

    port-addressは OS によって異なります。

    • Linux と macOS - /foo/tool1.socketなどの Unix ドメイン ソケットへのパス。
    • Windows - \\.\pipe\my_diag_port1などの名前付きパイプへのパス。
    • Android、iOS、tvOS - 127.0.0.1:9000などの IP:port。

    既定では、 dotnet-counters は指定したアドレスでリッスンします。 アドレスの後にdotnet-countersを追加することで、代わりに接続する,connectを要求できます。 たとえば、 --diagnostic-port /foo/tool1.socket,connect は、 /foo/tool1.socket Unix ドメイン ソケットをリッスンしている .NET ランタイム プロセスに接続します。

    このオプションを使用してアプリの起動時からカウンターの監視を開始する方法については、 診断ポートの使用を参照してください。

  • --refresh-interval <SECONDS>

    表示されているカウンターを更新するまでの遅延時間 (秒数)

  • --counters <COUNTERS>

    カウンターのコンマ区切りのリスト。 カウンターは provider_name[:counter_name] で指定できます。 provider_name をカウンターの限定リストを指定せずに使用した場合、そのプロバイダーのすべてのカウンターが表示されます。 プロバイダー名とカウンター名を検出するには、 組み込みのメトリックを参照してください。 EventCounters の場合、provider_nameは EventSource の名前、メートルの場合は provider_name はメーターの名前です。

  • --format <csv|json>

    エクスポートされる形式。 現在使用可能: csv、json。

  • -o|--output <output>

    出力ファイルの名前。

  • -- <command>

    コレクション構成パラメーターの後に、ユーザーは -- を追加し、その後に .NET アプリケーションを起動するコマンドを追加できます。 dotnet-counters は、指定されたコマンドを使用してプロセスを起動し、要求されたメトリックを収集します。 これは多くの場合、アプリケーションのスタートアップ パスのメトリックを収集するのに役立ち、メイン エントリ ポイントの前または直後に発生する問題を診断または監視するために使用できます。

    注意

    このオプションを使用すると、ツールに通信する最初の .NET プロセスが監視されます。つまり、コマンドが複数の .NET アプリケーションを起動した場合、最初のアプリのみが収集されます。 そのため、自己完結型アプリケーションではこのオプションを使用するか、 dotnet exec <app.dll> オプションを使用することをお勧めします。

    注意

    dotnet-countersを使用して .NET 実行可能ファイルを起動すると、その入力/出力がリダイレクトされ、stdin/stdout と対話できなくなります。 Ctrl + C または SIGTERM を使用してツールを終了すると、ツールと子プロセスの両方を安全に終了できます。 ツールの前に子プロセスが終了すると、ツールも終了します。 stdin/stdout を使用する必要がある場合は、--diagnostic-port オプションを使用します。 詳細については、「 診断ポートの使用」を参照してください。

注意

dotnet-counters を使用してメトリックを収集するには、ターゲット プロセスを実行しているユーザーと同じユーザーとして、またはルートとしてそれを実行する必要があります。 それ以外の場合、このツールでターゲット プロセスとの接続を確立することはできません。

使用例

  • すべてのカウンターを更新間隔 3 秒で収集し、csv を出力として生成します。

    > 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.
    
  • 子プロセスとして dotnet mvc.dll を開始し、起動時からランタイム カウンターと ASP.NET Core ホスティング カウンターの収集を開始し、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
    

dotnet-counters モニター

選択したカウンターの定期的に更新される値を表示します。

構文

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

オプション

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

    監視するプロセスの ID。

  • -n|--name <name>

    監視するプロセスの名前。

  • --diagnostic-port

    作成する診断ポートの名前。 このオプションを使用し、アプリの起動からカウンターの監視を開始する方法については、「診断ポートの使用」を参照してください。

  • --refresh-interval <SECONDS>

    表示されているカウンターを更新するまでの遅延時間 (秒数)

  • --counters <COUNTERS>

    カウンターのコンマ区切りのリスト。 カウンターは provider_name[:counter_name] で指定できます。 provider_name をカウンターの限定リストを指定せずに使用した場合、そのプロバイダーのすべてのカウンターが表示されます。 プロバイダー名とカウンター名を検出するには、 組み込みのメトリックを参照してください。 EventCounters の場合、provider_nameは EventSource の名前、メートルの場合は provider_name はメーターの名前です。

  • -- <command>

    コレクション構成パラメーターの後に、.NET アプリケーションを起動するコマンド -- 続けて追加できます。 dotnet-counters を使用して、指定したコマンドでプロセスを起動し、要求したメトリックを監視します。 これは多くの場合、アプリケーションのスタートアップ パスのメトリックを収集するのに役立ち、メイン エントリ ポイントの前または直後に発生する問題を診断または監視するために使用できます。

    注意

    このオプションを使用すると、ツールに通信する最初の .NET プロセスが監視されます。つまり、コマンドが複数の .NET アプリケーションを起動した場合、最初のアプリのみが収集されます。 そのため、自己完結型アプリケーションではこのオプションを使用するか、 dotnet exec <app.dll> オプションを使用することをお勧めします。

    注意

    dotnet-countersを介して .NET 実行可能ファイルを起動すると、その入力/出力がリダイレクトされ、stdin/stdout と対話できなくなります。 Ctrl + C または SIGTERM を使用してツールを終了すると、ツールと子プロセスの両方を安全に終了できます。 ツールの前に子プロセスが終了すると、ツールも終了します。 stdin/stdout を使用する必要がある場合は、--diagnostic-port オプションを使用します。 詳細については、「 診断ポートの使用」を参照してください。

注意

Linux と macOS 上でこのコマンドを使用するには、ターゲット アプリケーションと dotnet-counters で同じ TMPDIR 環境変数が共有されることが前提とされています。

注意

dotnet-counters を使用してメトリックを監視するには、ターゲット プロセスを実行しているユーザーと同じユーザーとして、またはルートとしてそれを実行する必要があります。

注意

[ERROR] System.ComponentModel.Win32Exception (299): A 32 bit processes cannot access modules of a 64 bit process.のようなエラー メッセージが表示された場合は、ターゲット プロセスに対してビット数が一致しないdotnet-countersを使用しようとしています。 「インストール」のリンクで、正しいビットのツールをダウンロードしてください。

使用例

  • 3 秒の更新間隔で System.Runtime のすべてのカウンターを監視します。

    > 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
    

    注意

    アプリで .NET バージョン 8 以前を使用している場合、 System.Runtime Meter はそれらのバージョンには存在せず、 dotnet-counters はフォールバックして古い System.Runtime EventCounters を 代わりに表示します。 次に示すように、UI は若干異なります。

    [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
    
  • 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
    
    
  • ユーザー定義の EventCounterEventSource 値を監視します。 詳しくは、「チュートリアル: .NET Core で EventCounters を使用してパフォーマンスを測定する」を参照してください。

    > dotnet-counters monitor --process-id 1902 --counters Samples-EventCounterDemos-Minimal
    
    Press p to pause, r to resume, q to quit.
        request                                      100
    
  • my-aspnet-server.exe起動し、スタートアップから読み込まれたアセンブリの数を監視します。

    > 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
    
  • my-aspnet-server.exearg1をコマンドライン引数として使用してarg2を起動し、そのスタートアップからワーキング セットと GC ヒープ サイズを監視します。

    > 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

dotnet-counters によって監視できる dotnet プロセスを一覧表示します。 dotnet-counters バージョン 6.0.320703 以降では、各プロセスが開始されたコマンド ライン引数 (使用可能な場合) も表示されます。

構文

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

コマンド dotnet run --configuration Release を使用して、実行時間の長いアプリを起動するとします。 別のウィンドウで dotnet-counters ps コマンドを実行します。 表示される出力は次のとおりです。 コマンドライン引数 (ある場合) は、dotnet-counters バージョン 6.0.320703 以降で表示されます。

> dotnet-counters ps

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

診断ポートの使用

診断ポート は、アプリの起動時からカウンターの監視または収集を開始できるランタイム機能です。 dotnet-countersを使用してこれを行うには、前の例で説明したようにdotnet-counters <collect|monitor> -- <command>を使用するか、--diagnostic-port オプションを使用します。

起動からすぐにアプリケーションを監視するには、dotnet-counters <collect|monitor> -- <command> を使用して子プロセスとしてアプリケーションを起動するのが最も簡単です。

ただし、(アプリを最初の 10 分だけ監視し、実行を継続するなど) 監視しているアプリの有効期間をより細かく制御する場合、または CLI を使用してアプリと対話する必要がある場合は、--diagnostic-port オプションを使用すると、監視対象アプリと dotnet-counters の両方を制御できます。

  1. 次のコマンドdotnet-countersmyport.sockという名前の診断ソケットを作成し、接続を待機します。

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

    出力:

    Waiting for connection on myport.sock
    Start an application with the following environment variable: DOTNET_DiagnosticPorts=/home/user/myport.sock
    
  2. 別のコンソールで、DOTNET_DiagnosticPorts の出力値に設定された環境変数 dotnet-counters を使用して対象アプリケーションを起動します。

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

    これにより、 dotnet-countersmy-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.
    

    重要

    dotnet runを使用してアプリを起動すると、dotnet CLI によってアプリではない多くの子プロセスが生成され、アプリの前にdotnet-countersに接続でき、実行時にアプリが中断される可能性があるため、問題が発生する可能性があります。 自己完結型バージョンのアプリを直接使用するか、 dotnet exec を使用してアプリケーションを起動することをお勧めします。