You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何监控.NET Core应用的基础性能指标?替代Framework计数器方案

.NET Core 监控「每秒异常数」与「GC总耗时」的方案

针对你提到的Exceptions per sec(每秒异常数)和Total Time in GC(GC总耗时)这两个指标,.NET Core虽然没有.NET Framework那样的内置性能计数器,但有以下几种实用方案:

1. 用内置EventCounter+EventListener自定义采集

.NET Core自带的EventCounter机制可以捕获Runtime层面的核心指标,包括你需要的这两个:

  • 监听System.Runtime事件源下的计数器:ExceptionCount是异常总数,计算每秒增量就能得到每秒异常数;TotalTimeInGC直接对应GC总耗时(单位毫秒)。
  • 示例代码参考:
using System;
using System.Collections.Generic;
using System.Diagnostics.Tracing;

public class RuntimeMetricsListener : EventListener
{
    private double _lastExceptionCount = 0;

    protected override void OnEventSourceCreated(EventSource eventSource)
    {
        if (eventSource.Name == "System.Runtime")
        {
            // 设置每秒采集一次数据
            EnableEvents(eventSource, EventLevel.Informational, EventKeywords.All, 
                new Dictionary<string, string> { ["EventCounterIntervalSec"] = "1" });
        }
    }

    protected override void OnEventWritten(EventWrittenEventArgs eventData)
    {
        if (eventData.EventName != "EventCounters") return;

        foreach (var payload in eventData.Payload)
        {
            if (payload is not IDictionary<string, object> counterData) continue;

            var counterName = counterData["Name"].ToString();
            var counterValue = (double)counterData["Mean"];

            switch (counterName)
            {
                case "ExceptionCount":
                    var exceptionsPerSec = counterValue - _lastExceptionCount;
                    _lastExceptionCount = counterValue;
                    Console.WriteLine($"Exceptions per sec: {exceptionsPerSec:F2}");
                    break;
                case "TotalTimeInGC":
                    Console.WriteLine($"Total Time in GC (ms): {counterValue:F2}");
                    break;
            }
        }
    }
}
  • 只需要在应用启动时实例化这个类,就能开始采集数据:var listener = new RuntimeMetricsListener();

2. 用dotnet-counters命令行实时监控

官方提供的dotnet-counters工具,不用改代码就能快速查看指标:

  • 先安装工具:dotnet tool install --global dotnet-counters
  • 列出当前运行的.NET进程:dotnet-counters ps
  • 针对目标进程启动监控(替换<PID>为你的进程ID):
dotnet-counters monitor --process-id <PID> System.Runtime[ExceptionCount,TotalTimeInGC]
  • 输出里ExceptionCount的每秒变化值就是你要的Exceptions per sec,TotalTimeInGC会实时显示累计GC耗时。

3. 用性能分析工具做深度排查

如果需要更详细的分析,比如异常的具体来源、GC的阶段耗时,可以用这些工具:

  • dotnet-trace:生成追踪文件后用PerfView或Visual Studio分析
    • 安装:dotnet tool install --global dotnet-trace
    • 采集数据:dotnet-trace collect --process-id <PID> --providers System.Runtime
    • 生成的.nettrace文件可以在Visual Studio中打开,查看完整的性能图谱。
  • Visual Studio性能探查器:直接在IDE里打开项目,选择“性能探查器”,勾选“.NET内存”或“CPU使用率”,运行后就能在报告里找到GC耗时、异常相关的性能数据。

内容的提问来源于stack exchange,提问作者Boppity Bop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 17:47:41