C#에서 CPU 사용량 가져오기

Aimen Fatima 2023년10월12일
  1. C#의 성능 모니터링
  2. C#의 성능 모니터링 카운터 데모
C#에서 CPU 사용량 가져오기

이 자습서에서는 프로그램에 영향을 미치는 성능 모니터링 매개변수에 대해 자세히 설명합니다. 또한 특히 C#에서 CPU 및 메모리 사용 방법을 시연합니다.

C#의 성능 모니터링

응용 프로그램/프로그램의 성능은 시스템의 메모리와 프로세서를 소비하므로 매우 중요합니다. 프로그램의 성능은 이러한 매개변수 값을 효율적으로 추적하고 사용자 지정하여 최적화할 수 있습니다.

시스템의 프로세서는 대부분 시스템의 CPU를 암시합니다. C#에서는 단일 프로세스 및 전체 프로세서의 CPU 사용량을 추적할 수 있습니다.

메모리 카운터는 메모리 관리 문제를 추적하는 데 사용할 수 있습니다. System.Diagnostics 네임스페이스는 모든 성능 카운터 매트릭스를 구현하는 PerformanceCounter 클래스를 제공합니다.

이 네임스페이스를 가져오고 PerformanceCounter 클래스 메서드를 사용하여 시스템 사용을 진단할 수 있습니다. 다음은 일부 성능 카운터와 해당 설명입니다.

개체가 성능 모니터이고 카운터는 PerformanceCounter 클래스에서 지원하는 카운터의 이름인 다음 카운터를 등록할 때 개체 이름: 카운터 - 설명 형식을 사용합니다.

프로세서 성능

  1. Processor: % Processor Time - 이 카운터는 프로세서가 유용한 스레드 작업에 적극적으로 할애하는 시간과 요청에 응답하는 데 사용된 빈도를 나타냅니다.

    이 카운터는 시스템이 비활성화된 시간을 100%로 나눈 비율을 계산합니다. 프로세서는 절대 유휴 상태가 아니므로 이 매개변수를 쉽게 계산할 수 있습니다. 항상 할 일이 있습니다.

  2. Processor: % User Time - 이 카운터의 값은 시스템에 영향을 미치는 처리 유형을 식별하는 데 도움이 됩니다. 결과는 사용자 모드 작업에 사용된 생산 시간의 전체 값입니다. 일반적으로 이것은 프로그램 코드를 나타냅니다.

  3. 프로세서: % 인터럽트 시간 - 인터럽트를 처리하는 데 사용되는 프로세서 시간을 보여줍니다.

  4. Process: % Processor Time - 이 카운터는 이 특정 프로세스가 프로세서를 사용하는 시간 값을 제공합니다.

  5. System: % Total Processor Time - 이 카운터는 모든 프로세서의 활동을 결합하여 전체 시스템 성능을 제공합니다. 이 값은 단일 프로세서 시스템에서 %Processor Time과 동일합니다.

메모리 성능

  1. 메모리: 사용 가능한 메모리 - 이 숫자는 페이징 풀 할당, 비페이징 풀 할당, 프로세스 작업 집합 및 파일 시스템 캐시가 완료된 후에도 여전히 사용 가능한 메모리 양을 보여줍니다.
  2. Memory: Committed Bytes - 이 카운터는 Windows NT 프로세스 또는 서비스에서 사용하기 위한 할당된 메모리 양을 표시합니다.
  3. Memory: Page Faults/sec - 이 카운터는 페이지 오류 수를 지정합니다. 페이지 오류는 필요한 정보가 캐시 또는 가상 메모리에 없는 경우입니다.
  4. Memory: Pages/sec - 이 카운터는 시스템이 메모리 관련 데이터를 저장하거나 검색하기 위해 하드 드라이브에 액세스하는 빈도를 보여줍니다.
  5. Process: Working Set - 프로세스가 코드, 스레드 및 데이터에 사용하는 현재 메모리 영역 크기를 보여줍니다.

C#의 성능 모니터링 카운터 데모

성능 모니터링 카운터를 시연하기 위해 C# 예제 코드를 생성합니다. Visual Studio 또는 Visual Studio Code를 사용하여 C# 빈 프로젝트를 만들어 보겠습니다.

첫 번째 단계는 Diagnostics 네임스페이스를 프로젝트로 가져오는 것입니다. 다음 코드를 사용하여 가져옵니다.

using System.Diagnostics;

System.Diagnostics.PerformanceCounter 클래스의 개체를 만들어야 합니다. 다음과 같이 두 개의 객체를 만듭니다. 하나는 메모리 사용 기록용이고 다른 하나는 CPU 사용용입니다.

protected static PerformanceCounter CPUCounter;
protected static PerformanceCounter memoryCounter;

다음 단계는 이러한 개체를 초기화하는 것입니다. C#에서 두 가지 방법을 사용하여 초기화할 수 있습니다.

  1. 개체 생성 시 매개 변수 값을 전달하여 개체를 초기화할 수 있습니다. 이 메서드에서는 기본 생성자를 호출할 필요가 없습니다.

    예를 들어:

    protected static PerformanceCounter CPUCounter =
        new PerformanceCounter(Object Name, Counter, Instance);
    protected static PerformanceCounter memoryCounter = new PerformanceCounter(Category Name, Counter);
    
  2. 다른 방법은 new 키워드와 기본 생성자를 사용하여 개체를 초기화하는 것입니다. 매개 변수 값은 점 식별자를 사용하여 변수에 액세스하도록 설정됩니다.

    예를 들어:

    // Initialize the objects
    CPUCounter = new PerformanceCounter();
    memoryCounter = new PerformanceCounter();
    
    // Assign values
    CPUCounter.CategoryName = Object Name;
    CPUCounter.CounterName = Counter;
    CPUCounter.InstanceName = Instance;
    
    memoryCounter.CategoryName = Object Name;
    memoryCounter.CounterName = Counter;
    

    초기화 후 다음 단계는 값을 계산하는 것입니다. NextValue() 메서드는 카운터 값을 가져오는 데 사용됩니다.

    위에서 만든 각 개체를 사용하여 이러한 메서드를 호출해야 합니다.

    Console.WriteLine(CPUCounter.NextValue());
    

총 CPU 및 메모리 사용량 검색

다음은 전체 CPU 및 메모리 사용량을 가져오는 전체 코드입니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace ConsoleApplication1 {
  class Program {
    // create objects
    protected static PerformanceCounter CPUCounter;
    protected static PerformanceCounter memoryCounter;
    static void Main(string[] args) {
      // initialize objects
      CPUCounter = new PerformanceCounter();
      memoryCounter = new PerformanceCounter();

      // assign parameters
      CPUCounter.CategoryName = "Processor";
      CPUCounter.CounterName = "% Processor Time";
      CPUCounter.InstanceName = "_Total";

      memoryCounter.CategoryName = "Memory";
      memoryCounter.CounterName = "Available MBytes";

      // invoke the following monitoring methods
      getCpuUsage();
      getMemory();
      Console.ReadKey();
    }

    // prints the value of total processor usage time
    public static void getCpuUsage() {
      Console.WriteLine(CPUCounter.NextValue() + "%");
    }

    // prints the value of available memory
    public static void getMemory() {
      Console.WriteLine(memoryCounter.NextValue() + "MB");
    }
  }
}

위 코드 스니펫의 출력은 %의 CPU 사용량과 MB의 사용 가능한 메모리입니다.

현재 프로세스의 CPU 및 메모리 사용량 검색

다음 코드 스니펫을 사용하여 현재 프로세스의 CPU 및 메모리 사용량을 가져올 수 있습니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace ConsoleApplication1 {
  class Program {
    protected static PerformanceCounter CPUCounter;
    protected static PerformanceCounter memoryCounter;
    static void Main(string[] args) {
      CPUCounter = new PerformanceCounter("Process", "% Processor Time",
                                          Process.GetCurrentProcess().ProcessName);

      memoryCounter = new PerformanceCounter("Memory", "Available MBytes");

      getCpuUsage();
      getMemory();
      Console.ReadKey();
    }

    public static void getCpuUsage() {
      Console.WriteLine(CPUCounter.NextValue() + "%");
    }

    public static void getMemory() {
      Console.WriteLine(memoryCounter.NextValue() + "MB");
    }
  }
}

위 코드 스니펫의 출력은 현재 프로세스에서 사용하는 프로세서와 시스템의 사용 가능한 메모리입니다.

특정 애플리케이션의 CPU 및 메모리 사용량 검색

특정 애플리케이션의 CPU 사용량을 확인하려면 PerformanceCounter 생성자에서 애플리케이션 이름을 인스턴스로 사용할 수 있습니다.

PerformanceCounter("Process", "% Processor Time", app_name);

다음은 특정 앱의 CPU 사용량을 가져오는 전체 예제 코드입니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace ConsoleApplication1 {
  class Program {
    static void Main(string[] args) {
      CPUUsagebyApp("chrome");
    }

    private static void CPUUsagebyApp(string app_name) {
      PerformanceCounter totalCPUUsage =
          new PerformanceCounter("Processor", "% Processor Time", "_Total");
      PerformanceCounter processCPUUsage =
          new PerformanceCounter("Process", "% Processor Time", app_name);

      // loop will be executed while you don't press the enter key from the keyboard
      // you have to press space or any other key to iterate through the loop.
      do {
        float total = totalCPUUsage.NextValue();
        float process = processCPUUsage.NextValue();

        Console.WriteLine(
            String.Format("App CPU Usage = {0} {1}%", total, process, process / total * 100));

        System.Threading.Thread.Sleep(1000);

      } while (Console.ReadKey().Key != ConsoleKey.Enter);
    }
  }
}

이 코드 스니펫의 출력은 "chrome"을 매개변수로 전달한 Chrome의 총 CPU 사용량 및 CPU 사용량입니다. [Performance Monitoring in C#]?redirectedfrom=MSDN)을 읽고 깊이 있게 이해할 수 있습니다.