.NET 运行时指标

本文介绍使用 System.Diagnostics.Metrics API 生成的 .NET 运行时库的内置指标。 有关基于旧版 EventCounters API 的指标列表,请参阅可用计数器

提示

有关如何收集和报告这些指标的详细信息,请参阅 收集指标

System.Runtime

计量 System.Runtime 报告来自 GC、JIT、AssemblyLoader、Threadpool 和 .NET 运行时部分的异常处理部分以及 OS 中的某些 CPU 和内存指标的度量值。 这些指标适用于所有 .NET 应用。

指标:dotnet.process.cpu.time
名称 检测类型 单位 (UCUM) 说明
dotnet.process.cpu.time 计数器 s 进程使用的 CPU 时间。
属性 类型 说明 示例 状态
cpu.mode string CPU 模式。 user; system 始终

此指标报告与访问当前进程的处理器时间属性 System.Diagnostics.Process 相同的值。 模式 system 对应于 PrivilegedProcessorTime 模式,模式 user 对应于 UserProcessorTime

从 .NET 9.0 开始可用。

指标:dotnet.process.memory.working_set
名称 检测类型 单位 (UCUM) 说明
dotnet.process.memory.working_set UpDownCounter By 映射到进程上下文的物理内存的字节数。

此指标报告与调用 Environment.WorkingSet 属性相同的值。

从 .NET 9.0 开始可用。

指标:dotnet.gc.collections
名称 检测类型 单位 (UCUM) 说明
dotnet.gc.collections 计数器 {collection} 自进程启动以来发生的垃圾回收数。
属性 类型 说明 示例 状态
dotnet.gc.heap.generation string 正在收集的最大托管堆生成的名称。 gen0; gen1; gen2 始终

.NET GC 是代际垃圾回收器。 每次运行垃圾回收器时,它都会使用启发式选择最大生成,然后将所有代中的对象收集到所选最大值。 例如, gen1 集合收集第 0 代和第 1 代中的所有对象。 gen2集合收集第 0 代、第 1 代和第 2 代中的所有对象。 有关 .NET GC 和生成垃圾回收的详细信息,请参阅 .NET 垃圾回收指南

从 .NET 9.0 开始可用。

指标:dotnet.gc.heap.total_allocated
名称 检测类型 单位 (UCUM) 说明
dotnet.gc.heap.total_allocated 计数器 By 自进程启动以来,在托管 GC 堆上分配的大致字节数。 返回的值不包括任何本机分配。

此指标报告与调用 GC.GetTotalAllocatedBytes相同的值。 有关 .NET GC 的详细信息,请参阅 .NET 垃圾回收指南

从 .NET 9.0 开始可用。

指标:dotnet.gc.last_collection.memory.committed_size
名称 检测类型 单位 (UCUM) 说明
dotnet.gc.last_collection.memory.committed_size UpDownCounter By .NET GC 使用的已提交的虚拟内存量,如最新垃圾回收期间所观察到的。

此指标报告与调用 GCMemoryInfo.TotalCommittedBytes相同的值。 提交的虚拟内存可能大于堆大小,因为它包括用于存储现有对象的内存(堆大小)和一些额外的内存,这些内存已准备好在将来处理新分配的对象。 有关 .NET GC 的详细信息,请参阅 .NET 垃圾回收指南

从 .NET 9.0 开始可用。

指标:dotnet.gc.last_collection.heap.size
名称 检测类型 单位 (UCUM) 说明
dotnet.gc.last_collection.heap.size UpDownCounter By 在最新的垃圾回收过程中观察到的托管 GC 堆大小(包括碎片)。
属性 类型 说明 示例 状态
dotnet.gc.heap.generation string 垃圾回收器托管堆生成的名称。 gen0;gen1; ;lohgen2;poh 始终

.NET GC 将堆划分为几代。 除了标准编号代系外,GC 还会将一些对象放入两个特殊代系中:

  • 大型对象堆(LOH)存储与典型对象相比非常大的 .NET 对象。
  • 固定对象堆 (POH) 存储参数为 true 时pinned使用 GC.AllocateArray API 分配的对象。

这两个特殊代系都是在 GC 集合期间 gen2 收集的。 有关 .NET GC 的详细信息,请参阅 .NET 垃圾回收指南

从 .NET 9.0 开始可用。

指标:dotnet.gc.last_collection.heap.fragmentation.size
名称 检测类型 单位 (UCUM) 说明
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) 说明
dotnet.gc.pause.time 计数器 s 自进程启动以来,GC 中暂停的总时间。

此指标报告与调用 GC.GetTotalPauseDuration()相同的值。

每次 .NET GC 执行集合时,都需要短暂暂停运行托管代码的所有线程,以确定哪些对象仍被引用。 此指标报告自进程开始以来所有这些暂停时间的总和。 可以使用此指标来确定为 GC 暂停的时间线程所花的时间与运行托管代码的时间的一小部分。

从 .NET 9.0 开始可用。

指标:dotnet.jit.compiled_il.size
名称 检测类型 单位 (UCUM) 说明
dotnet.jit.compiled_il.size 计数器 By 自进程启动以来已编译的中间语言的字节数。

此指标报告与调用 JitInfo.GetCompiledILBytes相同的值。

生成 .NET 应用时,托管代码最初是从 C#、VB 或 F# 等高级语言编译为 中间语言 (IL)。 然后,当程序运行时,.NET 实时 (JIT) 编译器会将 IL 转换为计算机代码。

由于 JIT 编译是在首次运行方法时发生的,因此大多数 JIT 编译往往发生在应用程序启动期间。 减少 JIT 编译的 IL 量可以提高应用程序启动时间。

从 .NET 9.0 开始可用。

指标:dotnet.jit.compiled_methods
名称 检测类型 单位 (UCUM) 说明
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) 说明
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) 说明
dotnet.thread_pool.thread.count UpDownCounter {thread} 当前存在的线程池线程数。

此指标报告与调用 ThreadPool.ThreadCount相同的值。

.NET 使用 线程池 将工作项安排到其他线程上。 此指标提供当前由该线程池管理的工作线程数。

从 .NET 9.0 开始可用。

指标:dotnet.thread_pool.work_item.count
名称 检测类型 单位 (UCUM) 说明
dotnet.thread_pool.work_item.count 计数器 {work_item} 线程池自进程启动以来已完成的工作项数。

此指标报告与调用 ThreadPool.CompletedWorkItemCount相同的值。

.NET 使用 线程池 将工作项安排到其他线程上。 此指标提供线程池线程执行的工作项数。

从 .NET 9.0 开始可用。

指标:dotnet.thread_pool.queue.length
名称 检测类型 单位 (UCUM) 说明
dotnet.thread_pool.queue.length UpDownCounter {work_item} 当前排队供线程池处理的工作项数。

此指标报告与调用 ThreadPool.PendingWorkItemCount相同的值。

.NET 使用 线程池 将工作项安排到其他线程上。 此指标提供当前排队等待由其中一个线程池线程执行的工作项数。

从 .NET 9.0 开始可用。

指标:dotnet.monitor.lock_contentions
名称 检测类型 单位 (UCUM) 说明
dotnet.monitor.lock_contentions 计数器 {contention} 自进程启动以来,尝试获取监视器锁时出现争用的次数。

此指标报告与调用 Monitor.LockContentionCount相同的值。

.NET 支持将任何托管对象用作锁,包括 API(如 Monitor.Enterlock 语句)。 如果一个线程在第二个线程尝试获取锁时已持有锁,则这称为 锁争用

从 .NET 9.0 开始可用。

指标:dotnet.timer.count
名称 检测类型 单位 (UCUM) 说明
dotnet.timer.count UpDownCounter {timer} 当前处于活动状态的计时器实例数。

此指标报告与调用 Timer.ActiveCount相同的值。

从 .NET 9.0 开始可用。

指标:dotnet.assembly.count
名称 检测类型 单位 (UCUM) 说明
dotnet.assembly.count UpDownCounter {assembly} 当前加载的 .NET 程序集数。

此指标报告与调用 AppDomain.GetAssemblies() 相同的值,然后检查返回的数组的长度。

从 .NET 9.0 开始可用。

指标:dotnet.exceptions
名称 检测类型 单位 (UCUM) 说明
dotnet.exceptions 计数器 {exception} 在托管代码中引发的异常数。
属性 类型 说明 示例 状态
error.type string 引发的异常类型。 System.OperationCanceledException; Contoso.MyException Required

此指标报告与对事件的调用 AppDomain.FirstChanceException 计数相同的值。

从 .NET 9.0 开始可用。