Поделиться через


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

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

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

Установка

Существует три способа скачивания и использования dotnet-counters:

  • Однократное выполнение (рекомендуется):

    Начиная с .NET 10.0.100, можно запускать dotnet-counters без постоянной установки с помощью dnx:

    dnx dotnet-counters [options]
    

    Рассмотрим пример.

    dnx dotnet-counters monitor --process-id 1234
    

    Этот подход автоматически скачивает и запускает последнюю версию без окончательного изменения системы.

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

    Чтобы установить последнюю версию пакета NuGet для частого dotnet-counters использования, используйте команду установки средства dotnet:

    dotnet tool install --global dotnet-counters
    

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

  • Прямое скачивание:

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

    ОС Платформа
    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
Монитор dotnet-counters
dotnet-counters ps

Сбор счетчиков dotnet-counters

Периодический сбор выбранных значений счетчиков и их экспорт в указанном формате файла для последующей обработки.

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

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

Параметры

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

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

    Примечание.

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

  • -n|--name <name>

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

    Примечание.

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

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

    Задает порт диагностики , используемый для взаимодействия с процессом для мониторинга. dotnet-counters и среда выполнения .NET внутри целевого процесса должна согласиться с адресом порта, с одним прослушивание и другим подключением. dotnet-counters автоматически определяет правильный порт при подключении с помощью --process-id параметров или --name при запуске процесса с помощью -- <command> параметра. Обычно необходимо явно указать порт при ожидании процесса, который будет начинаться в будущем или взаимодействовать с процессом, выполняющимся внутри контейнера, который не является частью текущего пространства имен процесса.

    Отличается port-address по ОС:

    • Linux и macOS — путь к сокету домена Unix, например /foo/tool1.socket.
    • Windows — путь к именованной трубе, например \\.\pipe\my_diag_port1.
    • Android, iOS и tvOS — ip:port, например 127.0.0.1:9000.

    По умолчанию dotnet-counters прослушивает указанный адрес. Вместо этого можно запросить dotnet-counters подключение, добавив ,connect после адреса. Например, --diagnostic-port /foo/tool1.socket,connect подключитесь к процессу выполнения .NET, который прослушивает /foo/tool1.socket сокет домена Unix.

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

  • --refresh-interval <SECONDS>

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

  • --counters <COUNTERS>

    Список счетчиков, разделенный запятыми. Вы можете объявить счетчики как provider_name[:counter_name]. Если provider_name используется без соответствующего списка счетчиков, отображаются все счетчики от поставщика. Сведения об обнаружении имен поставщиков и счетчиков см. в встроенных метриках. Для EventCounters имя EventSource и для provider_nameprovider_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. Дополнительные сведения см. в разделе "Использование порта диагностики".

Примечание.

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

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

  • -n|--name <name>

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

  • --diagnostic-port

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

  • --refresh-interval <SECONDS>

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

  • --counters <COUNTERS>

    Список счетчиков, разделенный запятыми. Вы можете объявить счетчики как provider_name[:counter_name]. Если provider_name используется без соответствующего списка счетчиков, отображаются все счетчики от поставщика. Сведения об обнаружении имен поставщиков и счетчиков см. в встроенных метриках. Для EventCounters имя EventSource и для provider_nameprovider_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
    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 не существует и dotnet-counters откатится к отображению старых system.Runtime EventCounters . Пользовательский интерфейс выглядит немного иначе, как показано здесь.

    [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
    
    
  • Мониторинг значений 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
    
  • Запустите и отслеживайте 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.exe аргументами командной строки и arg1 отслеживайте 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, которые можно отслеживать.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 CLI может привести ко многим дочерним процессам, которые не являются вашим приложением, и они могут подключаться dotnet-counters до того, как приложение будет приостановлено во время выполнения. Рекомендуется напрямую использовать автономную версию приложения или использовать dotnet exec для запуска приложения.