如何监控.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
相关产品推荐
相关产品推荐

