이 페이지에서

성능 분석기

Linux 데스크톱 및 임베디드 기기에서 애플리케이션의 CPU 및 메모리 사용량을 분석합니다.

성능 분석기에 대한 전역 환경설정을 설정하려면 환경설정 > 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 입니다.

캐시 미스 또는 캐시 히트와 같은 보다 특수한 샘플링도 가능합니다. 그러나 이에 대한 지원은 CPU의 특정 기능에 따라 다릅니다. 이러한 특수 이벤트에 대한 자세한 샘플링 지침은 OperationResult 에서 확인하세요. 예를 들어 load 작업의 결과가 missesL1-dcache 에 대한 cache 이벤트를 선택하여 읽기 시 L1-dcache 미스를 샘플링합니다.

테이블에서 선택한 이벤트를 제거하려면 Remove Event 을 선택합니다.

Use Trace Points 을 선택하여 현재 선택한 이벤트를 대상 장치에 정의된 추적 지점으로 바꾸고 Sample modeevent count 으로, Sample period1 으로 설정합니다. Create Trace Points 이 대상에 추적 지점을 정의하면 성능 분석기는 자동으로 이를 사용하여 메모리 사용량을 프로파일링합니다.

이벤트 선택을 되돌리려면 Reset 을 선택하고 Sample modeSample period 을 기본값으로 되돌립니다.

샘플링 모드 및 기간 선택

Sample modeSample period 에서 샘플 트리거 방법을 지정합니다:

  • event count 에 의한 샘플링은 선택한 이벤트 중 하나가 발생할 때마다 n 마다 샘플을 수집하도록 커널에 지시하며, nSample period 에 설정되어 있습니다.
  • Sampling by frequency (Hz) 는 샘플링 주기를 자동으로 조정하여 커널이 초당 n 번 샘플을 채취하도록 지시합니다. Sample period 에서 n 을 설정합니다.

빈도가 높거나 이벤트 수가 적으면 더 정확한 데이터를 얻을 수 있지만 오버헤드가 증가하고 생성되는 데이터의 양이 많아집니다. 실제 샘플링 주기는 대상 디바이스의 Linux 커널에 의해 결정되며, Perf에 설정된 주기는 단지 조언으로만 사용됩니다. 요청하는 샘플링 기간과 실제 결과 사이에는 상당한 차이가 있을 수 있습니다.

일반적으로 성능 분석기가 대상 장치와 호스트 장치 간의 연결을 통해 전송할 수 있는 데이터보다 많은 데이터를 수집하도록 구성하면 Perf가 데이터를 전송하는 동안 애플리케이션이 차단되어 처리 지연이 과도하게 늘어날 수 있습니다. 그런 다음 Sample period 또는 Stack snapshot size 의 값을 변경해야 합니다.

통화 그래프 모드 선택

Call graph mode 에서 성능 분석기가 애플리케이션에서 호출 체인을 복구하는 방법을 지정할 수 있습니다:

  • Frame Pointer 또는 fp 모드는 프로파일링된 애플리케이션에서 사용 가능한 프레임 포인터에 의존하며 각 샘플에 대한 호출 체인을 검색하기 위해 대상 장치의 커널에 프레임 포인터 체인을 따라 이동하도록 지시합니다.
  • Dwarf 모드는 프레임 포인터 없이도 작동하지만 훨씬 더 많은 데이터를 생성합니다. 샘플이 트리거될 때마다 현재 애플리케이션 스택의 스냅샷을 생성하고 분석을 위해 해당 스냅샷을 호스트 컴퓨터로 전송합니다.
  • Last Branch Record 모드는 메모리 버퍼를 사용하지 않습니다. 실행이 중지될 때마다 마지막으로 가져온 16개의 브랜치를 자동으로 디코딩합니다. 이 모드는 최신 인텔 CPU에서만 지원됩니다.

Qt와 대부분의 시스템 라이브러리는 기본적으로 프레임 포인터 없이 컴파일되므로 프레임 포인터 모드는 사용자 정의 시스템에서만 유용합니다.

스택 스냅샷 크기 설정

성능 분석기는 드워프 모드에서 Perf가 생성한 스택 스냅샷을 분석하고 언풀링합니다. Stack snapshot size 에서 스택 스냅샷의 크기를 설정합니다. 스택 스냅샷이 크면 전송 및 처리할 데이터의 양이 더 많아집니다. 작은 스택 스냅샷은 고도로 재귀적인 애플리케이션의 콜 체인이나 기타 스택 사용량이 많은 경우 캡처에 실패할 수 있습니다.

Perf에 대한 명령줄 옵션 추가

Additional arguments 에 데이터를 기록할 때 Perf에 전달할 추가 명령줄 옵션을 설정하세요. --no-delay 또는 --no-buffering 을 설정하면 처리 지연을 줄일 수 있습니다. 그러나 이러한 옵션은 모든 버전의 Perf에서 지원되는 것은 아니며 지원되지 않는 옵션을 지정하면 Perf가 시작되지 않을 수 있습니다.

JIT 컴파일된 JavaScript 함수의 이름 확인하기

버전 5.6.0부터 Qt는 JavaScript 함수에 대한 정보가 포함된 perf.map 파일을 생성할 수 있습니다. 성능 분석기는 이를 읽고 Timeline, Statistics, Flame Graph 보기에 함수 이름을 표시합니다. 이 기능은 프로파일링 중인 프로세스가 대상 디바이스가 아닌 호스트 컴퓨터에서 실행 중인 경우에만 작동합니다. perf.map 파일 생성을 켜려면 환경 변수 QV4_PROFILE_WRITE_PERF_MAPRun Environment 에 추가하고 해당 값을 1 으로 설정합니다.

수집된 데이터 분석하기

Timeline 보기에는 스레드당 CPU 사용량의 그래픽 표현과 기록된 모든 이벤트의 압축된 보기가 표시됩니다.

성능 분석기 타임라인 보기

타임라인의 각 카테고리는 애플리케이션의 스레드를 설명합니다. 행에 있는 이벤트(5)로 커서를 이동하면 소요 시간과 해당 이벤트가 소스의 어떤 기능을 나타내는지 확인할 수 있습니다. 이벤트가 선택되었을 때만 정보를 표시하려면 View Event Information on Mouseover (4)를 끄세요.

개요(9)에는 데이터가 수집된 기간이 요약되어 있습니다. 확대/축소 범위(7)를 드래그하거나 윤곽선을 선택하여 윤곽선에서 이동합니다. Jump to Previous EventJump to Next Event (1)을 선택하여 이벤트 사이를 이동할 수도 있습니다.

Show Zoom Slider 버튼(2)을 선택하여 줌 수준을 설정하는 슬라이더를 엽니다. 줌 핸들을 드래그할 수도 있습니다(8). 기본 줌 수준을 재설정하려면 타임라인을 마우스 오른쪽 버튼으로 클릭하여 컨텍스트 메뉴를 열고 Reset Zoom 을 선택합니다.

이벤트 범위 선택하기

이벤트 범위(6)를 선택하여 해당 이벤트가 나타내는 시간을 보거나 트레이스의 특정 영역을 확대합니다. Select Range (3)을 선택하여 선택 도구를 활성화합니다. 그런 다음 타임라인을 클릭하여 이벤트 범위의 시작을 지정합니다. 선택 핸들을 드래그하여 범위의 끝을 정의합니다.

이벤트 범위를 사용하여 두 후속 이벤트 사이의 지연을 측정할 수도 있습니다. 첫 번째 이벤트의 끝과 두 번째 이벤트의 시작 사이에 범위를 지정합니다. Duration 은 이벤트 사이의 지연을 밀리초 단위로 표시합니다.

이벤트 범위를 확대하려면 해당 범위를 두 번 클릭합니다.

이벤트 범위를 제거하려면 Selection 대화 상자를 닫습니다.

데이터 이해하기

일반적으로 타임라인 보기의 이벤트는 함수 호출에 걸린 시간을 나타냅니다. 마우스를 이벤트 위로 이동하면 세부 정보를 볼 수 있습니다. 세부 정보에는 항상 함수의 주소, 대략적인 호출 시간, 함수가 있는 ELF 파일, 이 함수 호출이 활성화된 상태에서 수집된 샘플 수, 이 함수가 스레드에서 발생한 총 횟수, 이 함수가 적어도 한 번 이상 발생한 샘플 수가 포함됩니다.

디버그 정보를 사용할 수 있는 함수의 경우 세부 정보에는 소스 코드의 위치와 함수 이름이 포함됩니다. 이러한 이벤트를 선택하면 코드 편집기에서 커서를 이벤트가 연결된 코드 부분으로 이동할 수 있습니다.

Perf 도구는 주기적인 샘플만 수집하므로 성능 분석기는 함수가 호출된 정확한 시간이나 반환된 시점을 확인할 수 없습니다. 그러나 각 스레드의 두 번째 행에서 샘플이 언제 채취되었는지는 정확히 확인할 수 있습니다. 성능 분석기는 동일한 함수가 여러 개의 연속된 샘플에서 호출 체인의 동일한 위치에 있는 경우, 이는 각 함수에 대한 단일 호출을 나타낸다고 가정합니다. 물론 이것은 단순화입니다. 또한 수집된 샘플 사이에 프로필 데이터에 나타나지 않는 다른 함수가 호출될 수도 있습니다. 그러나 통계적으로 데이터에는 가장 많은 CPU 시간을 소비하는 함수가 가장 눈에 띄게 표시될 가능성이 높습니다.

디버그 정보가 없는 함수가 발견되면 스택 언와인딩이 더 이상 실패할 수 있습니다. 어셈블리 언어로 구현된 일부 심볼에 대해서도 언와인딩이 실패할 수 있습니다. 언와인딩이 실패하면 호출 체인의 일부만 표시되고 주변 함수가 중단된 것처럼 보일 수 있습니다. 이는 애플리케이션 실행 중에 실제로 중단된 것이 아니라 언와인딩이 실패한 스택에서 해당 함수를 찾을 수 없다는 의미일 뿐입니다.

JIT 모드에서 실행 중인 QML 엔진의 JavaScript 함수는 언와인드할 수 있습니다. 그러나 해당 함수의 이름은 QV4_PROFILE_WRITE_PERF_MAP 으로 설정된 경우에만 표시됩니다. Qt Quick 컴파일러에서 생성된 컴파일된 자바스크립트도 언와인드할 수 있습니다. 이 경우 컴파일러에서 생성된 C++ 이름은 자바스크립트 함수에 대해 자바스크립트 이름 대신 표시됩니다. 인터프리터 모드에서 실행할 때 QML과 관련된 스택 프레임도 언와인드할 수 있으며, 이 경우 해석된 JavaScript가 아닌 인터프리터 자체가 표시됩니다.

호출 체인에 포함된 커널 함수는 각 스레드의 세 번째 행에 표시됩니다.

이벤트의 색상은 해당 이벤트가 속한 특정 스레드의 실제 샘플 속도를 기간에 걸쳐 나타냅니다. Linux 커널은 스레드가 활성화된 경우에만 스레드의 샘플을 가져옵니다. 동시에 커널은 요청된 이벤트 기간을 준수하려고 노력합니다. 따라서 서로 다른 스레드 간의 샘플링 빈도의 차이는 샘플을 더 많이 가져온 스레드가 전체 병목 현상일 가능성이 높고, 샘플을 더 적게 가져온 스레드는 I/O 또는 뮤텍스와 같은 외부 이벤트를 기다리는 데 시간을 소비했을 가능성이 높다는 것을 나타냅니다.

통계 보기

성능 분석기 통계 보기

Statistics 보기에는 타임라인의 각 함수가 포함된 샘플의 총 수와 스택 상단( self)에 언제 포함되었는지가 표시됩니다. 이를 통해 어떤 함수를 최적화해야 하는지 검토할 수 있습니다. 발생 횟수가 많으면 함수가 불필요하게 트리거되거나 실행하는 데 시간이 오래 걸린다는 의미일 수 있습니다.

행을 선택하여 코드 에디터에서 소스 코드의 해당 함수로 이동합니다.

CallersCallees 창에는 함수 간의 종속성이 표시됩니다. 이를 통해 애플리케이션의 내부 함수를 살펴볼 수 있습니다. Callers 창에는 기본 보기에서 선택한 함수를 호출한 함수가 요약되어 있습니다. Callees 창에는 기본 보기에서 선택한 함수에서 호출된 함수가 요약되어 있습니다.

코드 편집기에서 소스 코드의 해당 함수로 이동하려면 행을 선택하고 기본 보기에서 해당 행을 선택합니다.

한 보기 또는 행의 내용을 클립보드에 복사하려면 상황에 맞는 메뉴에서 Copy Table 또는 Copy Row 을 선택합니다.

통계를 불꽃 그래프로 시각화하기

성능 분석기 플레임 그래프 보기

Flame Graph 보기는 실행에 대한 보다 간결한 통계 개요를 보여줍니다. 가로 막대는 모든 샘플의 동일한 측면을 기준으로 특정 함수에 대해 취한 샘플의 측면을 보여줍니다. 중첩은 어떤 함수가 어떤 다른 함수에 의해 호출되었는지를 보여줍니다.

Visualize 버튼을 사용하면 Flame Graph 에 표시할 측면을 선택할 수 있습니다.

  • Samples 가 기본 시각화입니다. 가로 막대의 크기는 해당 함수에 대해 기록된 샘플의 수를 나타냅니다.
  • Peak Usage 모드에서 가로 막대의 크기는 각 함수에 할당된 메모리 양을 나타내며, 할당된 메모리 사용량이 가장 많았던 시점을 기준으로 합니다.
  • Allocations 모드에서 가로 막대의 크기는 각 함수에 의해 트리거된 메모리 할당 횟수를 나타냅니다.
  • Releases 모드에서 가로 막대의 크기는 각 함수에 의해 트리거된 메모리 해제 횟수를 나타냅니다.

Peak Usage, Allocations, Releases 모드는 메모리 트레이스 포인트의 샘플이 기록된 경우에만 데이터를 표시합니다.

뷰 간 상호 작용

Timeline, Flame Graph, Statistics 보기 중 하나에서 스택 프레임을 선택하면 다른 두 보기에 해당 프레임에 대한 정보가 표시됩니다. StatisticsFlame Graph 보기에서 시간 범위를 보려면 Analyze > Performance Analyzer Options > Limit to the Range Selected in Timeline 을 선택합니다. 전체 스택 프레임을 표시하려면 Show Full Range 을 선택합니다.

퍼프 데이터 파일 로드

최신 버전의 Linux Perf 도구에서 생성된 perf.data 파일을 로드하여 Qt Creator 에서 볼 수 있습니다. Analyze > Performance Analyzer Options > Load perf.data File 을 선택하여 파일을 로드합니다.

퍼프 트레이스 로드 대화 상자

성능 분석기는 디버그 기호를 찾으려면 데이터가 기록된 컨텍스트를 알아야 합니다. 따라서 애플리케이션이 빌드된 키트와 애플리케이션 실행 파일이 있는 폴더를 지정해야 합니다.

Perf 데이터 파일은 perf record 을 호출하여 생성됩니다. 데이터를 기록할 때 --call-graph 옵션으로 Perf를 시작하여 호출 그래프를 생성해야 합니다. 또한 필요한 디버그 심볼이 표준 위치(/usr/lib/debug 또는 바이너리 옆)에 있거나 사용 중인 Qt 패키지의 일부로 성능 분석기에서 사용할 수 있는지 확인합니다.

성능 분석기는 프레임 포인터 또는 드워프 모드에서 생성된 Perf 데이터 파일을 읽을 수 있습니다. 그러나 파일을 올바르게 생성하려면 여러 가지 전제 조건이 충족되어야 합니다. 지원되는 임베디드 플랫폼의 모든 시스템 이미지는 드워프 모드에서 프로파일링을 위해 올바르게 설정되어 있어야 합니다. 다른 장치의 경우, perf report 또는 perf script 에서 기록된 Perf 데이터 파일의 출력을 확인하여 Perf가 자체 데이터를 합리적인 방식으로 다시 읽을 수 있는지 확인하세요.

트레이스 파일 로드 및 저장

성능 분석기 전용 형식(.ptq)으로 추적 데이터를 저장하고 로드할 수 있습니다. 이 형식은 자체적으로 포함되어 있으므로 로드할 때 기록 환경을 지정할 필요가 없습니다. 이러한 추적 파일을 도구 체인이나 디버그 기호 없이 다른 컴퓨터로 전송하여 그곳에서 분석할 수 있습니다.

트레이스 데이터를 로드하려면 Analyze > Performance Analyzer Options > Load Trace File 로 이동하세요.

트레이스 데이터를 저장하려면 Save Trace File 을 선택합니다.

문제 해결

다음과 같은 이유로 성능 분석기가 데이터를 기록하지 못할 수 있습니다:

  • 시스템에서 성능 이벤트가 전역적으로 비활성화되어 있을 수 있습니다. 사전 구성된 Boot to Qt 이미지는 Perf 이벤트가 활성화된 상태로 제공됩니다. 사용자 정의 구성의 경우 /proc/sys/kernel/perf_event_paranoid 파일에 2 보다 작은 값이 포함되어 있는지 확인해야 합니다. 트레이스 기록의 유연성을 극대화하려면 -1 로 값을 설정하면 됩니다. 이렇게 하면 모든 사용자가 원시 커널 트레이스 포인트를 사용하는 경우에도 모든 종류의 트레이스 기록을 할 수 있습니다.

    Perf 이벤트를 활성화하는 방법은 Linux 배포판에 따라 다릅니다. 일부 배포판에서는 루트(또는 이와 동등한 권한) 권한으로 다음 명령을 실행할 수 있습니다:

    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가 데이터를 영원히 버퍼링하여 전송하지 않을 수 있습니다. --no-delay 또는 --no-bufferingAdditional arguments 에 추가하세요.
  • Perf의 일부 버전은 특정 최소 샘플링 빈도가 지정되지 않으면 녹화를 시작하지 않습니다. Sample period 을 1000으로 설정해 보세요.
  • 일부 디바이스, 특히 다양한 i.MX6 보드에서는 하드웨어 성능 카운터가 제대로 작동하지 않아 Linux 커널이 일정 시간이 지난 후 무작위로 데이터를 기록하지 못할 수 있습니다. Perf는 다양한 유형의 이벤트를 사용하여 샘플을 트리거할 수 있습니다. 기기에서 perf list 을 실행하여 사용 가능한 이벤트 유형 목록을 확인한 다음 설정에서 해당 이벤트 유형을 선택할 수 있습니다. 이벤트 유형 선택은 샘플링의 성능과 안정성에 영향을 줍니다. cpu-clock software 이벤트는 하드웨어 성능 카운터를 사용하지 않고 소프트웨어에서 샘플링을 구동하기 때문에 안전하지만 상대적으로 느린 옵션입니다. 샘플링이 실패한 후에는 디바이스를 재부팅합니다. 커널이 성능 카운터 시스템의 중요한 부분을 비활성화했을 수 있습니다.
  • Perf가 설치되지 않았을 수 있습니다. 설치 방법은 Linux 배포판에 따라 다릅니다. 예를 들어 다음 명령을 시도해 보세요:
    • 우분투 22.04의 경우 sudo apt install linux-tools-$(uname -r)
    • Debian: apt install linux-perf

General Messages 보기에는 데이터를 처리하는 도우미 프로그램의 출력이 표시됩니다.

애플리케이션 출력 보기는 성능 분석기에 오류 메시지가 표시되는 경우에도 일부 정보를 표시합니다.

방법: 분석, 분석기, 코드 분석키트도참조하세요 .

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.