성능 분석기
Linux 데스크톱 및 임베디드 장치에서 애플리케이션의 CPU 및 메모리 사용량을 분석합니다.
성능 분석기의 전체 설정을 지정하려면 Preferences > Analyzer > CPU Usage 로 이동하십시오.
특정 실행 구성에 대한 기본 설정을 설정하려면 Projects > Run Settings 로 이동하여 Performance Analyzer Settings 옆의 Details 를 선택하십시오.

현재 실행 구성의 설정을 편집하려면 성능 분석기 도구 모음에서 [
] 옆의 드롭다운 메뉴를 선택하십시오.

이벤트 유형 선택
이벤트 테이블에는 성능 분석기가 샘플을 채취하도록 트리거하는 이벤트가 나열됩니다. CPU 사용량을 분석하는 가장 일반적인 방법은 실행된 명령어 수나 CPU 사이클 수에 반응하는 하드웨어 성능 카운터를 기반으로 한 주기적인 샘플링입니다. 또한 CPU 클럭을 사용하는 소프트웨어 카운터를 선택할 수도 있습니다.
Add Event 를 선택하여 테이블에 이벤트를 추가하십시오. ‘ Event Type ’에서 샘플링할 이벤트의 일반적인 유형을 선택하십시오. 가장 일반적인 유형은 ‘ hardware ’ 또는 ‘ software ’입니다. ‘ Counter ’에서 샘플링에 사용할 카운터를 선택하십시오. 예를 들어, ‘ hardware ’ 그룹의 ‘ instructions ’ 또는 ‘ software ’ 그룹의 ‘ cpu-clock ’을 선택할 수 있습니다.
캐시 미스(cache misses)나 캐시 히트(cache hits)와 같은 보다 전문적인 샘플링도 가능합니다. 그러나 이에 대한 지원 여부는 CPU의 특정 기능에 따라 다릅니다. 이러한 전문적인 이벤트의 경우, Operation 및 Result 에서 더 자세한 샘플링 지침을 확인하십시오. 예를 들어, 읽기 시 L1-dcache 미스를 샘플링하려면 load 작업에서 misses 결과를 가진 L1-dcache 에 대한 cache 이벤트를 선택하십시오.
Remove Event 을 선택하여 테이블에서 선택한 이벤트를 제거합니다.
Use Trace Points 을 선택하여 현재 선택된 이벤트를 대상 장치에 정의된 추적 지점으로 대체하고, Sample mode 을 event count 로, Sample period 을 1 로 설정합니다. Create Trace Points 이 대상의 추적 지점을 정의하는 경우, Performance Analyzer는 이를 자동으로 사용하여 메모리 사용량을 프로파일링합니다.
Reset 을 선택하면 이벤트 선택 사항을 초기화하고, Sample mode 및 Sample period 을 기본값으로 복원할 수 있습니다.
샘플링 모드 및 주기 선택
Sample mode 및 Sample period 에서 샘플링 트리거 방식을 지정합니다.
- event count 을 통한 샘플링은 커널이 선택된 이벤트 중 하나가
n번 발생할 때마다 샘플을 채취하도록 지시하며, 이때n는 Sample period 에서 설정된 값입니다. - frequency (Hz) 을 통한 샘플링은 커널이 샘플링 주기를 자동으로 조정하여 초당
n회 샘플을 채취하도록 지시합니다.n은 Sample period 에서 설정합니다.
샘플링 빈도가 높거나 이벤트 수가 적을수록 데이터의 정확도는 높아지지만, 그 대가로 오버헤드가 증가하고 생성되는 데이터 양도 많아집니다. 실제 샘플링 주기는 대상 장치의 리눅스 커널에 의해 결정되며, 커널은 Perf에 설정된 주기를 단지 참고 사항으로만 간주합니다. 요청한 샘플링 주기와 실제 결과 사이에는 상당한 차이가 있을 수 있습니다.
일반적으로, 대상 장치와 호스트 장치 간의 연결을 통해 전송할 수 있는 양보다 더 많은 데이터를 수집하도록 성능 분석기를 구성하면, Perf가 데이터를 전송하는 동안 애플리케이션이 차단될 수 있으며 처리 지연 시간이 과도하게 늘어날 수 있습니다. 이 경우 Sample period 또는 Stack snapshot size 의 값을 변경해야 합니다.
호출 그래프 모드 선택
Call graph mode 에서는 Performance Analyzer가 애플리케이션에서 호출 체인을 복원하는 방식을 지정할 수 있습니다.
- Frame Pointer 또는
fp모드는 프로파일링 대상 애플리케이션에 프레임 포인터가 존재해야 하며, 대상 장치의 커널에 각 샘플에 대한 호출 체인을 검색하기 위해 프레임 포인터 체인을 추적하도록 지시합니다. - Dwarf 모드는 프레임 포인터가 없어도 작동하지만, 데이터 생성량이 상당히 많아집니다. 이 모드는 샘플이 트리거될 때마다 현재 애플리케이션 스택의 스냅샷을 생성하고, 분석을 위해 해당 스냅샷을 호스트 컴퓨터로 전송합니다.
- Last Branch Record 모드는 메모리 버퍼를 사용하지 않습니다. 실행이 중지될 때마다 가장 최근에 분기된 16개의 분기를 자동으로 디코딩합니다. 이 모드는 최신 인텔 CPU에서만 지원됩니다.
Qt와 대부분의 시스템 라이브러리는 기본적으로 프레임 포인터 없이 컴파일되므로, 프레임 포인터 모드는 사용자 정의 시스템에서만 유용합니다.
스택 스냅샷 크기 설정
Performance Analyzer는 Perf가 dwarf 모드에서 생성한 스택 스냅샷을 분석하고 역추적합니다. 스택 스냅샷의 크기는 Stack snapshot size 에서 설정합니다. 스택 스냅샷이 크면 전송 및 처리해야 할 데이터 양이 많아집니다. 스택 스냅샷이 작으면 재귀가 많은 애플리케이션이나 스택을 집중적으로 사용하는 경우의 호출 체인을 제대로 캡처하지 못할 수 있습니다.
Perf용 명령줄 옵션 추가
Additional arguments 에서 데이터를 기록할 때 Perf에 전달할 추가 명령줄 옵션을 설정합니다. 처리 지연을 줄이려면 --no-delay 또는 --no-buffering 를 설정하십시오. 그러나 이러한 옵션은 모든 버전의 Perf에서 지원되는 것은 아니며, 지원되지 않는 옵션이 지정되면 Perf가 시작되지 않을 수 있습니다.
JIT 컴파일된 JavaScript 함수의 이름 확인
버전 5.6.0부터 Qt XML은 JavaScript 함수에 대한 정보가 포함된 perf.map 파일을 생성할 수 있습니다. Performance Analyzer는 이 파일을 읽어 Timeline, Statistics 및 Flame Graph 뷰에 함수 이름을 표시합니다. 이 기능은 프로파일링 대상 프로세스가 대상 기기가 아닌 호스트 컴퓨터에서 실행되는 경우에만 작동합니다. perf.map 파일 생성을 활성화하려면, Run Environment 에 QV4_PROFILE_WRITE_PERF_MAP 환경 변수를 추가하고 그 값을 1 로 설정하십시오.
수집된 데이터 분석
Timeline 뷰에는 스레드별 CPU 사용량을 그래픽으로 표시하고, 기록된 모든 이벤트의 요약 정보를 보여줍니다.

타임라인의 각 범주는 애플리케이션 내의 스레드를 나타냅니다. 행에 있는 이벤트(5) 위로 커서를 이동하면 해당 이벤트가 지속된 시간과 소스 코드 내의 어떤 함수를 나타내는지 확인할 수 있습니다. 이벤트가 선택된 경우에만 정보를 표시하려면 ‘ View Event Information on Mouseover ’(4)를 비활성화하십시오.
개요(9)는 데이터가 수집된 기간을 요약하여 보여줍니다. 확대/축소 범위(7)를 드래그하거나 개요를 선택하여 개요 상에서 이동할 수 있습니다. 또한 ‘ Jump to Previous Event ’ 및 ‘ Jump to Next Event ’(1)을 선택하여 이벤트 간을 이동할 수도 있습니다.
Show Zoom Slider 버튼(2)을 선택하면 확대/축소 수준을 설정하는 슬라이더가 열립니다. 확대/축소 핸들(8)을 드래그하여 조정할 수도 있습니다. 기본 확대/축소 수준으로 재설정하려면 타임라인을 마우스 오른쪽 버튼으로 클릭하여 컨텍스트 메뉴를 열고, Reset Zoom 을 선택하십시오.
이벤트 범위 선택
이벤트 범위(6)를 선택하면 해당 범위가 나타내는 시간을 확인하거나 트레이스의 특정 영역을 확대할 수 있습니다. ‘ Select Range ’(3)을 선택하여 선택 도구를 활성화하십시오. 그런 다음 타임라인을 클릭하여 이벤트 범위의 시작점을 지정하십시오. 선택 핸들을 드래그하여 범위의 끝점을 정의하십시오.
이벤트 범위를 사용하여 두 개의 연속된 이벤트 간의 지연 시간을 측정할 수도 있습니다. 첫 번째 이벤트의 끝과 두 번째 이벤트의 시작 사이에 범위를 설정하십시오. ‘ Duration ’에는 이벤트 간의 지연 시간이 밀리초 단위로 표시됩니다.
이벤트 범위를 확대하려면 해당 범위를 두 번 클릭하십시오.
이벤트 범위를 제거하려면 ‘ Selection ’ 대화 상자를 닫으십시오.
데이터 이해
일반적으로 타임라인 보기의 이벤트는 함수 호출에 소요된 시간을 나타냅니다. 마우스를 이벤트 위로 이동하면 세부 정보를 확인할 수 있습니다. 세부 정보에는 항상 함수의 주소, 호출의 대략적인 지속 시간, 함수가 포함된 ELF 파일, 이 함수 호출이 활성화된 상태에서 수집된 샘플 수, 스레드에서 이 함수가 발견된 총 횟수, 이 함수가 적어도 한 번 이상 발견된 샘플 수가 포함됩니다.
디버그 정보를 사용할 수 있는 함수의 경우, 세부 정보에는 소스 코드 내 위치와 함수 이름이 포함됩니다. 이러한 이벤트를 선택하면 코드 편집기에서 커서를 해당 이벤트와 관련된 코드 부분으로 이동할 수 있습니다.
Perf 도구는 주기적인 샘플만 수집하기 때문에, 성능 분석기는 함수가 호출되거나 반환된 정확한 시간을 파악할 수 없습니다. 그러나 각 스레드의 두 번째 행에서 샘플이 수집된 정확한 시점을 확인할 수 있습니다. Performance Analyzer는 여러 연속된 샘플에서 호출 체인의 동일한 위치에 동일한 함수가 존재할 경우, 이를 해당 함수에 대한 단일 호출로 간주합니다. 물론 이는 단순화된 가정입니다. 또한, 샘플이 채취된 사이에 호출된 다른 함수들이 있을 수 있지만, 이러한 함수들은 프로파일 데이터에 나타나지 않을 수 있습니다. 하지만 통계적으로 볼 때, 데이터에는 CPU 시간을 가장 많이 소모하는 함수들이 가장 두드러지게 나타날 가능성이 높습니다.
디버그 정보가 없는 함수가 발견되면 스택의 추가 언와인딩이 실패할 수 있습니다. 어셈블리 언어로 구현된 일부 심볼의 경우에도 언와인딩이 실패할 수 있습니다. 언와인딩이 실패하면 호출 체인의 일부만 표시되며, 주변 함수들이 중단된 것처럼 보일 수 있습니다. 이는 반드시 애플리케이션 실행 중에 해당 함수들이 실제로 중단되었음을 의미하는 것은 아니며, 단지 언와인딩이 실패한 스택에서 해당 함수들을 찾을 수 없었음을 나타낼 뿐입니다.
JIT 모드에서 실행되는 QML 엔진의 자바스크립트 함수는 언와인딩될 수 있습니다. 그러나 해당 함수의 이름은 QV4_PROFILE_WRITE_PERF_MAP 가 설정된 경우에만 표시됩니다. Qt Quick Compiler 생성된 컴파일된 자바스크립트도 언와인딩할 수 있습니다. 이 경우 자바스크립트 함수에 대해서는 자바스크립트 이름이 아닌 컴파일러가 생성한 C++ 이름이 표시됩니다. 인터프리터 모드에서 실행할 때도 QML과 관련된 스택 프레임을 언와인딩할 수 있으며, 이때는 인터프리터된 자바스크립트 대신 인터프리터 자체가 표시됩니다.
호출 체인에 포함된 커널 함수는 각 스레드의 세 번째 행에 표시됩니다.
이벤트의 색상은 해당 이벤트가 속한 특정 스레드의 지속 시간 동안의 실제 샘플링 빈도를 나타냅니다. 리눅스 커널은 스레드가 활성 상태일 때만 해당 스레드의 샘플을 채취합니다. 동시에 커널은 요청된 이벤트 주기를 준수하려고 시도합니다. 따라서 서로 다른 스레드 간의 샘플링 빈도 차이는, 샘플이 더 많이 채취된 스레드가 전체적인 병목 현상이 될 가능성이 더 높음을 나타내며, 샘플이 적게 채취된 스레드는 I/O나 뮤텍스와 같은 외부 이벤트를 기다리는 데 시간을 소비했을 가능성이 높습니다.
통계 보기

Statistics 뷰는 타임라인 내 각 함수가 포함된 샘플 수를 총합 및 스택 최상위 위치( self 라고 함)에서 각각 표시합니다. 이를 통해 최적화가 필요한 함수를 파악할 수 있습니다. 발생 횟수가 많다는 것은 해당 함수가 불필요하게 호출되거나 실행에 매우 오랜 시간이 걸린다는 것을 의미할 수 있습니다.
행 하나를 선택하면 코드 편집기의 소스 코드에서 해당 함수로 이동할 수 있습니다.
' Callers ' 및 ' Callees ' 패널은 함수 간의 종속성을 보여줍니다. 이를 통해 애플리케이션의 내부 함수를 검토할 수 있습니다. ' Callers ' 패널은 메인 뷰에서 선택한 함수를 호출한 함수들을 요약하여 보여줍니다. ' Callees ' 패널은 메인 뷰에서 선택한 함수에서 호출된 함수들을 요약하여 보여줍니다.
행 하나를 선택하면 코드 편집기의 소스 코드에서 해당 함수로 이동하며, 메인 뷰에서 해당 함수를 선택할 수 있습니다.
한 뷰나 행의 내용을 클립보드에 복사하려면 컨텍스트 메뉴에서 ‘ Copy Table ’ 또는 ‘ Copy Row ’을 선택하십시오.
플레임 그래프로 통계 시각화

Flame Graph 뷰는 실행에 대한 보다 간결한 통계 개요를 보여줍니다. 가로 막대는 특정 함수에 대해 채취된 샘플의 한 측면을, 전체 샘플의 동일한 측면과 비교하여 보여줍니다. 중첩 구조는 어떤 함수가 다른 어떤 함수에 의해 호출되었는지를 보여줍니다.
Visualize 버튼을 사용하면 Flame Graph 에 표시할 항목을 선택할 수 있습니다.
- Samples 이것이 기본 시각화 방식입니다. 가로 막대의 크기는 해당 함수에 대해 기록된 샘플 수를 나타냅니다.
- Peak Usage 모드에서 가로 막대의 크기는 메모리 할당 사용량이 최고점에 달했던 시점에서 각 함수가 할당한 메모리 양을 나타냅니다.
- Allocations 모드에서 가로 막대의 크기는 각 함수에 의해 트리거된 메모리 할당 횟수를 나타냅니다.
- Releases 모드에서 가로 막대의 크기는 각 함수에 의해 트리거된 메모리 해제 횟수를 나타냅니다.
Peak Usage, Allocations 및 Releases 모드는 메모리 추적 지점의 샘플이 기록된 경우에만 데이터를 표시합니다.
뷰 간의 상호 작용
Timeline, Flame Graph 또는 Statistics 뷰 중 하나에서 스택 프레임을 선택하면, 해당 스택 프레임에 대한 정보가 다른 두 뷰에 표시됩니다. Statistics 및 Flame Graph 뷰에서 특정 시간 범위를 보려면, Analyze > Performance Analyzer Options > Limit to the Range Selected in Timeline 을 선택하십시오. 전체 스택 프레임을 표시하려면 Show Full Range 을 선택하십시오.
Perf 데이터 파일 불러오기
최신 버전의 Linux Perf 도구에서 생성된 모든 perf.data 파일을 불러와 Qt Creator 에서 볼 수 있습니다. 파일을 불러오려면 Analyze > Performance Analyzer Options > Load perf.data File 를 선택하십시오.

Performance Analyzer는 디버그 심볼을 찾기 위해 데이터가 기록된 컨텍스트를 파악해야 합니다. 따라서 애플리케이션을 빌드할 때 사용한 키트와 애플리케이션 실행 파일이 위치한 폴더를 지정해야 합니다.
Perf 데이터 파일은 ` perf record`를 호출하여 생성됩니다. 데이터를 기록할 때 ` --call-graph ` 옵션을 사용하여 Perf를 시작함으로써 호출 그래프가 생성되도록 하십시오. 또한 필요한 디버그 심볼이 표준 위치(`/usr/lib/debug ` 또는 바이너리 파일 옆)에 있거나, 사용 중인 Qt 패키지의 일부로 포함되어 있어 Performance Analyzer에서 사용할 수 있는지 확인하십시오.
Performance Analyzer는 프레임 포인터 모드나 드워프(dwarf) 모드에서 생성된 Perf 데이터 파일을 읽을 수 있습니다. 그러나 파일을 올바르게 생성하려면 여러 가지 전제 조건이 충족되어야 합니다. 지원되는 임베디드 플랫폼의 모든 시스템 이미지는 dwarf 모드에서 프로파일링이 가능하도록 올바르게 설정되어 있습니다. 다른 장치의 경우, 기록된 Perf 데이터 파일에 대해 perf report 또는 perf script 명령의 출력을 확인하여 Perf가 자체 데이터를 정상적으로 읽어올 수 있는지 확인하십시오.
추적 파일 불러오기 및 저장
트레이스 데이터를 Performance Analyzer 전용 형식(.ptq)으로 저장하고 불러올 수 있습니다. 이 형식은 자체적으로 모든 정보를 포함하고 있으므로, 파일을 불러올 때 기록 환경을 지정할 필요가 없습니다. 이러한 트레이스 파일은 툴체인이나 디버그 심볼 없이도 다른 컴퓨터로 전송하여 분석할 수 있습니다.
추적 데이터를 불러오려면 Analyze > Performance Analyzer Options > Load Trace File 로 이동하십시오.
추적 데이터를 저장하려면 Save Trace File 를 선택하십시오.
문제 해결
다음과 같은 이유로 성능 분석기가 데이터 기록에 실패할 수 있습니다.
- 시스템에서 Perf 이벤트가 전역적으로 비활성화되어 있을 수 있습니다. 사전 구성된 Boot to Qt 이미지에는 Perf 이벤트가 활성화된 상태로 제공됩니다. 사용자 지정 구성을 위해서는
/proc/sys/kernel/perf_event_paranoid파일에2보다 작은 값이 포함되어 있는지 확인해야 합니다. 트레이스 기록의 유연성을 극대화하려면 이 값을-1로 설정할 수 있습니다. 이렇게 하면 모든 사용자가 원시 커널 트레이스 포인트를 사용하는 경우를 포함하여 어떤 종류의 트레이스든 기록할 수 있습니다.Perf 이벤트를 활성화하는 방법은 사용 중인 리눅스 배포판에 따라 다릅니다. 일부 배포판에서는 루트(또는 이에 상응하는) 권한으로 다음 명령을 실행할 수 있습니다:
echo -e "kernel.perf_event_paranoid=-1\nkernel.kptr_restrict=0" | sudo tee /etc/sysctl.d/10-perf.conf
- 대상 장치와 호스트 간의 연결 속도가 Perf에서 생성된 데이터를 전송하기에 충분하지 않을 수 있습니다. Stack snapshot size 또는 Sample period 설정 값을 조정해 보십시오.
- Perf가 데이터를 끝없이 버퍼링만 하고 전송하지 않을 수 있습니다. Additional arguments 파일에
--no-delay또는--no-buffering를 추가해 보십시오. - 일부 버전의 Perf는 특정 최소 샘플링 주파수가 지정되지 않으면 기록을 시작하지 않습니다. Sample period 를 1000으로 설정해 보십시오.
- 일부 장치, 특히 다양한 i.MX6 보드의 경우 하드웨어 성능 카운터가 제대로 작동하지 않아, 일정 시간이 지나면 리눅스 커널이 무작위로 데이터 기록을 중단할 수 있습니다. Perf는 다양한 유형의 이벤트를 사용하여 샘플링을 트리거할 수 있습니다. 장치에서
perf list를 실행하여 사용 가능한 이벤트 유형 목록을 확인한 후, 설정에서 해당 이벤트 유형을 선택하십시오. 이벤트 유형의 선택은 샘플링의 성능과 안정성에 영향을 미칩니다.cpu-clocksoftware이벤트는 하드웨어 성능 카운터를 사용하지 않고 소프트웨어에서 샘플링을 제어하므로 안전하지만 상대적으로 느린 옵션입니다. 샘플링이 실패한 후에는 기기를 재부팅하십시오. 커널이 성능 카운터 시스템의 중요한 부분을 비활성화했을 수 있습니다. - Perf가 설치되어 있지 않을 수 있습니다. 설치 방법은 사용 중인 리눅스 배포판에 따라 다릅니다. 예를 들어, 다음 명령어를 시도해 보십시오:
- Ubuntu 22.04의 경우:
sudo apt install linux-tools-$(uname -r) - 데비안(Debian)의 경우:
apt install linux-perf
- Ubuntu 22.04의 경우:
General Messages (애플리케이션 출력 ) 보기는 데이터를 처리하는 헬퍼 프로그램의 출력 결과를 보여줍니다.
'Application Output' 뷰는 Performance Analyzer에 오류 메시지가 표시되더라도 일부 정보를 보여줍니다.
Copyright © The Qt Company Ltd. and other contributors. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.