我必须以programmaticaly方式创建性能计数器。似乎代码正在运行,但我没有在perfmon中看到性能计数器类别。当我的意思是代码工作时,我说它不会抛出任何异常。我是以管理员身份运行它。
我已经看到SO的答案说可能需要一些时间来出现计数器。但我在回家之前安装了它们,第二天它们仍然不可见。
这是一个用于测试它的小型控制台应用程序。我安装了计数器,然后使用它们但在性能监视器中看不到它们。
编辑:我在3台机器上进行了测试,并按预期在其中一台机器上运行(perfmon中的perf计数器可见)。是否有可能在Windows中的其他地方看到性能计数器(Powershell,一些sysinternals工具?)
using System;
using System.Diagnostics;
namespace PerfCounters
{
class Program
{
static void Main()
{
var program = new Program();
program.Run();
}
private const string CATEGORY_NAME = "AAAMySpecialCategory";
private const string CATEGORY_HELP = "AAAMySpecialCategory Help";
private const string OPS_IN_CURRENT_COUNTER_NAME = "# current calls";
public void Run()
{
while (true)
{
PrintUsage();
Console.Write(":> ");
var keyInfo = Console.ReadLine();
if (keyInfo == "q")
{
break;
}
switch (keyInfo)
{
case "i":
InstallPerfCountersCategory();
break;
case "c":
Console.WriteLine(PerformanceCounterCategoryExists()
? "Perf counter category ({0}) does exist"
: "Perf counter categry ({0}) does not exist", CATEGORY_NAME);
break;
case "w":
IncrementPerfCounter();
break;
case "u":
UninstallPerfCountersCategory();
break;
}
}
}
private static void PrintUsage()
{
Console.WriteLine();
Console.WriteLine("Usage:");
Console.WriteLine("i - install performance counters category ({0})", CATEGORY_NAME);
Console.WriteLine("c - check if category exists ({0})", CATEGORY_NAME);
Console.WriteLine("w - work with perf counter (increment)");
Console.WriteLine("u - uninstall performance counters category ({0})", CATEGORY_NAME);
Console.WriteLine("q - quit");
}
private void IncrementPerfCounter()
{
if (!PerformanceCounterCategoryExists())
{
Console.WriteLine("Perf counter category ({0}) does not exist - install first", CATEGORY_NAME);
return;
}
var currentOps = new PerformanceCounter(CATEGORY_NAME, OPS_IN_CURRENT_COUNTER_NAME, false);
Console.Write("Incrementing perf counter");
currentOps.Increment();
Console.WriteLine(" - incremented");
}
private void InstallPerfCountersCategory()
{
if (PerformanceCounterCategoryExists())
{
Console.WriteLine("Uninstall first");
return;
}
var ccdc = new CounterCreationDataCollection
{
new CounterCreationData(OPS_IN_CURRENT_COUNTER_NAME, "", PerformanceCounterType.NumberOfItems32),
};
PerformanceCounterCategory.Create(CATEGORY_NAME, CATEGORY_HELP, PerformanceCounterCategoryType.SingleInstance, ccdc);
Console.WriteLine("Installed");
}
private void UninstallPerfCountersCategory()
{
if (PerformanceCounterCategoryExists())
{
Console.WriteLine("Deleting perf counter category ({0})", CATEGORY_NAME);
PerformanceCounterCategory.Delete(CATEGORY_NAME);
}
else
{
Console.WriteLine("Perf counter category ({0}) does not exist - install first", CATEGORY_NAME);
}
}
private bool PerformanceCounterCategoryExists()
{
return PerformanceCounterCategory.Exists(CATEGORY_NAME);
}
}
}
private const string CATEGORY_NAME = "AAAMySpecialCategory";
private const string CATEGORY_HELP = "AAAMySpecialCategory Help";
private const string OPS_IN_CURRENT_COUNTER_NAME = "# current calls";
public void Run()
{
while (true)
{
PrintUsage();
Console.Write(":> ");
var keyInfo = Console.ReadLine();
if (keyInfo == "q")
{
break;
}
switch (keyInfo)
{
case "i":
InstallPerfCountersCategory();
break;
case "c":
Console.WriteLine(PerformanceCounterCategoryExists()
? "Perf counter category ({0}) does exist"
: "Perf counter categry ({0}) does not exist", CATEGORY_NAME);
break;
case "w":
IncrementPerfCounter();
break;
case "u":
UninstallPerfCountersCategory();
break;
}
}
}
private static void PrintUsage()
{
Console.WriteLine();
Console.WriteLine("Usage:");
Console.WriteLine("i - install performance counters category ({0})", CATEGORY_NAME);
Console.WriteLine("c - check if category exists ({0})", CATEGORY_NAME);
Console.WriteLine("w - work with perf counter (increment)");
Console.WriteLine("u - uninstall performance counters category ({0})", CATEGORY_NAME);
Console.WriteLine("q - quit");
}
private void IncrementPerfCounter()
{
if (!PerformanceCounterCategoryExists())
{
Console.WriteLine("Perf counter category ({0}) does not exist - install first", CATEGORY_NAME);
return;
}
var currentOps = new PerformanceCounter(CATEGORY_NAME, OPS_IN_CURRENT_COUNTER_NAME, false);
Console.Write("Incrementing perf counter");
currentOps.Increment();
Console.WriteLine(" - incremented");
}
private void InstallPerfCountersCategory()
{
if (PerformanceCounterCategoryExists())
{
Console.WriteLine("Uninstall first");
return;
}
var ccdc = new CounterCreationDataCollection
{
new CounterCreationData(OPS_IN_CURRENT_COUNTER_NAME, "", PerformanceCounterType.NumberOfItems32),
};
PerformanceCounterCategory.Create(CATEGORY_NAME, CATEGORY_HELP, PerformanceCounterCategoryType.SingleInstance, ccdc);
Console.WriteLine("Installed");
}
private void UninstallPerfCountersCategory()
{
if (PerformanceCounterCategoryExists())
{
Console.WriteLine("Deleting perf counter category ({0})", CATEGORY_NAME);
PerformanceCounterCategory.Delete(CATEGORY_NAME);
}
else
{
Console.WriteLine("Perf counter category ({0}) does not exist - install first", CATEGORY_NAME);
}
}
private bool PerformanceCounterCategoryExists()
{
return PerformanceCounterCategory.Exists(CATEGORY_NAME);
}
}
答案 0 :(得分:3)
我有同样的问题 - .NET代码报告说计数器在那里,但是在perfmon中没有可见的这样的计数器类别。
显然,perfmon有时会disable performance counters by flagging it as disabled in the registry。
如果您在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
下check in the registry,您应该能够找到您的效果计数器类别(只需将您的类别名称作为“文件夹”之一)。在子项(“文件夹”)下Performance
找到注册表值Disable Performance Counters
并将其设置为零。重新启动perfmon,您现在应该在perfmon中看到您的类别和计数器。