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


Метрики среды выполнения .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 Счетчик s Время ЦП, используемое процессом.
Атрибут Тип Описание Примеры Присутствие
cpu.mode строка Режим ЦП. user; system Всегда

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Метрика: dotnet.gc.last_collection.heap.fragmentation.size
Имя. Тип инструмента Единица (UCUM) Description
dotnet.gc.last_collection.heap.fragmentation.size UpDownCounter By Фрагментация кучи, как отмечалось во время последней сборки мусора.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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