perf 설치 및 개요
1. perf 설치
# 우분투/데비안
sudo apt update
sudo apt install linux-tools-common
sudo apt install linux-tools-generic
# CentOS/Red Hat
sudo yum install perf -y
2. 주요 perf 명령어 및 기능
- annotate: perf.data 파일(perf record로 생성)을 읽고 소스 코드와 함께 상세한 성능 분석 결과를 표시합니다.
- archive: perf.data 파일에서 찾은 빌드 ID가 있는 객체 파일로 아카이브를 생성합니다.
- bench: 다양한 벤치마리 시나리오를 정의하고 실행할 수 있는 벤치마크 프레임워크입니다.
- buildid-cache: perf가 바이너리 파일과 심볼 테이블 정보를 연결하는 데 사용하는 빌드 ID 캐시를 관리합니다.
- c2c: 공유 데이터 캐시 일관성 및 HITM 분석 도구로 다중 코어 간의 캐시 상호작용 문제를 진단합니다.
- config: perf 동작을 개인화하거나 기본 매개변수를 지정하기 위해 perf 구성 파일의 변수를 읽고 설정합니다.
- daemon: 백그라운드에서 기록 세션을 실행하여 장기간 시스템 성능을 모니터링합니다.
- diff: 두 개 이상의 perf.data 파일을 비교하여 성능 차이를 분석하고 표시합니다.
- evlist: perf.data 파일의 이벤트 목록을 나열합니다.
- ftrace: 커널 ftrace 기능의 간단한 래퍼로 실시간 커널 함수 호출 경로를 추적합니다.
- inject: 이벤트 스트림에 추가 정보를 삽입하는 필터로 성능 문제 심층 분석을 용이하게 합니다.
- iostat: 블록 장치 읽기/쓰기 속도, I/O 작지 지연 시간 등 I/O 성능 지표를 표시합니다.
- kmem: 커널 메모리 할당, 해제, 단편화율 등을 추적/측정하는 도구입니다.
- lock: 시스템의 잠금 획득 및 해제 동작을 분석하여 잠금 경쟁 및 잠금 대기 시간을 확인합니다.
- mem: 메모리 접근 패턴을 분석하여 페이지 오류, 캐시 미스 횟수, 메모리 대역폭 사용량 등을 확인합니다.
- record: 명령을 실행하고 성능 프로필을 perf.data에 기록합니다.
- report: perf.data(perf record로 생성)를 읽고 개요를 표시합니다.
- stat: 명령을 실행하고 성능 카운터 통계 정보를 수집합니다.
- top: 실행 중인 프로세스의 실시간 성능 통계를 표시하는 시스템 성능 분석 도구입니다.
- trace: strace와 유사한 도구로 시스템 호출과 신호를 추적합니다.
3. perf list로 이벤트 소스 확인
perf list는 현재 시스템에서 지원하는 모든 성능 모니터링 이벤트를 나열하는 중요한 하위 명령어입니다. 이러한 이벤트에는 하드웨어 이벤트(예: 명령어 수집기, 캐시 히트/미스), 소프트웨어 이벤트(예: 컨텍스트 스위치, 페이지 오류), 커널 트레이스포인트 및 uprobes가 포함됩니다.
예제: 단일 명령어 CPU 시간 모니터링
# 이 명령어는 sleep 5를 실행하고 해당 프로세스가 CPU를 점유한 총 시간(밀리초)을 계산합니다
perf stat -e cpu-clock sleep 5
프로그램 실행 중 CPU 시간 모니터링
sudo perf stat -e cpu-clock ./my_app
perf 하위 명령어 상세
1. perf stat
perf stat은 지정된 명령어 또는 프로세스를 실행할 때 성능 카운터 통계 정보를 수집하고 표시하는 중요한 하위 명령어입니다.
기본 사용법
# 기본 형식
perf stat [옵션] [명령어]
# 예제
perf stat ls
이벤트 선택
# 특정 성능 이벤트 지정
perf stat -e <이벤트1>,<이벤트2>,... <명령어>
# 예제
perf stat -e cpu-cycles,cache-misses ls
통계 범위
- 시스템 범위: 기본적으로 전체 시스템 성능을 통계합니다.
- 프로세스 범위: -p 옵션으로 특정 프로세스 ID(PID)를 지정하여 해당 프로세스만 통계할 수 있습니다.
2. perf record
perf record은 지정된 프로세스 또는 시스템의 성능 데이터를 수집하는 하위 명령어입니다. CPU 성능 이벤트, 하드웨어 성능 카운터, 커널 동적 추적 및 호출 스택 정보를 포함합니다.
기본 구조
perf record [옵션] [명령어]
주요 옵션
- -e, --event=EVENT: 모니터링할 특정 성능 이벤트를 지정합니다.
- -p, --pid=PID: 지정된 프로세스 ID의 성능 데이터를 추적합니다.
- -g, --call-graph=[fp|dwarf|lbr]: 호출 스택 추적을 활성화합니다.
- -F, --freq=N: 샘플링 빈도를 설정합니다(예: -F 99는 초당 99회 샘플링).
- -a, --all-cpus: 모든 CPU 코어의 성능 데이터를 모니터링합니다.
3. perf report
perf report는 perf record 명령어로 수집된 성능 데이터를 구문 분석하고 표시합니다. 이 명령어는 .data 형식의 이진 성능 데이터 파일을 읽고 성능 보고서를 생성합니다.
명령어 형식
perf report [-i perf.data] [옵션]
주요 옵션
- -i, --input=FILE: 읽을 perf 데이터 파일을 지정합니다(기본값: perf.data).
- -n: 심볼 해석을 시도하지 않습니다.
- --stdio: 보고서를 표준 출력으로 출력합니다.
출력 해석
- 개요: 총 샘플 수 및 각 이벤트 발생 총수 등의 전체 통계 데이터.
- 함수 목록: 샘플 수별로 정렬된 함수 목록으로 각 함수가 차지하는 전체 실행 시간의 비율을 표시합니다.
- 호출 그래프: -g 옵션이 활성화된 경우 함수 호출 관계도를 표시합니다.
4. perf top 명령어
perf top은 시스템의 각 함수 또는 명령어의 CPU 사용률을 실시간으로 표시하여 성능 병목 현상을 추적하고 위치를 파악하는 데 도움을 줍니다.
출력 해석
- 첫 번째 열: 각 기호가 유발하는 성능 이벤트의 비율(CPU 주기 비율).
- 두 번째 열: 성능 이벤트와 연관된 DSO(동적 공유 개체).
- 세 번째 열: DSO 유형 표시.
- 네 번째 열: 구체적인 기호 이름.
플레임 그래프 생성
1. 플레임 그래프 설치
git clone https://github.com/brendangregg/FlameGraph.git
cd FlameGraph
2. perf로 데이터 수집
활성 프로세스 확인
ps aux | head -n 10
지정된 프로세스 데이터 수집
# MySQL 프로세스(PID 19083) 수집 예제
perf record -F 100 -p 19083 -g -- sleep 30
명령어 구성 요소 설명
- record: 성능 데이터를 기록하는 perf 하위 명령어.
- -F 100: 초당 100회 샘플링 빈도 설정.
- -p 19083: 모니터링할 프로세스 ID 지정.
- -g: 호출 스택 수집 활성화.
- --: 명령어 옵션 종료 표시.
- sleep 30: 30초 동안 실행되는 명령어.
3. 호출 스택 정보 분석
perf report -n --stdio > perf_analysis.txt
4. 프로그램 성능 분석 플레임 그래프 생성
처리 절차
# 1. 성능 이벤트 샘플 정보 추출
perf script -i perf.data > perf.unfold
# 2. 호출 스택 데이터 처리
./stackcollapse-perf.pl perf.unfold > perf.folded
# 3. SVG 플레임 그래프 생성
./flamegraph.pl perf.folded > perf.svg
단계별 설명
- perf script: perf.data 파일에서 상세한 성능 이벤트 샘플 정보를 추출하여 텍스트 형식으로 출력합니다.
- stackcollapse-perf.pl: perf로 생성된 접지되지 않은 호출 스택 데이터를 처리합니다.
- flamegraph.pl: 처리된 호출 스택 데이터를 SVG 벡터 그래픽 파일로 변환합니다.