Исследование счетчиков производительности (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
.
Следующая команда заставляет 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
В отдельной консоли запустите целевое приложение с переменной среды
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
.