Linux 성능 분석 도구 perf와 플레임 그래프 생성

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 벡터 그래픽 파일로 변환합니다.

태그: 리눅스 성능 분석 perf 도구 플레임 그래프 프로파일링 시스템 모니터링

7월 1일 18:34에 게시됨