.Net 性能计数器在我调用时损坏
.Net Performance Counters Get Corrupted When I Call Them
这似乎是一个常见问题?我编写了一个 Windows 服务,它获取一堆性能计数器并读取它们并报告它们。我是这样抓住他们的:
public override IEnumerable<IMetric> GetMetrics()
{
var metrics = new List<IMetric>();
try
{
using (var performanceCounter = new PerformanceCounter(PerformanceCounterCategoryName,
PerformanceCounterName, InstanceName))
{
performanceCounter.NextValue();
Thread.Sleep(SampleInterval);
var nextValue = performanceCounter.NextValue();
metrics.Add(new Metric(HostId, $"{PerformanceCounterCategoryName}:{PerformanceCounterName}",
nextValue, MetricType.Gauge));
}
Logger.Debug($"{PerformanceCounterName} metric retrieved.");
}
catch (InvalidOperationException e)
{
Logger.Error(e,$"Monitor {nameof(GetType)} failed. Performance counter {PerformanceCounterCategoryName}:{PerformanceCounterName} does not exist.");
}
catch (Exception e)
{
Logger.Error(e, e.Message);
}
return metrics;
}
我每 5 分钟在大约 30 个性能计数器上调用一次。问题是,一旦我启动我的服务,计数器就会损坏,尤其是 .Net 内存计数器,我必须删除它们:
unlodctr "C:\Windows\INF\.NETFramework\corperfmonsymbols.ini"
重建它们:
lodctr /R
重新安装它们:
lodctr "C:\Windows\INF\.NETFramework\corperfmonsymbols.ini"
但是一旦我启动我的服务,它们就会再次损坏。我如何保持它们稳定?
这似乎与 32 位和 64 位有关。我试图将应用程序设置为 64 位应用程序,但显然我没有正确配置它。我一切换回 32 位,它就完美运行了。
这似乎是一个常见问题?我编写了一个 Windows 服务,它获取一堆性能计数器并读取它们并报告它们。我是这样抓住他们的:
public override IEnumerable<IMetric> GetMetrics()
{
var metrics = new List<IMetric>();
try
{
using (var performanceCounter = new PerformanceCounter(PerformanceCounterCategoryName,
PerformanceCounterName, InstanceName))
{
performanceCounter.NextValue();
Thread.Sleep(SampleInterval);
var nextValue = performanceCounter.NextValue();
metrics.Add(new Metric(HostId, $"{PerformanceCounterCategoryName}:{PerformanceCounterName}",
nextValue, MetricType.Gauge));
}
Logger.Debug($"{PerformanceCounterName} metric retrieved.");
}
catch (InvalidOperationException e)
{
Logger.Error(e,$"Monitor {nameof(GetType)} failed. Performance counter {PerformanceCounterCategoryName}:{PerformanceCounterName} does not exist.");
}
catch (Exception e)
{
Logger.Error(e, e.Message);
}
return metrics;
}
我每 5 分钟在大约 30 个性能计数器上调用一次。问题是,一旦我启动我的服务,计数器就会损坏,尤其是 .Net 内存计数器,我必须删除它们:
unlodctr "C:\Windows\INF\.NETFramework\corperfmonsymbols.ini"
重建它们:
lodctr /R
重新安装它们:
lodctr "C:\Windows\INF\.NETFramework\corperfmonsymbols.ini"
但是一旦我启动我的服务,它们就会再次损坏。我如何保持它们稳定?
这似乎与 32 位和 64 位有关。我试图将应用程序设置为 64 位应用程序,但显然我没有正确配置它。我一切换回 32 位,它就完美运行了。