.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 ; ;loh gen2 ;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.Enter 或 lock 语句)。 如果一个线程在第二个线程尝试获取锁时已持有锁,则这称为 锁争用。
从 .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 开始可用。