PerformanceCounter - Category does not exist.
성능 모니터링 도구를 보면 닷넷 관련해서 다음과 같은 범주의 성능 카운터들이 제공되는 것을 볼 수 있는데요.

이를 이용하기 위해 실제로 코드를 작성하면,
using System;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
foreach (var item in PerformanceCounterCategory.GetCategories())
{
if (item.CategoryName.IndexOf("CLR") != -1)
{
Console.WriteLine(item.CategoryName);
}
}
Console.WriteLine();
string categoryName = ".NET CLR Memory";
var category = new PerformanceCounterCategory(categoryName);
var counters = category.GetInstanceNames(); // 예외 발생: Category does not exist
string counterName = "Gen 0 heap Size";
using (PerformanceCounter perfCounter
= new PerformanceCounter(categoryName, counterName, "......", true)) // 예외 발생: Category does not exist
{
// ......
}
}
}
}
위의 2가지 코드에서 예외가 발생하는 것을 볼 수 있습니다. 분명히 ".NET CLR Memory" 범주가 있는데도, 이에 대한 정보를 구하려고 하니 없다고 예외를 뿌리고 있는 것입니다.
System.InvalidOperationException was unhandled
Message=Category does not exist.
Source=System
StackTrace:
at System.Diagnostics.PerformanceCounterLib.CounterExists(String machine, String category, String counter)
at System.Diagnostics.PerformanceCounter.Initialize()
at System.Diagnostics.PerformanceCounter..ctor(String categoryName, String counterName, String instanceName, Boolean readOnly)
at ConsoleApplication1.Program.Main(String[] args) in d:\...\ConsoleApplication1\Program.cs:line 26
InnerException:
다행히 이에 대한 원인은 다음의 글에서 쉽게 찾을 수 있었습니다.
C#: Accessing PerformanceCounters for the “.NET CLR Memory category”
; http://stackoverflow.com/questions/4705698/c-accessing-performancecounters-for-the-net-clr-memory-category
즉, ^^ 관리자 권한으로 실행해야 한다는 군요.
비-관리자 권한일 때는 다음의 CLR 성능 카운터를 구할 수 있는 반면,
- .NET CLR Networking
- MSSQL$SQLEXPRESS:CLR
- .NET CLR Data
- .NET CLR Networking 4.0.0.0
관리자 권한인 경우 다음의 범주를 모두 다룰 수 있습니다.
- .NET CLR Exceptions
- .NET CLR Networking
- .NET CLR Loading
- .NET CLR LocksAndThreads
- .NET CLR Remoting
- .NET CLR Security
- .NET CLR Interop
- .NET CLR Memory
- .NET CLR Data
- .NET CLR Networking 4.0.0.0
- .NET CLR Jit
- MSSQL$SQLEXPRESS:CLR
그나저나... 이런 것은 성능 카운터의 부작용이라고 봐야 할 것 같습니다. 왜냐하면, 구하려는 성능 카운터의 대상이 자신과 동일한 exe인 경우일지라도 그 정보를 구할 수 없다는 것인데, 자신에 대한 성능 정보를 접근하는 것에 특별한 권한이 필요하다는 것은 좀 아이러니하죠. 다른 프로세스라면 이해할 수 있지만! ^^
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]