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


Метрики среды выполнения .NET

В этой статье описываются встроенные метрики для библиотек среды выполнения .NET, созданных с помощью System.Diagnostics.Metrics API. Список метрик на основе старого API EventCounters см. в разделе "Доступные счетчики".

Совет

Дополнительные сведения о том, как собирать и сообщать об этих метриках, см. в разделе "Сбор метрик".

System.Runtime

Счетчик System.Runtime сообщает измерения из GC, JIT, AssemblyLoader, Threadpool и частей обработки исключений среды выполнения .NET, а также некоторые метрики ЦП и памяти операционной системы. Эти метрики доступны автоматически для всех приложений .NET.

Метрика: dotnet.process.cpu.time
Имя. Тип инструмента Единица (UCUM) Description
dotnet.process.cpu.time Counter<T> s Время ЦП, используемое процессом.
Атрибут Тип Description Примеры Присутствие
cpu.mode string Режим ЦП. user; system Всегда

Эта метрика сообщает те же значения, что и доступ к свойствам System.Diagnostics.Process времени процессора для текущего процесса. Режим system соответствует PrivilegedProcessorTime и user соответствует режиму UserProcessorTime

Доступно начиная с .NET 9.

Метрика: dotnet.process.memory.working_set
Имя. Тип инструмента Единица (UCUM) Description
dotnet.process.memory.working_set UpDownCounter<T> By Количество байтов физической памяти, сопоставленных с контекстом процесса.

Эта метрика сообщает те же значения, что и вызывающее Environment.WorkingSet свойство.

Доступно начиная с .NET 9.

Метрика: dotnet.gc.collections
Имя. Тип инструмента Единица (UCUM) Description
dotnet.gc.collections Counter<T> {collection} Число сборок мусора, которые произошли с момента начала процесса.
Атрибут Тип Description Примеры Присутствие
gc.heap.generation string Имя собираемого максимального поколения управляемой кучи. gen0; gen1; gen2 Всегда

.NET GC — это сборщик мусора поколения. При каждом запуске сборщика мусора он использует эвристики для выбора максимального поколения, а затем собирает объекты во всех поколениях до выбранного максимума. Например, gen1 коллекция собирает все объекты в поколениях 0 и 1. Коллекция gen2 собирает все объекты в поколениях 0, 1 и 2. Дополнительные сведения о сборке мусора .NET и сборке мусора поколения см. в руководстве по сбору мусора .NET.

Доступно начиная с .NET 9.

Метрика: dotnet.gc.heap.total_allocated
Имя. Тип инструмента Единица (UCUM) Description
dotnet.gc.heap.total_allocated Counter<T> By Приблизительное количество байтов, выделенных в куче управляемой сборки GC с момента начала процесса. Возвращаемое значение не включает собственные выделения.

Эта метрика сообщает те же значения, что и вызов GC.GetTotalAllocatedBytes. Дополнительные сведения о сборке мусора .NET см. в руководстве по сбору мусора .NET.

Доступно начиная с .NET 9.

Метрика: dotnet.gc.last_collection.memory.committed_size
Имя. Тип инструмента Единица (UCUM) Description
dotnet.gc.last_collection.memory.committed_size UpDownCounter<T> By Объем зафиксированной виртуальной памяти, используемой .NET GC, как показано во время последней сборки мусора.

Эта метрика сообщает те же значения, что и вызов GCMemoryInfo.TotalCommittedBytes. Зафиксированная виртуальная память может быть больше размера кучи, так как она включает в себя память для хранения существующих объектов (размер кучи) и некоторой дополнительной памяти, готовой к обработке только что выделенных объектов в будущем. Дополнительные сведения о сборке мусора .NET см. в руководстве по сбору мусора .NET.

Доступно начиная с .NET 9.

Метрика: dotnet.gc.last_collection.heap.size
Имя. Тип инструмента Единица (UCUM) Description
dotnet.gc.last_collection.heap.size UpDownCounter<T> By Размер кучи управляемой сборки GC (включая фрагментацию), как отмечалось во время последней сборки мусора.
Атрибут Тип Description Примеры Присутствие
gc.heap.generation string Имя поколения управляемой кучи сборщика мусора. gen0; gen1; ; gen2loh; poh Всегда

GC .NET делит кучу на поколения. Помимо стандартных нумерованных поколений, GC также помещает некоторые объекты в два специальных поколения:

  • Большие кучи объектов (LOH) хранят объекты .NET, которые очень большие по сравнению с типичными объектами.
  • Закрепленная куча объектов (POH) сохраняет объекты, выделенные с помощью GC.AllocateArray API, если pinned параметр имеет значение true.

Оба этих специальных поколения собираются во время gen2 коллекций GC. Дополнительные сведения о сборке мусора .NET см. в руководстве по сбору мусора .NET.

Доступно начиная с .NET 9.

Метрика: dotnet.gc.last_collection.heap.fragmentation.size
Имя. Тип инструмента Единица (UCUM) Description
dotnet.gc.last_collection.heap.fragmentation.size UpDownCounter<T> By Фрагментация кучи, как отмечалось во время последней сборки мусора.
Атрибут Тип Description Примеры Присутствие
gc.heap.generation string Имя поколения управляемой кучи сборщика мусора. gen0; gen1; ; gen2loh; poh Всегда

Эта метрика сообщает те же значения, что и вызов GCGenerationInfo.FragmentationAfterBytes.

При выделении объектов .NET изначально они обычно размещаются в памяти. Однако если некоторые из этих объектов позже собираются в GC, это создает пробелы неиспользуемой памяти между оставшимися динамическими объектами. Эти пробелы представляют часть кучи GC, которая в настоящее время не используется для хранения объектов, часто называемых "фрагментацией". GC может повторно использовать байты фрагментации в будущем для новых выделений объектов, если размер объекта достаточно мал, чтобы поместиться в один из пробелов. GC также может выполнять специальную сборку мусора, которая перемещает оставшиеся живые объекты рядом друг с другом, пока объекты не были закреплены на месте.

Дополнительные сведения о работе .NET GC, анализе производительности GC и о том, какие роли играют фрагментации ролей, см. в статье об анализе производительности памяти .NET.

Доступно начиная с .NET 9.

Метрика: dotnet.gc.pause.time
Имя. Тип инструмента Единица (UCUM) Description
dotnet.gc.pause.time Counter<T> s Общее время приостановки в GC с момента начала процесса.

Эта метрика сообщает те же значения, что и вызов GC.GetTotalPauseDuration().

Каждый раз, когда GC .NET выполняет коллекцию, необходимо кратко приостановить все потоки, на которые выполняется управляемый код, чтобы определить, на какие объекты по-прежнему ссылаются. Эта метрика сообщает сумму всех этих времен приостановки с начала процесса. Эту метрику можно использовать, чтобы определить, какая доля потоков времени тратится приостановлено для GC и времени, когда они могут запускать управляемый код.

Доступно начиная с .NET 9.

Метрика: dotnet.jit.compiled_il.size
Имя. Тип инструмента Единица (UCUM) Description
dotnet.jit.compiled_il.size Counter<T> By Количество байтов промежуточного языка, скомпилированных с момента начала процесса.

Эта метрика сообщает те же значения, что и вызов JitInfo.GetCompiledILBytes.

При создании приложения .NET управляемый код изначально компилируется с высокоуровневого языка, например C#, VB или F# на промежуточный язык (IL). Затем при запуске программы компилятор .NET jIT преобразует IL в машинный код.

Так как компиляция JIT возникает при первом запуске метода, большинство JIT-компиляций, как правило, возникает во время запуска приложения. Уменьшение количества скомпилированных JIT-кодов может повысить время запуска приложения.

Доступно начиная с .NET 9.

Метрика: dotnet.jit.compiled_methods
Имя. Тип инструмента Единица (UCUM) Description
dotnet.jit.compiled_methods Counter<T> {method} Количество скомпилированных методов JIT-компилятора (re)с момента запуска процесса.

Эта метрика сообщает те же значения, что и вызов JitInfo.GetCompiledMethodCount.

При создании приложения .NET управляемый код изначально компилируется с высокоуровневого языка, например C#, VB или F# на промежуточный язык (IL). Затем при запуске программы компилятор .NET jIT преобразует IL в машинный код.

Так как компиляция JIT возникает при первом запуске метода, большинство JIT-компиляций, как правило, возникает во время запуска приложения. Сокращение количества методов, которые необходимо скомпилировать JIT, может улучшить время запуска приложения.

Доступно начиная с .NET 9.

Метрика: dotnet.jit.compilation.time
Имя. Тип инструмента Единица (UCUM) Description
dotnet.jit.compilation.time Counter<T> s Время, затраченное компилятором JIT, с момента начала процесса.

Эта метрика сообщает те же значения, что и вызов JitInfo.GetCompilationTime.

При создании приложения .NET управляемый код изначально компилируется с высокоуровневого языка, например C#, VB или F# на промежуточный язык (IL). Затем при запуске программы компилятор .NET jIT преобразует IL в машинный код.

Так как компиляция JIT возникает при первом запуске метода, большинство JIT-компиляций, как правило, возникает во время запуска приложения. Сокращение времени, затраченного на компиляцию JIT, может повысить время запуска приложения.

Доступно начиная с .NET 9.

Метрика: dotnet.thread_pool.thread.count
Имя. Тип инструмента Единица (UCUM) Description
dotnet.thread_pool.thread.count UpDownCounter<T> {thread} Количество потоков пула потоков, которые в настоящее время существуют.

Эта метрика сообщает те же значения, что и вызов ThreadPool.ThreadCount.

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

Доступно начиная с .NET 9.

Метрика: dotnet.thread_pool.work_item.count
Имя. Тип инструмента Единица (UCUM) Description
dotnet.thread_pool.work_item.count Counter<T> {work_item} Количество рабочих элементов, завершенных пулом потоков с момента начала процесса.

Эта метрика сообщает те же значения, что и вызов ThreadPool.CompletedWorkItemCount.

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

Доступно начиная с .NET 9.

Метрика: dotnet.thread_pool.queue.length
Имя. Тип инструмента Единица (UCUM) Description
dotnet.thread_pool.queue.length UpDownCounter<T> {work_item} Количество рабочих элементов, которые в настоящее время помещаются в очередь пулом потоков.

Эта метрика сообщает те же значения, что и вызов ThreadPool.PendingWorkItemCount.

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

Доступно начиная с .NET 9.

Метрика: dotnet.monitor.lock_contentions
Имя. Тип инструмента Единица (UCUM) Description
dotnet.monitor.lock_contentions Counter<T> {contention} Количество конфликтов при попытке получить блокировку монитора с момента начала процесса.

Эта метрика сообщает те же значения, что и вызов Monitor.LockContentionCount.

.NET поддерживает использование любого управляемого объекта в качестве блокировки либо с API- интерфейсами, такими как Monitor.Enter или с инструкцией блокировки. Если один поток уже содержит блокировку, а второй поток пытается получить его, это называется конфликтом блокировки.

Доступно начиная с .NET 9.

Метрика: dotnet.timer.count
Имя. Тип инструмента Единица (UCUM) Description
dotnet.timer.count UpDownCounter<T> {timer} Количество экземпляров таймера, которые сейчас активны.

Эта метрика сообщает те же значения, что и вызов Timer.ActiveCount.

Доступно начиная с .NET 9.

Метрика: dotnet.assembly.count
Имя. Тип инструмента Единица (UCUM) Description
dotnet.assembly.count UpDownCounter<T> {assembly} Количество сборок .NET, загруженных в данный момент.

Эта метрика сообщает те же значения, что и вызов AppDomain.GetAssemblies() , а затем проверяет длину возвращаемого массива.

Доступно начиная с .NET 9.

Метрика: dotnet.exceptions
Имя. Тип инструмента Единица (UCUM) Description
dotnet.exceptions Counter<T> {exception} Число исключений, которые были созданы в управляемом коде.
Атрибут Тип Description Примеры Присутствие
error.type string Тип исключения, который был создан. System.OperationCanceledException; Contoso.MyException Required

Эта метрика сообщает те же значения, что и подсчет вызовов AppDomain.FirstChanceException события.

Доступно начиная с .NET 9.