Исследование счетчиков производительности (dotnet-counter)

Эта статья относится к: ✔️ dotnet-counters версии 3.0.47001 и более поздним версиям.

Счетчики можно считывать из приложений под управлением .NET 5 или более поздней версии.

Установка

Есть два способа загрузки и установки dotnet-counters:

  • Средство dotnet global:

    Чтобы установить последнюю версию пакета NuGet dotnet-counters, используйте команду dotnet tool install.

    dotnet tool install --global dotnet-counters
    
  • Прямое скачивание:

    скачайте исполняемый файл средства, соответствующий вашей платформе:

    ОС Платформа
    Windows x86 x64 Arm-x64 Arm-x64 | | |
    Linux x64 Arm64 | | | musl-x64 musl-arm64 |

Примечание.

Для использования dotnet-counters в приложении x86 необходима соответствующая версия средства для архитектуры x86.

Краткие сведения

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

Description

dotnet-counters — это средство мониторинга производительности и первого уровня анализа производительности. Он может наблюдать за значениями счетчиков производительности, опубликованными через EventCounter API или Meter API. Например, вы можете быстро отслеживать такие параметры, как загрузка ЦП или частота возникновения исключений в приложении .NET Core, чтобы обнаружить подозрительное поведение перед началом более серьезных расследований с помощью PerfView или dotnet-trace.

Параметры

  • --version

    Отображение версии служебной программы dotnet-counters.

  • -h|--help

    Отображение справки в командной строке.

Команды

Команда
dotnet-counters collect
dotnet-counters list
dotnet-counters monitor
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>

    Идентификатор процесса для сбора данных счетчика из.

  • -n|--name <name>

    Имя процесса для сбора данных счетчика из.

  • --diagnostic-port

    Имя создаваемого порта диагностики. Сведения об использовании этого параметра для запуска счетчиков мониторинга во время запуска приложения см. в разделе Использование порта диагностики.

  • --refresh-interval <SECONDS>

    Время (в секундах) между обновлением значений отображаемых счетчиков

  • --counters <COUNTERS>

    Список счетчиков, разделенный запятыми. Вы можете объявить счетчики как provider_name[:counter_name]. Если provider_name используется без соответствующего списка счетчиков, отображаются все счетчики от поставщика. Для обнаружения имен поставщиков и счетчиков используйте команду dotnet-counters list. Для EventCounters имя EventSource и для счетчиковprovider_name provider_name — это имя счетчика.

  • --format <csv|json>

    Экспортируемый формат. В настоящее время доступно: csv, json.

  • -o|--output <output>

    Имя выходного файла.

  • -- <command>

    После параметров конфигурации коллекции пользователь может добавить -- команду, чтобы запустить приложение .NET. dotnet-counters запустит процесс с указанной командой и соберет запрошенные метрики. Это часто бывает полезно для сбора метрик для пути запуска приложения и может использоваться для диагностики и отслеживания проблем, происходящих незадолго до основной точки входа или вскоре после нее.

    Примечание.

    С помощью этого параметра выполняется мониторинг первого процесса .NET, который взаимодействует с инструментом, что означает, что если команда запускает несколько приложений .NET, она будет собирать только первое приложение. Поэтому рекомендуется использовать этот параметр для автономных приложений или с помощью параметра dotnet exec <app.dll>.

    Примечание.

    Запуск исполняемого файла .NET через dotnet-counters перенаправит входные и выходные данные, и вы не сможете взаимодействовать со своим stdin/stdout. Выход из средства с помощью клавиш CTRL+C или SIGTERM приведет к безопасному завершению работы средства и дочернего процесса. Если дочерний процесс завершает работу до средства, средство также завершит работу. Если необходимо использовать stdin/stdout, можно применить параметр --diagnostic-port. Дополнительные сведения см. в разделе Использование порта диагностики.

Примечание.

В Linux и macOS эта команда ожидает, что целевое приложение и dotnet-counters будут совместно использовать одну и ту же переменную среды TMPDIR. В противном случае время ожидания команды истечет.

Примечание.

Чтобы получить метрики с помощью 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 list

Отображение списка имен и описаний счетчиков, сгруппированных по поставщикам.

Краткие сведения

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

Пример

> dotnet-counters list
Showing well-known counters only. Specific processes may support additional counters.

System.Runtime
    cpu-usage                                    Amount of time the process has utilized the CPU (ms)
    working-set                                  Amount of working set used by the process (MB)
    gc-heap-size                                 Total heap size reported by the GC (MB)
    gen-0-gc-count                               Number of Gen 0 GCs per interval
    gen-1-gc-count                               Number of Gen 1 GCs per interval
    gen-2-gc-count                               Number of Gen 2 GCs per interval
    time-in-gc                                   % time in GC since the last GC
    gen-0-size                                   Gen 0 Heap Size
    gen-1-size                                   Gen 1 Heap Size
    gen-2-size                                   Gen 2 Heap Size
    loh-size                                     LOH Heap Size
    alloc-rate                                   Allocation Rate
    assembly-count                               Number of Assemblies Loaded
    exception-count                              Number of Exceptions per interval
    threadpool-thread-count                      Number of ThreadPool Threads
    monitor-lock-contention-count                Monitor Lock Contention Count
    threadpool-queue-length                      ThreadPool Work Items Queue Length
    threadpool-completed-items-count             ThreadPool Completed Work Items Count
    active-timer-count                           Active Timers Count

Microsoft.AspNetCore.Hosting
    requests-per-second                  Request rate
    total-requests                       Total number of requests
    current-requests                     Current number of requests
    failed-requests                      Failed number of requests

Примечание.

Счетчики Microsoft.AspNetCore.Hosting отображаются при обнаружении процессов, поддерживающих эти счетчики, например при запуске приложения ASP.NET Core на хост-компьютере.

dotnet-counters monitor

Отображение периодически обновляемых значений для выбранных счетчиков.

Краткие сведения

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

Параметры

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

    Идентификатор отслеживаемого процесса.

  • -n|--name <name>

    Имя отслеживаемого процесса.

  • --diagnostic-port

    Имя создаваемого порта диагностики. Сведения об использовании этого параметра для запуска счетчиков мониторинга во время запуска приложения см. в разделе Использование порта диагностики.

  • --refresh-interval <SECONDS>

    Время (в секундах) между обновлением значений отображаемых счетчиков

  • --counters <COUNTERS>

    Список счетчиков, разделенный запятыми. Вы можете объявить счетчики как provider_name[:counter_name]. Если provider_name используется без соответствующего списка счетчиков, отображаются все счетчики от поставщика. Для обнаружения имен поставщиков и счетчиков используйте команду dotnet-counters list. Для EventCounters имя EventSource и для счетчиковprovider_name provider_name — это имя счетчика.

-- <command>

После параметров конфигурации коллекции пользователь может добавить -- команду, чтобы запустить приложение .NET. dotnet-counters запустит процесс с указанной командой и будет отслеживать запрошенные метрики. Это часто бывает полезно для сбора метрик для пути запуска приложения и может использоваться для диагностики и отслеживания проблем, происходящих незадолго до основной точки входа или вскоре после нее.

Примечание.

С помощью этого параметра выполняется мониторинг первого процесса .NET, который взаимодействует с инструментом, что означает, что если команда запускает несколько приложений .NET, она будет собирать только первое приложение. Поэтому рекомендуется использовать этот параметр для автономных приложений или с помощью параметра dotnet exec <app.dll>.

Примечание.

Запуск исполняемого файла .NET через dotnet-counters перенаправит входные и выходные данные, и вы не сможете взаимодействовать со своим 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, разрядность которого не соответствует требуемой целевым процессом. Скачайте средство с соответствующей разрядностью по ссылке, приведенной в разделе Установка.

Примеры

  • Мониторинг всех счетчиков из System.Runtime с интервалом обновления 3 секунды:

    > dotnet-counters monitor --process-id 1902  --refresh-interval 3 --counters System.Runtime
    Press p to pause, r to resume, q to quit.
        Status: Running
    
    [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
    
  • Мониторинг только счетчиков использования ЦП и размера кучи GC из System.Runtime:

    > dotnet-counters monitor --process-id 1902 --counters System.Runtime[cpu-usage,gc-heap-size]
    
    Press p to pause, r to resume, q to quit.
      Status: Running
    
    [System.Runtime]
        CPU Usage (%)                                 24
        GC Heap Size (MB)                            811
    
  • Мониторинг значений EventCounter из определяемых пользователем EventSource: Дополнительные сведения см. в руководстве по измерению производительности с помощью EventCounters в .NET Core.

    > dotnet-counters monitor --process-id 1902 --counters Samples-EventCounterDemos-Minimal
    
    Press p to pause, r to resume, q to quit.
        request                                      100
    
  • Просмотр всех известных счетчиков, доступных в dotnet-counters:

    > dotnet-counters list
    
    Showing well-known counters for .NET (Core) version 3.1 only. Specific processes may support additional counters.
    System.Runtime
        cpu-usage                          The percent of process' CPU usage relative to all of the system CPU resources [0-100]
        working-set                        Amount of working set used by the process (MB)
        gc-heap-size                       Total heap size reported by the GC (MB)
        gen-0-gc-count                     Number of Gen 0 GCs between update intervals
        gen-1-gc-count                     Number of Gen 1 GCs between update intervals
        gen-2-gc-count                     Number of Gen 2 GCs between update intervals
        time-in-gc                         % time in GC since the last GC
        gen-0-size                         Gen 0 Heap Size
        gen-1-size                         Gen 1 Heap Size
        gen-2-size                         Gen 2 Heap Size
        loh-size                           LOH Size
        alloc-rate                         Number of bytes allocated in the managed heap between update intervals
        assembly-count                     Number of Assemblies Loaded
        exception-count                    Number of Exceptions / sec
        threadpool-thread-count            Number of ThreadPool Threads
        monitor-lock-contention-count      Number of times there were contention when trying to take the monitor lock between update intervals
        threadpool-queue-length            ThreadPool Work Items Queue Length
        threadpool-completed-items-count   ThreadPool Completed Work Items Count
        active-timer-count                 Number of timers that are currently active
    
    Microsoft.AspNetCore.Hosting
        requests-per-second                Number of requests between update intervals
        total-requests                     Total number of requests
        current-requests                   Current number of requests
        failed-requests                    Failed number of requests
    
  • Просмотр всех известных счетчиков, доступных в dotnet-counters для приложений .NET 5:

    > dotnet-counters list --runtime-version 5.0
    
    Showing well-known counters for .NET (Core) version 5.0 only. Specific processes may support additional counters.
    System.Runtime
        cpu-usage                          The percent of process' CPU usage relative to all of the system CPU resources [0-100]
        working-set                        Amount of working set used by the process (MB)
        gc-heap-size                       Total heap size reported by the GC (MB)
        gen-0-gc-count                     Number of Gen 0 GCs between update intervals
        gen-1-gc-count                     Number of Gen 1 GCs between update intervals
        gen-2-gc-count                     Number of Gen 2 GCs between update intervals
        time-in-gc                         % time in GC since the last GC
        gen-0-size                         Gen 0 Heap Size
        gen-1-size                         Gen 1 Heap Size
        gen-2-size                         Gen 2 Heap Size
        loh-size                           LOH Size
        poh-size                           POH (Pinned Object Heap) Size
        alloc-rate                         Number of bytes allocated in the managed heap between update intervals
        gc-fragmentation                   GC Heap Fragmentation
        assembly-count                     Number of Assemblies Loaded
        exception-count                    Number of Exceptions / sec
        threadpool-thread-count            Number of ThreadPool Threads
        monitor-lock-contention-count      Number of times there were contention when trying to take the monitor lock between update intervals
        threadpool-queue-length            ThreadPool Work Items Queue Length
        threadpool-completed-items-count   ThreadPool Completed Work Items Count
        active-timer-count                 Number of timers that are currently active
        il-bytes-jitted                    Total IL bytes jitted
        methods-jitted-count               Number of methods jitted
    
    Microsoft.AspNetCore.Hosting
        requests-per-second   Number of requests between update intervals
        total-requests        Total number of requests
        current-requests      Current number of requests
        failed-requests       Failed number of requests
    
    Microsoft-AspNetCore-Server-Kestrel
        connections-per-second      Number of connections between update intervals
        total-connections           Total Connections
        tls-handshakes-per-second   Number of TLS Handshakes made between update intervals
        total-tls-handshakes        Total number of TLS handshakes made
        current-tls-handshakes      Number of currently active TLS handshakes
        failed-tls-handshakes       Total number of failed TLS handshakes
        current-connections         Number of current connections
        connection-queue-length     Length of Kestrel Connection Queue
        request-queue-length        Length total HTTP request queue
    
    System.Net.Http
        requests-started        Total Requests Started
        requests-started-rate   Number of Requests Started between update intervals
        requests-aborted        Total Requests Aborted
        requests-aborted-rate   Number of Requests Aborted between update intervals
        current-requests        Current Requests
    
  • Запустите и отслеживайте my-aspnet-server.exe число сборок, загруженных из запуска:

    > dotnet-counters monitor --counters System.Runtime[assembly-count] -- my-aspnet-server.exe
    
    Press p to pause, r to resume, q to quit.
      Status: Running
    
    [System.Runtime]
        Number of Assemblies Loaded                   24
    
  • Запустите с arg1 аргументами командной строки и arg2 отслеживайте my-aspnet-server.exe его рабочий набор и размер кучи GC из запуска:

    > dotnet-counters monitor --counters System.Runtime[working-set,gc-heap-size] -- my-aspnet-server.exe arg1 arg2
    
    Press p to pause, r to resume, q to quit.
      Status: Running
    
    [System.Runtime]
        GC Heap Size (MB)                                 39
        Working Set (MB)                                  59
    

dotnet-counters ps

Выводит список процессов dotnet, которые можно отслеживать.dotnet-counters 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 минут, а затем продолжать выполнение), или если необходимо взаимодействовать с приложением их интерфейса командной строки, используйте параметр --diagnostic-port, который позволяет управлять как отслеживаемым целевым приложением, так и dotnet-counters.

  1. Следующая команда заставляет dotnet-counters создать сокет диагностики с именем myport.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-counters запустить сбор данных счетчиков в 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.
    

    Внимание

    Запуск приложения с помощью dotnet run может привести к проблемам: интерфейс командной строки dotnet может порождать множество дочерних процессов, которые не относятся к вашему приложению, и если они подключатся к dotnet-counters раньше вашего приложения, оно будет приостановлено во время выполнения. Рекомендуется использовать автономную версию приложения или запускать его с помощью dotnet exec.