[C# .NET] Windows의 모든 performance counter 나열 하기

2023. 2. 1. 19:23이것저것

728x90

 

 

Listing all performance counters on Windows with C# .NET

Performance counters in Windows can help you with finding bottlenecks in your application. There’s a long range of built-in performance counters in Windows which you can view in the Performan…

dotnetcodr.com

Windows의 Performance counter는 응용 프로그램의 병목 현상을 찾는 데 도움이 될 수 있습니다. Windows에는 Performance Monitor 윈도우에서 볼 수 있는 다양한 내장 Performance counter 들이 존재 합니다:

Performance Monitor window

큰 화면 오른쪽의 아무 곳이나 마우스 오른쪽 버튼으로 클릭하고 카운터 추가를 선택하면 원하는 카운터를 그래프에 추가 할 수 있습니다.

카운터 추가 창에 범주(category)가 먼저 표시됩니다. 그런 다음 범주를 열고 해당 범주 내에서 하나 이상의 특정 카운터를 선택할 수 있습니다. 

선택 즉시, 그래프에 실시간 데이터가 표시됩니다:

Performance Monitor with added pre-built categories

 

System.Diagnostics 네임스페이스에는 로컬 시스템이나 다른 시스템에서 사용 가능한 성능 범주(Performance category) 및 카운터를 찾을 수 있는 몇 가지 객체들이 존재하고  있습니다. 

각 성능 범주에는 이름(name), 도움말 텍스트(help text) 및 유형(type)이 있습니다. 컴퓨터에서 사용할 수 있는 범주를 찾는 방법은 간단합니다.:

PerformanceCounterCategory[] categories = PerformanceCounterCategory.GetCategories();
foreach (PerformanceCounterCategory category in categories)
{
    Console.WriteLine("Category name: {0}", category.CategoryName);
    Console.WriteLine("Category type: {0}", category.CategoryType);
    Console.WriteLine("Category help: {0}", category.CategoryHelp);
}
 

GetCategories()에는 네트워크 내의 다른 컴퓨터에 있는 카운터를 보려면 컴퓨터 이름을 지정할 수 있는 오버로딩 메서드가 있습니다.

 

이 게시물을 작성할 당시 내 컴퓨터에는 161개의 범주가 있었습니다. 예시:

Name: WMI Objects
Help: Number of WMI High Performance provider returned by WMI Adapter
Type: SingleInstance
이름: WMI 개체
도움말: WMI 어댑터가 반환한 WMI 고성능 공급자 수
유형: 단일 인스턴스
 

범주가 파악되면 범주 내의 카운터들은 쉽게 나열할 수 있습니다. 아래 코드는 인스턴스 이름과 함께 범주 이름, 유형 및 도움말 텍스트를 인쇄합니다. 범주 내에 별도의 인스턴스가 있는 경우 인스턴스 이름이 존재하는 경우 이와 함꼐 GetCounters 메서드를 호출해야 합니다. 그렇지 않으면 여러 인스턴스가 있다는 예외가 발생 할 것입니다.

PerformanceCounterCategory[] categories = PerformanceCounterCategory.GetCategories();
foreach (PerformanceCounterCategory category in categories)
{
    Console.WriteLine("Category name: {0}", category.CategoryName);
    Console.WriteLine("Category type: {0}", category.CategoryType);
    Console.WriteLine("Category help: {0}", category.CategoryHelp);
    string[] instances = category.GetInstanceNames();
    if (instances.Any())
    {
        foreach (string instance in instances)
        {
            if (category.InstanceExists(instance))
            {
                PerformanceCounter[] countersOfCategory = category.GetCounters(instance);
                foreach (PerformanceCounter pc in countersOfCategory)
                {
                    Console.WriteLine("Category: {0}, instance: {1}, counter: {2}", pc.CategoryName, instance, pc.CounterName);
                }
            }
        }
    }
    else
    {
        PerformanceCounter[] countersOfCategory = category.GetCounters();
        foreach (PerformanceCounter pc in countersOfCategory)
        {
                    Console.WriteLine("Category: {0}, counter: {1}", pc.CategoryName, pc.CounterName);
        }
    }   
}
 

각 카운터에는 차례로 이름, 도움말 텍스트 및 유형이 있습니다(name, a help text and a type). 예를 들어 다음은 "Active Server Pages" 범주가 있는 카운터입니다:

Name: Requests Failed Total
Help: The total number of requests failed due to errors, authorization failure, and rejections.
Type: NumberOfItems32
이름: 실패한 총계 요청
도움말: 오류, 인증 실패 및 거부로 인해 실패한 총 요청 수입니다.
유형: NumberOfItems32
 

여기에서 진단과 관련된 모든 게시물을 볼 수 있습니다.

이상.

728x90