2.6 OProfile
2.6.1 Introduction
OProfile은 실행 중인 모든 코드를 낮은 오버헤드로 프로파일할 수 있는 system-wide 프로파일러이다.
OProfile은 커널 드라이버, 샘플 데이터를 수집하는 데몬, 데이터를 정보로 변환하기 위한 여러 post-profiling 도구로 구성되어 있다.
2.6.1.1 Overview
OProfile은 CPU의 하드웨어 성능 카운터를 활용하여 다양한 흥미로운 통계 프로파일을 가능하게 한다. 또한 기본 time-spent 프로파일에도 사용할 수 있다.
하드웨어와 소프트웨어 인터럽트 핸들러, 커널 모듈, 커널 공유 라이브러리, 애플리케이션과 같은 모든 코드가 프로파일된다.
2.6.1.2 Features
OProfile은 다음 기능을 가진다.
- Unobtrusive - 특별한 리컴파일이나 래퍼 라이브러리가 필요하지 않다. 사용자가 주석이 달린 소스를 만드는 경우가 아니면 디버그 심볼(gcc에서 -g 옵션)도 필요하지 않다. 단지 모듈을 삽입하면 되기에 커널 패치도 필요하지 않다.
- System-wide profiling - 시스템에서 실행되는 모든 코드가 프로파일되고, 시스템 성능을 분헉할 수 있다.
- Performance counter support - 다양한 low-level 데이터를 수집과 특정 코드 세션에 대한 연결을 활성화한다.
- Call-graph support - OProfile은 gprof-style의 call-graph 프로파일 데이터를 제공할 수 있다.
- Low overhead - OProfile은 샘플링 주기와 workload(작업 부하)에 따라 1% ~ 8%의 일반적인 overhead를 갖는다.
- Post-profile analysis - 프로파일 데이터는 function-level(함수 수준)이나 instruction-level(명령 수준)의 세부 사항에서 생성할 수 있다. 프로파일 정보로 주석이 달린 소스 트리를 생성할 수 있다. 전체 시스템에서 CPU 시간을 가장 많이 사용하는 애플리케이션과 함수의 hit(적중) 목록을 생성할 수 있다.
- System support - i.MX를 지원하는 모든 커널에서 작동한다.
2.6.1.3 Hardware Operation
OProfile은 통계적인 연속 프로파일러이다.
프로파일은 각 CPU의 현재 레지스터를 정기적으로 샘플링(인터럽트 핸들러에서 인터럽트 발생 시점에 저장되는 PC(program counter)값을 저장)하고 런타임 PC(program counter) 값을 프로그래머에게 의미 있는 것으로 변환하여 생성한다.
OProfile은 샘플링된 PC(program counter) 값의 스트림을 인터럽트 시점에 실행 중인 작업의 세부 정보와 함께 가져오고 값들을 특정 바이너리 파일에 대한 파일 오프셋으로 변환하여 이것을 달성한다. 따라서 각 PC(program counter) 값은 바이너리 이미지 오프셋의 튜플(tuple : group of set)로 변환된다. 사용자 영역 도구는 이 데이터를 사용하여 특정 어셈블리 명령, 심볼, 소스 라인(이진 디버그 정보가 있는 경우)을 포함하여 코드의 출처를 재구성할 수 있다.
이와 같은 PC(program counter) 값을 주기적으로 샘플링하면, 실제로 실행되는 내용과 얼마나 자주, 보다 더 자주 발생하는지 이 통계적 근사치가 현실을 반영하기에 충분하다. 공통된 작동에서 각 샘플 인터럽트 사이의 시간은 고정된 수의 clock cycle로 조정된다. 이것은 결과가 CPU가 가장 많은 시간을 소비하는 위치를 반영한다는 것을 의미한다. 이것은 성능 분석에 매우 유용한 정보의 근원이다.
Arm CPU는 하드웨어 레벨에서 이러한 이벤트를 측정할 수 있도록 하드웨어 성능 카운터(hardware performance counter)를 제공한다. 일반적으로 이런 카운터는 각 이벤트마다 한 번씩 증가하고 미리 정의된 수의 이벤트에 도달하면 인터럽트를 생성한다. OProfile은 샘플을 생성하려고 이런 인터럽트를 사용할 수 있다. 그리고 프로파일 결과는 주어진 이벤트의 인스턴스 수를 유발한 코드에 대한 통계적 근사치이다.
2.6.1.4 Architecture-specific Components
OProfile은 특정 아키텍처에서 사용할 수 있는 하드웨어 성능 카운터(hardware performance counter)를 지원한다. 이런 카운터를 설정하고 관리하는 세부 사항을 관리하는 코드는 해당 arch/arm/oprofile 디렉토리 안에 커널 소스 트리에서 찾을 수 있다. 아키텍처별 구현은 초기화 시 oprofile_operations 구조체를 채우는 방식으로 작동한다. 이것은 성능 카운터 레지스터가 하드웨어 관련 세부 사항을 관리하는 setup(), start(), stop() 등과 같은 일련의 작업을 제공한다.
아키텍처 코드에서 사용할 수 있는 다른 중요한 기능은 oprofile_add_sample()이다. 이것은 인터럽트 시점에 취득한 특정 샘플이 일반 OProfile 드라이버 코드에 공급되는 곳이다.
2.6.1.5 oprofilefs Pseudo Filesystem
/dev/oprofile의 사용자 영역에 마운트되는 oprofilefs로 알려진 pseudo-filesystem(의사 파일 시스템)을 OProfile에서 구현한다. 이것은 사용자 영역에서 구성을 리포트하고 수신하기 위한 작은 파일과 OProfile 사용자 영역이 샘플을 받는 실제 문자 디바이스로 구성된다. setup() 시점에 아키텍처별 코드는 성능 카운터의 세부 정보와 관련된 추가 구성 파일을 추가할 수 있다. 파일 시스템에는 다양한 OProfile 이벤트에 대한 유용한 카운터가 있는 stats 디렉토리도 포함되어 있다.
2.6.1.6 Generic Kernel Driver
일반 커널 드라이버는 drivers/oprofile에 있으며, 커널에서 OProfile이 작동하는 방식의 핵심을 형성한다. 일반 커널 드라이버는 아키텍처별 코드(oprofile_add_sample()을 통해)에서 전달된 샘플을 가져오고 /dev/oprofile/buffer 문자 디바이스에서 사용자 영역 데몬에 데이터를 릴리즈할 때까지 이 데이터(변환된 구성에서)를 버퍼링 한다.
2.6.1.7 OProfile Daemon
OProfile 사용자 영역 데몬은 커널에서 제공하는 로우(raw) 데이터를 가져와 디스크에 저장한다. 커널에서 단일 스트림 데이터를 가져오고 샘플 파일(/var/lib/oprofile/samples/current/에서 사용가능)의 수 만큼 샘플 데이터를 기록한다. 개별 기능의 이점을 위해 이런 샘플 파일의 이름과 경로는 샘플의 출처를 반영하도록 변경된다. 여기에는 쓰레드 ID, 바이너리 파일 경로, 사용된 이벤트 타입 등이 포함될 수 있다.
인터럽트에서 디스크 파일로... 이 마지막 단계 후에 데이터는 이제 영구적(즉 시스템 실행중 변경이 저장된 데이터를 무효화하지 않음)이다. 이렇게 하면 post-profiling 도구가 이 데이터를 언제든지(원본 바이너리 파일이 여전히 사용 가능하고 변경되지 않는다고 가정) 실행할 수 있다.
2.6.1.8 Post Profiling Tools
수집된 데이터는 유용한 형식으로 사용자에게 제공되어야 한다. 이것이 post-profiling 도구의 역할이다. 일반적으로 사용 가능한 샘플 파일의 하위 집합을 취합하여, 관련된 바이너리 파일에 상관된 각 파일을 로드 및 처리하고, 사용자가 읽을 수 있는 정보를 생성한다.
2.6.1.9 Interrupt Requirements
OProfile 드라이버와 관련하여 생성되는 인터럽트의 수는 많다. Latency(대기 시간) 요구 사항은 필요하지 않다. 인터럽트가 생성되는 속도는 이벤트에 따라 다르다.
2.6.2 Software Operation
Cortex-A7를 사용하는 i.MX의 경우, OProfile은 Cortex-A7 Event Monitor를 추가해야 한다.
2.6.2.1 Source Code Structure
OProfile 플랫폼별 소스 파일은 arch/arm/oprofile에서 찾을 수 있다.
Table 17. OProfile Siurce Files
File | Description |
common.c | 모든 플랫폼에서 요구되는 구현이 포함된 소스 파일 |
OProfile용 일반 커널 드라이버는 drivers/oprofile 아래에 있다.
2.6.2.2 Menu Configuration Options
이 모듈을 위해 다음 Linux Kernel 구성이 제공된다.
menu configuration에서 다음 모듈을 활성화한다 :
- CONFIG_OPROFILE - OProfile 드라이버에 대한 구성 옵션. menuconfig에서 이 옵션은 다음에서 사용할 수 있다.
- General Setup > Profiling support (EXPERIMENTAL) > OProfile system profiling (EXPERIMENTAL)
2.6.2.3 Programming Interface
이 드라이버는 PMU와 L2 캐시 EVTMON 카운터를 구성하고 컨트롤하는 데 필요한 모든 방법을 구현한다.
자세한 내용은 build: make htmldocs에서 생성된 Linux 문서를 참조한다.
2.6.2.4 Example Software Configuration
다음 단계는 OProfile을 구성하는 방법의 예를 보여준다 :
- bitbake linux-imx -c menuconfig 명령을 사용한다. 먼저 화면에서 패키지 목록으로 이동하여 OProfile을 선택한다.
- 그런 다음 처음 화면으로 돌아가서 Configure Kernel을 선택하고 Menu Configuration Options(2.6.2.2)의 지침에 따라 커널 영역의 OProfile을 활성화한다.
- 구성을 저장하고 빌드를 시작한다.
- 대상 rootfs에 OProfile 바이너리를 복사한다. vmlinux를 /boot 디렉토리에 복사하고 OProfile을 실행한다.
root@ubuntu:/boot# opcontrol --separate=kernel --vmlinux=/boot/vmlinux
root@ubuntu:/boot# opcontrol --reset
Signalling daemon... done
root@ubuntu:/boot# opcontrol --setup --event=CPU_CYCLES:100000
root@ubuntu:/boot# opcontrol --start
Profiler running.
root@ubuntu:/boot# opcontrol --dump
root@ubuntu:/boot# opreport
Overflow stats not available
CPU: ARM V7 PMNC, speed 0 MHz (estimated)
Counted CPU_CYCLES events (Number of CPU cycles) with a unit mask of 0x00 (No un
it mask) count 100000
CPU_CYCLES:100000|
samples| %|
------------------
4 22.2222 grep
CPU_CYCLES:100000|
samples| %|
------------------
4 100.000 libc-2.9.so
2 11.1111 cat
CPU_CYCLES:100000|
samples| %|
------------------
1 50.0000 ld-2.9.so
1 50.0000 libc-2.9.so
...
root@ubuntu:/boot# opcontrol --stop
Stopping profiling.
'NXP i.MX SoC Family > i.MX Linux Reference Manual' 카테고리의 다른 글
i.MX Linux Reference Manual - System - Remote Processor Messaging (0) | 2022.06.17 |
---|---|
i.MX Linux Reference Manual - System - Pulse-Width Modulator (PWM) (0) | 2022.06.16 |
i.MX Linux Reference Manual - System - Power Management (0) | 2022.06.10 |
i.MX Linux Reference Manual - System - Anatop Regulator Driver (0) | 2022.06.10 |
i.MX Linux Reference Manual - System - Boot Image (0) | 2022.06.10 |