성능 카운터 정보

Windows 성능 카운터는 프로세서, 메모리 및 디스크 사용 통계와 같은 다양한 종류의 시스템 데이터를 수집하기 위한 일관된 인터페이스를 갖춘 상위 수준 추상화 계층을 제공합니다. 시스템 관리자는 성능 카운터를 사용하여 성능 또는 동작 문제를 모니터링합니다. 소프트웨어 개발자는 성능 카운터를 사용하여 구성 요소의 리소스 사용량을 검사합니다.

Important

Windows 성능 카운터는 관리/진단 데이터 검색 및 수집에 최적화되어 있습니다. 초당 두 번 이상 수집하도록 설계되지 않았기 때문에 고주파 데이터 수집 또는 애플리케이션 프로파일링에는 적합하지 않습니다. 시스템 정보에 대한 오버헤드가 낮은 액세스의 경우 프로세스 상태 도우미, GlobalMemoryStatusEx, GetSystemTimes 또는 GetProcessTimes와 같은 보다 직접적인 API를 선호할 수 있습니다. 프로파일링의 경우 tracelog.exe를 사용하여 시스템 프로파일링 데이터로 ETW 로그를 수집하거나, -eflag-dpcisr또는 옵션과 함께 -critsecETW 로그를 수집하거나 -ProfileSource 하드웨어 카운터 프로파일링을 사용할 수 있습니다.

참고 항목

Windows 성능 카운터를 QueryPerformanceCounter API와 혼동하지 마세요. Windows 성능 카운터는 다양한 종류의 시스템 정보에 대해 개략적인 추상화 작업을 제공합니다. QueryPerformanceCounter 함수는 정밀도 높은 타임스탬프에 최적화된 액세스를 제공합니다.

시작하기

개념

Windows 성능 카운터 시스템은 소비자, 공급자, 카운터 세트, 카운터, 인스턴스 및 카운터 값으로 구성됩니다.

소비자는 성능 데이터를 사용하는 소프트웨어 구성 요소입니다. Windows에는 성능 데이터를 사용하는 몇 가지 기본 제공 도구 가 포함되어 있습니다. 여기에는 작업 관리자, 리소스 모니터, 성능 모니터, typeperf.exe, logman.exe 및 relog.exe가 포함됩니다. 개발자는 성능 카운터 API를 통해 성능 카운터에 액세스하는 스크립트 및 애플리케이션을 작성할 수 있습니다.

공급자는 성능 데이터를 생성하고 게시하는 소프트웨어 구성 요소입니다. 공급자는 하나 이상의 카운터 세트에 대한 데이터를 게시합니다. 예를 들어 데이터베이스 시스템은 성능 데이터 공급자로 등록할 수 있습니다.

  • V1 공급자는 소비자 프로세스에서 실행되는 성능 DLL통해 성능 데이터를 게시하는 소프트웨어 구성 요소입니다. V1 공급자는 파일을 통해 .ini 시스템에 설치됩니다. V1 공급자 아키텍처는 더 이상 사용되지 않습니다. 새 공급자는 V2 공급자 아키텍처를 사용해야 합니다.
  • V2 공급자는 성능 카운터 공급자 API를 통해 성능 데이터를 게시하는 소프트웨어 구성 요소입니다. V2 공급자는 (XML 매니페스트) 파일을 통해 .man 시스템에 설치됩니다.

카운터 세트는 공급자 내의 성능 데이터 그룹화입니다. 카운터 세트에는 이름과 하나 이상의 카운터가 있습니다. 카운터 세트에서 데이터를 수집하면 여러 인스턴스가 반환됩니다. 일부 Windows API에서는 카운터 세트를 성능 개체라고 합니다. 예를 들어 데이터베이스 시스템의 성능 데이터 공급자는 데이터베이스별 통계에 대한 카운터셋을 제공할 수 있습니다.

카운터는 단일 성능 데이터의 정의입니다. 카운터에는 이름과 형식이 있습니다. 예를 들어 "데이터베이스별 통계" 카운터 세트에는 형식 PERF_COUNTER_COUNTER이 있는 "초당 트랜잭션"이라는 카운터가 포함될 수 있습니다.

인스턴스는 성능 데이터가 보고되는 엔터티입니다. 인스턴스에는 이름(문자열) 및 하나 이상의 카운터 값이 있습니다. 예를 들어 "데이터베이스별 통계" 카운터 세트에는 데이터베이스당 하나의 인스턴스가 포함될 수 있습니다. 인스턴스 이름은 데이터베이스 이름이고 각 인스턴스에는 "초당 트랜잭션 수", "메모리 사용량" 및 "디스크 사용량" 카운터에 대한 카운터 값이 포함됩니다.

카운터 값은 단일 성능 카운터 데이터의 값입니다. 카운터 값은 해당 카운터의 형식에 따라 부호 없는 정수(32비트 또는 64비트)입니다. 인스턴스대해 이야기할 때 카운터 값을 카운터 또는 이라고도 합니다.

성능 카운터 용어를 더 친숙한 스프레드시트 용어와 연결하면 도움이 될 수 있습니다. 카운터 세트는 테이블과 같습니다. 카운터는 열과 같습니다. 인스턴스는 행과 같습니다. 카운터 값은 표의 셀과 같습니다.

단일 인스턴스 카운터 세트 는 항상 정확히 하나의 인스턴스에 대한 데이터를 포함합니다. 이는 시스템-전역 통계를 보고하는 카운터셋에 일반적입니다. 예를 들어 Windows에는 전역 메모리 사용량을 보고하는 "메모리"라는 기본 제공 단일 인스턴스 카운터 세트가 있습니다.

다중 인스턴스 카운터 세트 에는 가변 개수의 인스턴스에 대한 데이터가 포함됩니다. 이는 시스템 내의 엔터티에 대해 보고하는 카운터 세트에 일반적입니다. 예를 들어 Windows에는 설치된 각 CPU에 대해 하나의 인스턴스를 보고하는 "프로세서 정보"라는 기본 제공 다중 인스턴스 카운터 세트가 있습니다.

소비자는 공급자의 카운터 세트에서 데이터를 정기적으로 수집하고 기록합니다. 예를 들어 소비자는 초당 한 번 또는 분당 한 번 데이터를 수집할 수 있습니다. 수집된 데이터를 샘플이라고합니다. 샘플은 카운터 세트 인스턴스에 대한 데이터와 함께 타임스탬프로 구성됩니다. 각 인스턴스의 데이터에는 인스턴스 이름(문자열) 및 카운터 값 집합(정수, 카운터 세트의 각 카운터에 대해 하나의 값)이 포함됩니다.

인스턴스 이름은 일반적으로 샘플 내에서 고유해야 합니다. 즉, 공급자는 단일 샘플의 일부와 이름이 같은 두 개의 인스턴스를 반환해서는 안 됩니다. 일부 이전 공급자는 이 규칙을 따르지 않으므로 소비자는 고유하지 않은 인스턴스 이름을 허용할 수 있어야 합니다. 인스턴스 이름은 대/소문자를 구분하지 않으므로 인스턴스에는 대/소문자만 다른 이름이 없어야 합니다.

참고 항목

이전 버전과의 호환성을 위해 "Process" 카운터 세트는 EXE 파일 이름을 기반으로 고유하지 않은 인스턴스 이름을 반환합니다. 이로 인해 특히 고유하지 않은 이름의 프로세스가 시작되거나 종료될 때 혼동되는 결과가 발생할 수 있습니다. 이는 일반적으로 샘플 간의 인스턴스 이름 일치가 잘못되어 데이터 결함이 발생하기 때문입니다. "프로세스" 카운터 세트의 소비자는 이러한 고유하지 않은 인스턴스 이름과 결과 데이터 결함을 허용할 수 있어야 합니다. Windows 11 이상에서는 이 문제를 방지하기 위해 카운터 세트를 사용할 Process V2 수 있습니다.

인스턴스 이름은 샘플에서 안정적이어야 합니다. 즉, 공급자는 카운터 세트를 수집할 때마다 동일한 엔터티에 대해 동일한 인스턴스 이름을 사용해야 합니다.

각 카운터에는 형식이 있습니다. 카운터 형식은 카운터의 원시 값 형식(부호 없는 32비트 정수 또는 부호 없는 64비트 정수)을 나타냅니다. 카운터 형식은 카운터의 원시 값이 나타내는 것을 나타내며, 유용한 통계를 생성하기 위해 원시 값을 처리하는 방법을 결정합니다.

일부 카운터 형식은 간단하며 직접 유용한 원시 값을 가지지만 많은 카운터 형식은 유용한 형식의 값을 만들기 위해 추가 처리가 필요합니다. 형식이 지정된 값을 생성하기 위해 일부 카운터 형식에는 두 샘플의 원시 값이 필요하고, 일부 카운터 형식에는 타임스탬프가 필요하며, 일부 카운터 형식에는 여러 카운터의 원시 값이 필요합니다. 예시:

  • PERF_COUNTER_LARGE_RAWCOUNT 는 유용하게 처리할 필요가 없는 64비트 원시 값입니다. "사용 중인 메모리 바이트"와 같은 지정 시간 값에 적합합니다.
  • PERF_COUNTER_RAWCOUNT_HEX 는 유용한 간단한 16진수 서식만 필요로 하는 32비트 원시 값입니다. 특정 시점 또는 "플래그" 또는 "기본 주소"와 같은 정보를 식별하는 데 적합합니다.
  • PERF_COUNTER_BULK_COUNT 는 이벤트 수를 나타내는 64비트 원시 값이며 이벤트가 발생하는 속도를 계산하는 데 사용됩니다. 유용하게 사용하려면 이 카운터 형식에 시간별로 구분된 두 개의 샘플이 필요합니다. 형식이 지정된 값은 이벤트 속도입니다. 즉, 두 샘플 사이의 간격 동안 초당 이벤트가 발생한 횟수입니다. 두 개의 샘플 s0s1지정된 경우 형식이 지정된 값(이벤트 속도)은 다음과 같이 (s1.EventCount - s0.EventCount)/(s1.TimestampInSeconds - s0.TimestampInSeconds)계산됩니다.

공급자는 상태 비 상태인 것처럼 동작해야 합니다. 즉, 카운터 세트에서 데이터를 수집하는 것이 공급자의 상태에 눈에 띄게 영향을 미치지 않아야 합니다. 예를 들어 카운터 세트를 수집할 때 공급자가 카운터 값을 0으로 다시 설정하면 안 되며, 이전 컬렉션의 타임스탬프를 사용하여 현재 컬렉션의 값을 조정하면 안 됩니다. 대신 소비자가 원시 값 및 해당 타임스탬프를 기반으로 유용한 통계를 계산할 수 있도록 정확한 형식의 간단한 원시 카운터 값을 제공해야 합니다.

성능 API 아키텍처

Performance counter applications invoke Windows APIs which call into providers to obtain performance data.

성능 카운터 소비자는 다음과 같습니다.

대부분의 성능 카운터 소비자는 PDH.dllAPI를 사용하여 성능 데이터를 수집합니다. PDH는 쿼리 구문 분석, 여러 샘플에서 인스턴스 일치, 원시 카운터 데이터에서 형식이 지정된 값 계산과 같은 성능 카운터 수집의 여러 복잡한 측면을 관리합니다. PDH 구현은 V1 공급자의 데이터를 사용할 때 레지스트리 API를 사용하고 V2 공급자의 데이터를 사용할 때 V2 소비자 API를 사용합니다.

일부 이전 성능 카운터 소비자는 레지스트리 API 를 사용하여 특수 HKEY_PERFORMANCE_DATA 레지스트리 키에서 성능 데이터를 수집합니다. 레지스트리에서 데이터를 처리하는 것은 복잡하고 오류가 발생하기 쉽기 때문에 새 코드에는 권장되지 않습니다. 레지스트리 API 구현은 V1 공급자의 데이터 수집을 직접 지원합니다. V2 소비자 API를 사용하는 변환 계층을 통해 V2 공급자의 데이터 수집을 간접적으로 지원합니다.

일부 성능 카운터 소비자는 PerfLib V2 소비자 함수를 사용하여 V2 공급자의 데이터에 직접 액세스합니다. PDH API를 사용하여 데이터를 사용하는 것보다 더 복잡하지만 성능 또는 종속성 문제로 인해 PDH API를 사용할 수 없는 경우 이 방법이 유용할 수 있습니다. PerfLib V2 구현은 V2 공급자로부터 데이터 수집을 직접 지원합니다. V1 공급자의 데이터 수집은 지원하지 않습니다.

참고 항목

Windows OneCore는 PDH.dll을 포함하지 않으며 레지스트리 API를 통해 성능 카운터 데이터를 사용하는 지원을 포함하지 않습니다. OneCore에서 실행되는 소비자는 PerfLib V2 소비자 함수를 사용해야 합니다.

V1 공급자는 소비자 프로세스에 로드되는 공급자 DLL로 구현됩니다. 레지스트리 API 구현은 공급자 DLL 로드를 관리하고, DLL에 호출하여 성능 데이터를 수집하고, DLL을 적절하게 언로드합니다. 공급자 DLL은 일반적인 Windows API, RPC, 명명된 파이프, 공유 메모리 또는 기타 프로세스 간 통신 메커니즘을 사용하여 성능 데이터를 적절하게 수집할 책임이 있습니다.

V2 공급자는 사용자 모드 프로그램(종종 Windows 서비스) 또는 커널 모드 드라이버로 구현됩니다. 일반적으로 성능 데이터 공급자 코드는 기존 구성 요소에 직접 통합됩니다(예: 드라이버 또는 서비스가 자체에 대한 통계를 보고하는 경우). PerfLib V2 구현은 PCW.sys 커널 확장을 통해 요청 및 응답을 관리하므로 공급자는 일반적으로 성능 데이터를 제공하기 위해 프로세스 간 통신을 구현할 필요가 없습니다.

참고 항목

Windows 성능 카운터 API 및 도구에는 원격 레지스트리(V1 공급자용) 및 RPC(V2 공급자용)를 통해 다른 컴퓨터에서 성능 카운터에 액세스하기 위한 제한된 지원이 포함됩니다. 이 지원은 인증 제어(도구 및 API는 현재 사용자로만 인증할 수 있음)와 시스템 구성 측면에서 사용하기 어려운 경우가 많습니다(필요한 엔드포인트 및 서비스는 기본적으로 사용하지 않도록 설정됨). 대부분의 경우 기본 제공 원격 액세스 지원을 통해서가 아니라 WMI를 통해 원격 시스템의 성능 카운터에 액세스하는 것이 좋습니다.

대상 개발자

성능 카운터는 종종 관리자가 시스템의 성능 문제 또는 비정상적인 동작을 식별하고, 개발자가 소프트웨어 구성 요소의 리소스 사용을 연구하고, 개별 사용자가 프로그램이 시스템에서 어떻게 동작하는지 이해하는 데 사용됩니다. 사용은 작업 관리자 또는 성능 모니터 같은 GUI 도구, typeperf.exe 또는 logman.exe와 같은 명령줄 도구, WMI 및 PowerShell을 통한 스크립팅 또는 C/C++ 및 .NET API를 통해 발생할 수 있습니다.

성능 카운터 공급자는 일반적으로 커널 모드 드라이버 또는 사용자 모드 서비스로 구현됩니다. 성능 카운터 공급자는 일반적으로 C 또는 C++로 작성됩니다.

런타임 요구 사항

특정 프로그래밍 요소에 대한 런타임 요구 사항에 대한 자세한 내용은 해당 요소에 대한 참조 페이지의 요구 사항 섹션을 참조하세요.

버전 기록은 새로운 기능 참조하세요.

참고 항목

성능 카운터 사용

성능 카운터 참조