ETW(Windows용 이벤트 추적)는 Windows에 기본 제공되는 고속 추적 기능입니다. 운영 체제 커널에 구현된 버퍼링 및 로깅 메커니즘을 사용하여 ETW는 사용자 모드(앱) 및 커널 모드 구성 요소(드라이버)에서 발생하는 이벤트에 대한 인프라를 제공합니다. ETW는 시스템 및 앱 진단, 문제 해결, 성능 모니터링에 사용할 수 있습니다.
지금까지 추적은 하드웨어와 앱 모두에서 예기치 않은 동작을 진단하는 데 사용되었습니다. 그러나 최근에는 비즈니스 요구를 충족하기 위해 시스템 안정성 및 성능을 관리와 모니터링에 대한 수요가 증가하고 있습니다. 그 결과 개발 및 프로덕션 환경의 성능 분석은 컴퓨팅 환경에서 중요한 부분이 되었습니다. 실패 및 오류와 달리 성능 관련 문제는 구성 및 워크로드에 의존하는 경우가 많아서 검색하고 진단하기가 어렵습니다. 프로덕션 환경에서 추적은 근본 원인 성능 관련 문제뿐만 아니라 용량 계획 및 평가를 검색하는 데 유용한 데이터를 제공합니다.
ETW 메커니즘을 사용하면 추적 세션을 동적으로 제어할 수 있으므로 시스템을 다시 부팅하거나 앱을 다시 시작하지 않고도 프로덕션 환경에서 자세한 추적을 캡처할 수 있습니다.
다음 섹션에서는 ETW를 사용하여 정확한 성능 측정 및 분석을 수행하는 방법을 보여 줍니다.
- 커널 모드 드라이버
- 기존 데스크톱 프로세스 및 서비스
- Microsoft Store 앱(C#)
개요
다음 목록은 ETW의 몇 가지 유용한 특성을 보여 줍니다.
- 견고성
-
효율적인 버퍼링 및 로깅 메커니즘을 제공합니다. 추적 버퍼는 커널에서 관리됩니다. ETW를 통한 추적은 앱 크래시 및 중단에 영향을 받지 않습니다. 시스템 오류가 발생하는 경우 저장되지 않은 이벤트는 메모리 덤프 파일에서 액세스할 수 있습니다.
- 동적
-
시스템 또는 앱을 다시 시작하지 않고 추적 세션을 동적으로 시작, 중지, 다시 구성하거나 일시 중지할 수 있습니다. ETW는 다양한 요구를 충족하는 여러 모드를 제공합니다.
- Windows 기본 제공
-
컨트롤러 앱 외에는 추가 도구가 필요하지 않습니다. Windows에는 몇 가지 받은 편지함 컨트롤러와 소비자 앱이 있습니다.
- 경량
-
기록 추적 및 저장된 로그 파일의 오버헤드는 고도로 최적화되어 있으므로 앱 또는 시스템 성능에 영향을 미치지 않습니다. 로깅 메커니즘은 추적에서 오버헤드가 제한되도록 별도의 기록기 스레드에 의해 디스크에 기록되는 커널 모드 버퍼를 사용합니다.
Windows 2000 이전에는 Windows에서 기본 텍스트 기반 추적 메커니즘인 DbgPrint() 및 DebugPrint() API만 사용할 수 있었습니다. 디버거가 필요했고 일반적으로 동적으로 제어할 수 없었습니다. Windows 추적 메커니즘은 시간이 지남에 따라 발전해서 현재는 네 가지 추적 메커니즘을 사용할 수 있습니다. ETW 및 이벤트 로그 API 집합이 Windows Vista의 통합 이벤트 로깅 API 집합에 병합되어 사용자와 개발자에게 이벤트 발생을 위한 통합 메커니즘을 제공합니다.
여기에는 세 가지 형식의 이벤트가 있습니다.
Windows WPP(소프트웨어 추적 전처리기) 및 클래식 ETW
MOF(Managed Object Format): MOF는 WMI 개체를 설명하고 이벤트를 사용하도록 설정하고 디코딩하는 방법입니다.
매니페스트 기반: Windows Vista에서 XML 기반 통합 추적 정의가 도입되었습니다. XML 파일에는 공급자가 작성하는 이벤트에 대한 요소가 포함되어 있습니다. 자세한 내용은 측 매니페스트 작성을 참조하세요.
참고 항목
이 섹션의 지침은 매니페스트 기반 이벤트 계측에만 중점을 둡니다.
ETW에는 다음과 같은 중요한 특성이 있습니다.
개발자는 의도한 사용에 따라 올바른 구현 집합을 선택할 수 있습니다(예: WPP 구현과 같은 Printf는 디버깅 목적 이벤트를 위해 쉽게 추가할 수 있음).
인프라는 타임스탬프, 함수 이름, 소스 파일 줄 번호와 같은 일반적으로 사용되는 정보를 관리합니다.
사용자 모드 앱 및 커널 모드 구성 요소에 동일한 구현이 사용됩니다.
ETW는 크래시 덤프 및 라이브 디버그에서 액세스할 수 있습니다.
실시간 보기를 위해 ETW를 커널 디버거로 리디렉션할 수 있습니다.
ETW에는 실시간 보기가 있습니다.
로그 파일은 이진 로그 파일(ETL 파일)에 저장됩니다.
ETW는 여러 프로세스 로깅을 지원합니다.
ETW는 처리량이 높습니다.
로그 파일은 다른 머신에서 볼 수 있습니다.
ETW는 연속 로깅 및 모니터링을 위한 순환 버퍼링을 지원합니다.
ETW는 대상 그룹에 따라 채널 중 하나로 그룹화할 수 있습니다.
ETW 아키텍처
ETW에는 공급자, 세션, 컨트롤러, 소비자의 네 가지 주요 구성 요소가 있습니다.

공급자
공급자는 이벤트를 생성하는 계측된 구성 요소입니다. 공급자는 사용자 모드 앱, 커널 모드 드라이버 또는 Windows 커널 자체일 수 있습니다. 고정 이벤트 데이터(헤더) 외에도 이벤트는 사용자 데이터를 전달할 수 있습니다.
이벤트는 데이터의 이벤트 기반 표현입니다. 데이터는 심층 분석에 사용할 수 있습니다. 이벤트를 사용하여 카운터를 생성할 수도 있습니다. 카운터는 샘플 기반 데이터 보기를 제공합니다. 일반적으로 현재 상태를 표시하는 작은 데이터 세트(예: 초당 I/O 바이트 및 초당 인터럽트)가 포함됩니다.
공급자는 ETW에 등록하고 ETW 로깅 API를 호출하여 이벤트를 보내야 합니다. 공급자는 추적을 동적으로 사용하거나 사용하지 않도록 설정하기 위해 알림을 사용하거나 사용하지 않도록 설정하는 콜백 함수를 등록합니다.
세션
ETW 세션 인프라는 하나 이상의 공급자에서 소비자에게 이벤트를 릴레이하는 중간 브로커로 작동합니다. 세션은 커널 버퍼로 이벤트를 수집하고 지정된 파일이나 실시간 소비자 프로세스로 보내는 커널 개체입니다. 여러 공급자를 단일 세션에 매핑할 수 있으므로 사용자가 여러 소스에서 데이터를 수집할 수 있습니다.
컨트롤러
컨트롤러가 추적 세션을 시작, 중지 또는 업데이트합니다. 세션은 추적을 위한 단위입니다. 공급자는 특정 세션에 매핑(또는 사용하도록 설정)됩니다. 컨트롤러는 ETW에 이벤트 전송을 시작할 수 있도록 공급자를 사용하거나 사용하지 않도록 설정합니다. 컨트롤러 기능은 Microsoft에서 제공하는 도구를 사용하여 호출하거나 사용자 자체 앱을 작성할 수 있습니다.
Logman.exe는 기본 제공 컨트롤러 앱입니다. Windows Performance Toolkit의 WPR(Windows Performance Recorder)은 권장 컨트롤러 프로세스입니다.
소비자
소비자는 기록된 추적 파일(ETL 파일)을 읽거나 활성 추적 세션에서 이벤트를 실시간으로 캡처하고 이벤트를 처리하는 앱입니다. 이벤트 뷰어 및 리소스 모니터는 기본 제공 ETW 소비자 앱입니다.
Windows Performance Toolkit의 WPA(Windows Performance Analyzer)는 권장되는 소비자 프로세스입니다.
ETW 계측 구현
계측 계획
코드에서 ETW 이벤트를 기록할 위치를 결정합니다. 이 로깅은 중요한 사용자 시나리오 또는 측정, 분석과 궁극적으로 개선하려는 빈번한 사용 사례와 상관 관계가 있어야 합니다. 다음 목록은 계측할 수 있는 항목의 몇 가지 예를 보여 줍니다.
- 상태 변경
- 중요한 작업의 시작/종료
- 리소스 만들기/삭제
- 성능 또는 안정성과 관련된 기타 이벤트
- 이벤트 디버그
매니페스트 파일 만들기 및 공급자 구현
매니페스트 기반 ETW 이벤트는 이벤트 매니페스트라는 XML 파일을 사용하여 서비스를 포함한 사용자 모드 앱 및 드라이버와 같은 커널 모드 구성 요소에서 구현할 수 있습니다. 자세한 내용은 이벤트 추적 기능을 참조하세요.
이벤트 매니페스트는 다음 섹션으로 이루어져 있습니다.
- 공급자 정의: < 공급자 >
-
만드는 공급자의 이름 및 GUID와 계측된 이진 파일의 위치를 포함합니다(결국 ETW 프레임워크에 필요한 계측 리소스를 포함).
- 이벤트 페이로드: <템플릿>
-
이벤트에 페이로드로 포함될 데이터 형식의 정의를 포함합니다. 사용 가능한 유형은 다음과 같습니다.
-
부호 있는/부호 없는 8비트, 16비트, 32비트 및 64비트 정수
-
ANSI 및 유니코드 문자열
-
부동 소수점 수 및 실수
-
부울, 이진, GUID, 포인터, FILETIME, SYSTEMTIME, SID 및 HexInt32
-
- 정적 이벤트 데이터
-
이벤트를 해석, 정렬 및 그룹화하는 데 사용됩니다.
- 계측되는 연산(또는 작업)의 이름을 정의합니다.
- 시작 이벤트, 중지 이벤트(연산 시간 구분), 디버그 데이터 로깅을 위한 정보 이벤트 등 이벤트에 대해 만들려는 작업 유형을 정의합니다.
-
이벤트 정의: <이벤트>
페이로드와 정적 데이터를 함께 연결합니다. 코드는 이 섹션에 나열된 내용에 정의된 대로 이벤트를 내보냅니다.
이벤트 매니페스트의 예는 다음과 같습니다.
<provider
guid="{3877cf22-0702-4dfc-965e-7fdc7780cd74}"
name="MyEventProvider"
symbol="MY_EVENT_PROVIDER"
messageFileName="%temp%\MyProviderBinary.exe"
resourceFileName="%temp%\MyProviderBinary.exe“
>
<templates>
<template tid="T_MyProvider_1">
<data inType="win:Int32" name="Operation Id" />
<data inType="win:Int32" name="Memory Allocated (MB)" />
</template>
</templates>
<opcodes>
<opcode name="DebugInfo" symbol="_DebugInfo" value="10"/>
</opcodes>
<tasks>
<task name="OpMemAllocation" symbol="OpMemAllocation_Task" value="1“
eventGUID="{87ebca33-bf25-442c-9256-82ba484586e8}"/>
</tasks>
<events>
<event symbol="DebugInfo" template="T_MyProvider_1" value="200"
task="OpMemAllocation" opcode="DebugInfo" />
</events>
매니페스트 파일을 작성하려면 다음을 사용할 수 있습니다.
플랫폼 SDK에서 사용할 수 있는 매니페스트 생성기(ECManGen.exe)
플랫폼 SDK에서 사용할 수 있는 Visual Studio(Eventman.xsd)
이벤트 매니페스트 컴파일
다음 단계는 플랫폼 SDK에서 사용할 수 있는 메시지 컴파일러 도구(mc.exe)를 사용하여 매니페스트를 컴파일하는 것입니다. 이 도구는 계측된 코드를 계측, 컴파일, 빌드하는 데 필요한 몇 가지 파일을 생성합니다.
- ManifestFileName.h
- 코드에서 사용할 이벤트 설명자가 포함되어 있습니다.
- ManifestFileName.rc
- 리소스 컴파일러 스크립트.
- MSG00001.bin
- 언어 리소스.
- ManifestFileNameTEMP.bin
- 템플릿 리소스(공급자 및 메타데이터).
사용자 모드 코드를 컴파일하려면 다음을 입력합니다.
mc.exe -um [ManifestFileName]
커널 모드 코드를 컴파일하려면 다음을 입력합니다.
mc.exe -km [ManifestFileName]
관리 코드 또는 JavaScript 코드를 컴파일하려면 다음을 입력합니다.
mc.exe -cs [ManifestFileName]
mc.exe -css [ManifestFileName]
mc.exe -generateProjections [ManifestFileName]
코드 업데이트
다음 단계는 코드에 계측을 추가하는 것입니다. Visual Studio를 실행하고 메시지 컴파일러에서 생성한 헤더 파일을 추가하고 리소스 파일을 프로그램에 빌드합니다.
헤더에서 다음을 검색하여 코드에서 호출할 매크로(또는 클래스 메서드)를 찾습니다.
EventRegister<YourProviderName>
공급자를 등록하는 데 사용됩니다(앱 시작 시).
EventUnregister<YourProviderName>
공급자 등록을 취소하는 데 사용됩니다(앱 완료 시).
EventWrite
각 이벤트에 대한 하나의 매크로(또는 메서드)가 매니페스트(<events> 노드)에 정의되어 있습니다.
코드가 제대로 계측되면 이진을 빌드할 수 있습니다.
드라이버의 경우 MSDN에서 사용할 수 있는 EventDrv 샘플을 검토합니다. ETW 커널 모드 EtwRegister 함수를 사용하여 드라이버를 이벤트 공급자로 등록합니다.
디바이스 개체를 만들고 초기화하는 코드 뒤에 DriverEntry 루틴에 이 함수를 추가합니다.
드라이버의 언로드 루틴에서 EtwUnregister 호출과 EtwRegister 함수 호출을 일치시킵니다.
이벤트 로그 및 시각화
구성 요소를 올바르게 계측한 후에는 테스트 시스템에서 이벤트 로깅을 시작할 수 있습니다. 먼저 받은 편지함 도구인 wevtutil을 사용하여 공급자를 등록하고 로깅을 위해 해당 시스템을 준비해야 합니다.
resourceFileName 특성에 의해 매니페스트에 지정된 위치에 구성 요소를 복사합니다.
xcopy /y MyProviderBinary.exe %temp%
공급자를 등록합니다.
wevtutil um etwmanifest.man
wetvutil im etwmanifest.man공급자가 표시되는지 확인합니다.
logman 쿼리 공급자
공급자 이름/GUID가 목록에 표시됩니다.
이벤트 메타데이터는 매니페스트 파일이 아니라 계측된 이진에 저장됩니다. wevtutil을 사용하여 PC에 매니페스트를 설치하면 공급자 GUID를 이벤트 메타데이터가 포함된 이진에 연결하는 링크가 레지스트리에 추가됩니다. 해당 이진의 이름과 경로는 제공된 매니페스트 파일에서 가져옵니다. 나중에 매니페스트 파일을 삭제할 수 있습니다.
디코딩하는 데 사용하는 머신에 있으므로 이벤트 메타데이터를 포함하는 이진도 액세스 가능하고 로드할 수 있어야 합니다. WPR/xperf는 추적에 메타데이터를 삽입하여 프로세스의 이식 가능성을 높입니다.
공급자가 이 시스템에 제대로 설치되면 추적 세션을 시작하여 구성 요소에서 ETL 파일로 이벤트를 수집할 수 있습니다. Windows Performance Toolkit에서 사용할 수 있는 Windows Performance Recorder(WPR) 또는 명령줄 도구인 Xperf 둘 다 사용할 수 있습니다.
추적 시작:
xperf -start MySession -on MyEventProvider -f MySession.etl
해당 명령줄에서 -start는 이벤트 수집 세션에 이름을 지정하고 -on은 이 세션에서 공급자로부터 이벤트를 수집하고 싶다고 ETW에 알립니다. (여러 개의 -on 인수가 있을 수 있습니다.)
워크로드를 실행합니다.
추적을 중지합니다.
xperf -stop MySession
ETL 파일이 있으면 Windows Performance Analyzer 도구로 파일을 열고 일반 이벤트 그래프 및 테이블을 사용하여 이벤트를 시각화할 수 있습니다.
