How to use Xperf(Windows Performance Toolkit)

Xperf는 디스크에서 커널 시스템 동작상황까지 살펴볼수 있는 성능 분석툴로써, 좀전까지는 프로세서를 많이 사용했네까지 였다면, 이 툴은 해당시간에 동작했던 프로세스들을 각 사용률에 따라 보여주며, 비스타 이후부터는 그 당시의 콜스택까지 확인할수 있다. 실제 문제점이 발생하였을 때 원인 분석을 위해 많이 사용되는데, 프로세서 사용률이 높다거나, 디스크 I/O가 높은데 해당 I/O 원인을 자세히 살펴보고자 할때 사용하면, 성능 최적화에 많은 도움이 될 것이다.. 본툴은 Windows Performance Analysis Toolkit에 포함되었고 별로로도 제공한다. http://msdn.microsoft.com/en-us/performance

Xperf는 ETW(Event tracing for windows)를 이용하여 커널과 하드웨어등 윈도우에서 발생하는 각종이벤트를 추적하여 수집하고 이를 ETL(Event tracing log)로 남기게 된다.

How to use Xperf(Windows Performance Toolkit)

[그림] Windows Performance Toolkit에 Xperf가 있다

재배포 용도로 인스톨 파일이 필요하다면, Redistributable Package의 Windows Performance Toolkit를 선택하여 설치하고, 아래 디렉토리에서 설치 파일을 구할 수 있다.

C:Program FilesMicrosoft SDKsWindowsv7.1RedistWindows Performance Toolkit

[내용] 재배포 패키지를 함께 설치할 수 있다

Xperf의 실행 구조를 살펴보면 다음과 같다.

ETW에 대한 제어를 Xperf가 담당하고, Xperfview는 실행 결과를 확인하는 도구인데, 여기에 심볼 정보를 추가하여 확인할 수 있다.

[그림] Xperf와 ETW와의 관계

Xperf는 총 3개의 파일로 나뉘며 다음과 같은 역할을 가진다.

Xperf.exe: 이벤트 추적 및 분석을 진행한다.

Xperfview.exe: 추적한 결과값을 서로 연관된 이벤트로 작성하여 그래프 보여준다.

Xbootmgr.exe: 부팅과정을 ETW를 통해 추적할 수 있다..

하지만 Xperf는 설치형 프로그램이 아니기 때문에 설치하지 않아도, Perfctrl.dll, xperf.exe, xperfview.exe만 복사하여도 실행할 수 있다. 공식적으로 비스타 이후 버전만 지원하지만, 앞서 애기 했듯이 윈도우 2000부터 ETW 기능이 있었던 만큼 윈도우 2000부터 사용할 수 있다.(공식적으로 지원하지는 않는다.)

단, 콜 스택 추적시 심볼 내용 확인은 비스타 이후 버전에서부터 확인할 수 있다.

추가로 64bit 운영체제에서 콜 스택을 추적하기 위해서는 다음 레지스트리를 추가후 시스템을 재시작해야한다.

HKLMSystemCurrentControlSetControlSession ManagerMemory Management

DisablePagingExecutive (REG_DWORD) = 1

[그림] 콜 스택 추적을 위해 위 레지스트리값을 추가

사용법은 다음과 같다.

사전에 만들어진 프로파일을 이용한 특정 기능에 특화된 수집하는 방법과 플래그를 이용한 일반적인 데이터 수집 방법이 있는데, 상황에 알맞게 수집하기를 바란다.(두가지 방식 모두 큰 차이를 나타내지 않으므로 플래그 방식을 추천한다.)

Xperf는 아래와 내용()와 같은 프로파일을 제공하는데, 이는 Xperf –profiles를 통해 확인할 수 있다.

InSequentialFile, InBuffer의 차이는 스트림 모드로 파일로 기록할지 버퍼에 기록할지의 차이고, 실제 데이터의 차이는 있지 않다.

파일 I/O 추적

perf!FileIOProfiles.InSequentialFile

perf!FileIOProfiles.InBuffer

일반적인 시스템 추적

perf!GeneralProfiles.InSequentialFile

perf!GeneralProfiles.InBuffer

인터넷 익스플로러 8

perf!IE8Profiles.InSequentialFile

perf!IE8Profiles.InBuffer

기본시스템

perf!PerfCoreProfiles.InSequentialFile

perf!PerfCoreProfiles.InBuffer

레지스트리 추적

perf!RegistryProfiles.InSequentialFile

perf!RegistryProfiles.InBuffer

기본프로파일

perf!StdProfile

[내용] 기본 제공 프로파일

Xperf가 다른 기능보다 마음에 드는 기능은 바로, 다양한 커널 데이터를 수집할 수 있다는 것이다. 커널의 플래그는 아래와 같은 플래그를 지원한다. 시스템 용어인 부분은 함께 설명을 추가 하였다.

PROC_THREAD        : 프로세스와 스레드 생성과 삭제

LOADER            : 커널과 유저모드 이미지 로드와 언로드 이벤트

PROFILE            : CPU Sample profile

CSWITCH            : Context Switch

COMPACT_CSWITCH        : Compact Context Switch

DISPATCHER        : CPU Scheduler

DPC            : DPC Events

INTERRUPT        : Interrupt events

SYSCALL            : System calls

PRIORITY            : 우선순위 변경 이벤트(Priority change events)

SPINLOCK            : Spinlock Collisions

ALPC            : Advanced Local Procedure Call

PERF_COUNTER        : Process Perf Counters

DISK_IO            : 디스크 I/O(Disk I/O)

DISK_IO_INIT        : 디스크 I/O 개시(Disk I/O Initiation)

FILE_IO            : 파일시스템 운영 종료시간과 결과

FILE_IO_INIT        : 파일시스템 운영(create/open/close/read/write)

HARD_FAULTS        : Hard Page Faults

FILENAME            : 파일이름 (FileName create/delete/rundown)

SPLIT_IO            : 쪼개진 I/O

REGISTRY            : 레지스트리 추적

DRIVERS            : 드라이버 이벤트(Driver events)

POWER            : 파워 관리 이벤트(Power management events)

NETWORKTRACE        : 네트워크 이벤트( tcp/udp send/receive)

VIRT_ALLOC        : 가상메모리 예약과 해제(Virtual allocation reserve and release)

MEMINFO            : 메모리 리스트 정보(Memory List Info)

ALL_FAULTS        : 모드 페이지 폴트(hard, Copy on write, demand zero faults, etc.)

CONTMEMGEN        : 인접 메모리 생성(Contiguous Memory Generation)

POOL            : 풀메모리 추적(Pool tracing)

CPU_CONFIG        : NUMA topology, 프로세서 그룹과 프로세서 번호를 매핑(기본적으로 항상 활성화)

[내용] 커널 추적 플래그

그리고 일반적으로 유용한 커널 플래그들을 사전에 그룹으로 만들어 제공한다. 아마 다른 기능보다 유용하게 사용하게 될것이라 판단된다.

Base:

PROC_THREAD LOADER DISK_IO HARD_FAULTS PROFILE MEMINFO

Diag:

PROC_THREAD LOADER DISK_IO HARD_FAULTS DPC INTERRUPT CSWITCH PERF_COUNTER COMPACT_CSWITCH

DiagEasy:

PROC_THREAD LOADER DISK_IO HARD_FAULTS DPC INTERRUPT CSWITCH PERF_COUNTER

Latency:

PROC_THREAD LOADER DISK_IO HARD_FAULTS DPC INTERRUPT CSWITCH PROFILE

FileIO:

PROC_THREAD LOADER DISK_IO HARD_FAULTS FILE_IO FILE_IO_INIT

IOTrace:

PROC_THREAD LOADER DISK_IO HARD_FAULTS CSWITCH

ResumeTrace:

PROC_THREAD LOADER DISK_IO HARD_FAULTS PROFILE POWER

SysProf:

PROC_THREAD LOADER PROFILE

Network:

PROC_THREAD LOADER NETWORKTRACE

[내용] 필요에 따라 사용할 수 있도록 구성된 커널 플래그 그룹

그럼 이제 사용법에 대해 알아보자.

프로파일 사용방법은 –start 와 –stop 옵션을 이용하여 사용이 가능하다.(-on, -d 명령도 가능하나, 종료시 오류가 발생하며, 데이터 취합이 정상적으로 되지 않을 수 있다.)

아래 옵션은 일반적인 시스템 프로파일을 이용하여 수집후, 해당 결과를 PerfCoreProfiles.etl로 저장하는 명령이다.

Xperf –start perf!PerfCoreProfiles.InSequentialFile

수집후

Xperf –stop perf!PerfCoreProfiles.InSequentialFile PerfCoreProfiles.etl

[내용] Xperf 프로파일 사용방법

커널 플래그/그룹은 –on, -d 옵션을 사용할 수 있다.

아래 옵션은 DiagEasy 커널 플래그 그룹를 이용한 수집과 해당 결과를 DiagEasy.etl로 저장하는 명령이다. –d 옵션은 –start와 함께 사용할 수 있으나, 일부 프로파일에서는 오류가 나타날 수 있다.

Xperf.exe –on DiagEasy

수집후

Xperf.exe –d DiagEasy.etl

[내용] Xperf 플래그/그룹 사용방법

그럼 이제부터 Xperf는 다양한 기능에 대해 애기해 보자.

Xperf는 제일 큰 특징은 수집한 자료에서 원하는 이벤트를 골라 내거나, 특정 수집 시간대를 지정하여 세부 내용(Summary Table)을 이용해 자세히 확인할 수 있다는 것이다.

[그림] Xperfview 메인화면

그리고 Summary Table을 통해 세부 내용을 확인 할 수 있는데 진노랑색 띠를 통해 그룹형 컬럼과 숫자형 컬럼의 기준으로 나뉘어 그룹형이 가능한 경우 그룹형 컬럼을 진노랑색 띠 앞에 두어 그룹으로 보여지게 된다. 그리고, 그룹형 컬럼의 위치 순서에 따라 그룹형이 가능할 경우 그룹형으로 정렬되어 보여지게 되는데, 아래 그림은 Process가 처음으로 위치하기 때문에 그룹이 가능한 프로세스를 함께 보여주게 된다. 만약 Process를 진노랑색 띠 뒤로 위치하면, Thread를 통해 그룹형이 보여지게 되나, 아래 그림에서는 같은 값의 Thread ID가 없기 때문에 그룹형은 풀리게 된다.

(Process 컬럼을 진노랑색 띠 뒤로 이동시 아래와 같이 그룹을 만들지 못하게 된다.)

[그림] Summary Table에서 내용을 정렬할 수 있다.

그리고 비스타에서 추가된 기능중 스택을 확인할 수 있는데 실제 어떤 호출을 진행할 때 문제점이 발생하는지를 자세히 알수 있기 때문에, 원인 확인에 매우 유용한 기능이다. CPU Sampling by Process에서 확인하고자 하는 영역을 선택한후 마우스 오른쪽 버튼을 눌러 Summary Table 메뉴를 선택하도록 하자. 그후 Summary table에서 컬럼(Columns)을 확장해 스택(Stack)을 체크하면 아래와 같으 스택정보를 확인 할 수 있다.

[그림] 스택 정보를 확인할 수 있다.

간혹 ?로 확인할 수 없는 상태로 정보가 나타나는데, 이는 심볼 설정을 해주지 않아서이다.

심볼은 Trace 메뉴에서 Configure Symbol Paths를 통해 아래와 같이 심볼 경로가 정상적으로 등록되었는지 확인하자.

[그림]심볼 설정

그리고 Trace 메뉴에 Load Symbols를 체크하면, 프로세스별 처리하였던 콜 스택 정보를 확인 할 수 있다.

[그림] 해당 프로세스가 실행한 스택정보를 확인할 수 있다.

만약 계속 심볼이 보이지 않는다면, Xperfview.exe를 관리자 권한으로 실행하였는지 확인해보기 바란다.

그럼 Xbootmgr.exe에 대해서도 알아보자.

Xbootmgr는 시스템 시작 혹은 시스템 종료, 대기 상황, 시스템 재시작등과 같은 특수 상황에 ETW를 이용하여 시스템 이벤트를 기록할 수 있다.

이 옵션은 Xbootmgr –trace를 이용해 사용할 수 있으며, 사용가능한 추적 옵션은 다음과 같다.

Boot        : 시스템 시작 과정 추적

Hibernate    : 최대절전모드 과정 추적

Standby        : 대기모드 과정 추적

Shutdown    : 시스템 종료 과정 추적

RebootCycle    : 시스템 재시작 과정 추적

[내용] Xbootmgr 추적 옵션

만약 부팅 과정을 ETW를 이용해 추적하고 싶다면 아래와 같이 실행하면 된다.

xbootmgr –trace boot –traceFlags BASE CSWITCH DRIVERS POWER –resultPath C:TEMP

[내용] 추적시 기록할 플래그를 직접 지정할 수 있다.

위 명령을 실행하면 실행과 동시에, Xbootmgr은 시스템 재시작을 진행한다.

이후 재시작이 완료 되면, 아래와 같이 대기시간을 가지는데, Post Boot상태에서 실행이 완료되지 않았을 수도 있으므로, 최대 120초간 대기후(이미 모든 부팅작업이 완료되었다면, Finish를 누르면 된다.), 커널 이벤트와 유저 이벤트의 수집한 결과를 합치게 된다.

[그림]Post Boot 과정이 마무리를 위한 대기상태

이 작업이 마무리되면, C부팅 과정중 실행된 프로세스와 실행 시간, 로드한 드라이버, 로드된 시간등을 자세히 알수 있다.

아래 각 부팅과정을 단계별로 나누어 소요 시간을 표시한 것이다.

[그림]Boot Phases 중요 부팅 작업에 대해 실행 시간 및 소요시간 표시

부팅과정중 사용된 프로세스들도 아래와 같이 확인할 수 있다.

[그림] Process Lifetimes을 통해 각 프로세스의 실행 시간 및 소요시간, 인자값 표시

현재 결과 보고서를 보면 커널 영역 생성에 8초의 시간이 소요되고, Smss(세션관리자)가 8초에 실행된후 세션을 생성하기 위해 여러 차례 생성된 것을 확인 할 수 있다.

이 추적 로그를 통해 우리가 앞서 공부하였던 부팅 프로세스들에 대해 더욱 쉽게 다가올것이라 생각된다.

그럼 예제를 통해 Xperf에서 주로 사용되는 기능들중 체크해야하는 각 부분들에 대해 확인해보자.

먼저 명령 프롬프트(Cmd.exe)를 열어Xperf를 이용해 이벤트를 추적하도록 하자.

Xperf –on latency

[내용] Xperf를 일반 모드로 추적을 활성화

명령이 정상적으로 실행되었다면, chkdsk를 통해 디스크 검사를 진행하자.

chkdsk c:

[내용] 디스크 검사 진행

이후 Xperf을 중지해 수집한 이벤트를 ETL로 머지하도록 하자.

Xperf –d latency.etl

[내용] 추적 결과를 latency.etl 저장

먼저 CPU Sampling by Process 정보를 통해 CPU 사용률을 측정한다.

CPU에서는 전체 CPU 사용량과 각 프로세스가 어느정도 사용하였는지에 대해 확인하여야한다.

예제에서는 전체 9% 사용중에 3.8%를 chkdsk가 사용한것으로 확인되어, chkdsk는 프로세스 성능에 영향이 없음을 알수 있다.

[그림] CPU 전체 사용률이 9.3%로 저조함

그 후 정밀 분석을 위해, 메인 화면의 CPU Sampling by Process에서 chkdsk만 선택한후, CPU를 많이 사용한 시간대를 선택하고, Summary Table을 통해, Stack을 확인하면, CPU 분석을 조금더 용의할것이다.

[그림]프로세스에서 chkdsk만 선택하여 분석

그럼 이제 디스크 성능에 대해서도 확인해 보도록 하자.

디스크에서는 어느 파일에 어떠한 프로세스가 많이 사용하였는지를 확인하여야 한다.

그리고, 얼마나 많이 읽고, 기록하였지에 대한 부분을 확인하기 위해, Read Counts와 Write Counts 항목도 유심히 살펴야 할 것이다.

[그림] Service Time과 Read Counts, Write Counts를 주의깊게 보자

위 걸과를 보면, chkdsk를 위해, VolumeShadowCopy기능을 사용한것으로 확인됨을 알수 있다. 즉VolumeShadywCopy기능이 정상적으로 동작하지 않으면, Chkdsk는 정상동작하지 않음을 이를 통해 알수 있게 될것이다. 그리고 Service Time과 Read Counts를 통해 이벤트 수집기간동안 대부분의 디스크 사용을 Chkdsk가 점유한 것을 알 수 있다. 디스크 기록에는 현재 Xperf이외에는 거희 없음을 확인 할 수 있었다.

Facebook Comments

Leave A Reply

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.