23장. OProfile
OProfile 은 oprofile 패키지에서 제공하는 낮은 오버헤드의 시스템 전체 성능 모니터링 툴입니다. 시스템의 프로세서의 성능 모니터링 하드웨어를 사용하여 메모리가 참조되는 경우, 두 번째 수준 캐시 요청 수 및 수신된 하드웨어 인터럽트 수와 같이 시스템의 커널 및 실행 파일에 대한 정보를 검색합니다. 또한 OProfile 은 JVM(Java Virtual Machine)에서 실행되는 애플리케이션을 프로파일링할 수 있습니다.
다음은 OProfile:에서 제공하는 도구의 목록입니다.
- ophelp
- 시스템 프로세서에 대한 사용 가능한 이벤트를 각 이벤트에 대한 간략한 설명과 함께 표시합니다.
- operf
기본 프로파일링 툴입니다.
operf
툴에서는 시스템의 성능 모니터링 하드웨어를 사용하여 OProfile 을 다른 툴과 함께 작동할 수 있는 Linux 성능 이벤트 하위 시스템을 사용합니다.이전에 사용된
opcontrol
툴과 달리 초기 설정은 필요하지 않으며--system-wide
옵션을 사용하지 않는 경우 루트 권한 없이 사용할 수 있습니다.
- ocount
- 절대 이벤트 발생 횟수를 계산하는 툴입니다. 프로세스당, CPU당 또는 스레드당 전체 시스템의 이벤트를 계산할 수 있습니다.
- opimport
- 샘플 데이터베이스 파일을 외부 바이너리 형식에서 시스템의 네이티브 형식으로 변환합니다. 다른 아키텍처의 샘플 데이터베이스를 분석할 때만 이 옵션을 사용합니다.
- opannotate
- 디버깅 기호를 사용하여 애플리케이션을 컴파일하는 경우 실행 파일에 대한 주석이 달린 소스를 생성합니다.
- opreport
- 기록된 성능 데이터를 읽고 프로필 사양에 지정된 대로 요약을 생성합니다. 다른 프로필 사양을 사용하여 동일한 프로필 데이터에서 다른 보고서를 생성할 수 있습니다.
23.1. OProfile 사용
operf
는 프로파일링 데이터를 수집하는 데 권장되는 도구입니다. 툴에는 초기 구성이 필요하지 않으며 모든 옵션이 명령줄에 전달됩니다. 레거시 opcontrol
도구와 달리 operf
는 root
권한 없이 실행할 수 있습니다. operf 도구를 사용하는 방법에 대한 자세한 내용은 시스템 관리자 가이드의 operf
사용 장을 참조하십시오.
예 23.1. ocount 사용
다음 예제에서는 sleep
유틸리티를 실행하는 동안 ocount
로 이벤트 양을 계산하는 방법을 보여줍니다.
$ ocount -e INST_RETIRED -- sleep 1 Events were actively counted for 1.0 seconds. Event counts (actual) for /bin/sleep: Event Count % time counted INST_RETIRED 683,011 100.00
이벤트는 프로세서 구현에 따라 다릅니다. Perf _event_paranoid
옵션을 설정하거나 개수를 사용자 공간 이벤트로만 제한해야 할 수 있습니다.
예 23.2. 기본 operf usage
다음 예에서 operf
도구는 ls -l ~
명령에서 프로파일링 데이터를 수집하는 데 사용됩니다.
ls
명령에 대한 디버깅 정보를 설치합니다.# debuginfo-install -y coreutils
프로파일링을 실행합니다.
$ operf ls -l ~ Profiling done.
수집된 데이터를 분석합니다.
$ opreport --symbols CPU: Intel Skylake microarchitecture, speed 3.4e+06 MHz (estimated) Counted cpu_clk_unhalted events () with a unit mask of 0x00 (Core cycles when at least one thread on the physical core is not in halt state) count 100000 samples % image name symbol name 161 81.3131 no-vmlinux /no-vmlinux 3 1.5152 libc-2.17.so get_next_seq 3 1.5152 libc-2.17.so strcoll_l 2 1.0101 ld-2.17.so _dl_fixup 2 1.0101 ld-2.17.so _dl_lookup_symbol_x [...]
예 23.3. operf to Profile a Java Program에 사용
다음 예에서 operf
도구는 Java (JIT) 프로그램에서 프로파일링 데이터를 수집하는 데 사용되며 opreport
도구는 기호별 데이터를 출력하는 데 사용됩니다.
이 예제에 사용된 데모 Java 프로그램을 설치합니다. 이 패키지는 선택적 채널에 포함된 java-1.8.0-openjdk-demo 패키지의 일부입니다. Optional 채널 사용 방법에 대한 지침은 Add the Optional and Supplementary Repositories 에서 참조하십시오. 선택적 채널이 활성화되면 패키지를 설치합니다.
# yum install java-1.8.0-openjdk-demo
OProfile 의 oprofile-jit 패키지를 설치하여 Java 프로그램에서 프로파일링 데이터를 수집할 수 있습니다.
# yum install oprofile-jit
OProfile 데이터 디렉터리를 생성합니다.
$ mkdir ~/oprofile_data
데모 프로그램을 사용하여 디렉터리로 변경합니다.
$
cd /usr/lib/jvm/java-1.8.0-openjdk/demo/applets/MoleculeViewer/
프로파일링을 시작합니다.
$ operf -d ~/oprofile_data appletviewer \ -J"-agentpath:/usr/lib64/oprofile/libjvmti_oprofile.so" example2.html
홈 디렉터리로 변경하고 수집된 데이터를 분석합니다.
$
cd
$
opreport --symbols --threshold 0.5
샘플 출력은 다음과 같을 수 있습니다.
$ opreport --symbols --threshold 0.5 Using /home/rkratky/oprofile_data/samples/ for samples directory. CPU: Intel Ivy Bridge microarchitecture, speed 3600 MHz (estimated) Counted CPU_CLK_UNHALTED events (Clock cycles when not halted) with a unit mask of 0x00 (No unit mask) count 100000 samples % image name symbol name 14270 57.1257 libjvm.so /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.51-1.b16.el7_1.x86_64/jre/lib/amd64/server/libjvm.so 3537 14.1593 23719.jo Interpreter 690 2.7622 libc-2.17.so fgetc 581 2.3259 libX11.so.6.3.0 /usr/lib64/libX11.so.6.3.0 364 1.4572 libpthread-2.17.so pthread_getspecific 130 0.5204 libfreetype.so.6.10.0 /usr/lib64/libfreetype.so.6.10.0 128 0.5124 libc-2.17.so __memset_sse2