Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Эта статья относится к: ✔️ 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.Сведения об использовании этого параметра для запуска счетчиков мониторинга из запуска приложения см. в статье об использовании порта диагностики.
- Linux и macOS — путь к сокету домена 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 arg2Name 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.
Следующая команда создает
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 CLI может привести ко многим дочерним процессам, которые не являются вашим приложением, и они могут подключатьсяdotnet-countersдо того, как приложение будет приостановлено во время выполнения. Рекомендуется напрямую использовать автономную версию приложения или использоватьdotnet execдля запуска приложения.