我使用这段代码来检索我想要监控的机器上的可用性能计数器:
var allCounters = new List<PerformanceCounter>();
foreach (var category in PerformanceCounterCategory.GetCategories("machine-name"))
{
var names = category.GetInstanceNames();
if (names.Length > 0)
{
foreach (var name in names)
{
allCounters.AddRange(category.GetCounters(name));
}
}
else
{
allCounters.AddRange(category.GetCounters());
}
}
我找到了一个我要监控的计数器:Database Cache % Hit
。它没有任何实例名称所以我只是这样得到它:
new PerformanceCounter("Database", "Database Cache % Hit", null, "machine-name"); //null or "" for the third argument
此操作有效,直到我在其上调用NextValue
方法,这会引发InvalidOperationException
:
Counter is not single instance, an instance name needs to be specified.
我尝试将我要监控的SQL Server数据库名称的名称,但它也不起作用(它在实例化期间失败)。
如何在C#应用程序中使用此性能计数器?
答案 0 :(得分:1)
不幸的是,&#34;数据库&#34;计数器组与SQL服务器无关。它是ESENT基础架构的一部分。
对于SQL Server统计信息,查找MSSQL$instance_name
个计数器。可能您正在寻找缓冲区管理器缓存命中率,但是还有其他缓存(如查询计划缓存)。
此外,您可能希望直接从sys.dm_os_performance_counters
视图查询统计信息,绕过此过多的Windows计数器层......