본문 바로가기
Linux/명령어

[Linux] perf 명령어 사용법 및 예제 - Flame Graph 해석 방법

by A6K 2023. 11. 8.

perf 명령어는 리눅스 커널 프로젝트에서 관리되는 시스템 성능 프로파일링 도구다. perf 명령을 이용해서 특정 프로그램이나 시스템 전체 성능을 분석할 수 있다. perf 명령을 이용해서 성능에 문제를 일으키는 부분이 어디인지를 찾아낼 수 있다.

예를 들어 프로그램의 어떤 함수가 CPU 자원을 많이 소모하고 있는지 알 수 있으며, 코드의 어떤 부분이 메모리 할당을 얼마나 하는지 등을 어셈블리 및 소스코드 레벨로 확인할 수 있다. 커널에서 제공하는 특정 함수가 얼마나 호출되는지도 파악할 수 있다.

목차

    perf 설치

    perf 명령은 패키지 관리자인 yum을 통해 설치할 수 있다.

    yum -y install perf

    데비안 계열의 리눅스에서는 apt-get을 통해 설치할 수 있다.

    apt-get install linux-tools-$(uname -r)
    
    apt-get install linux-cloud-tools-$(uname -r)

    혹은 사용하고 있는 커널 소스가 있다면 tools/perf 디렉토리로 들어가서 make 명령을 실행해 직접 컴파일 및 설치를 할 수도 있다.

    perf 사용법

    perf 명령은 다음과 같은 형태로 사용할 수 있다. perf 명령은 시스템을 프로파일링하는 동작을 수행하기 때문에 많은 경우 root 권한을 필요로한다.

    perf [OPTIONS] COMMAND [ARGS]

    perf list 명령을 실행하면 perf 명령을 이용해 프로파일링 할 수 있는 이벤트들의 목록을 볼 수 있다.

    perf test 명령을 실행하면 perf 명령을 통해 체크할 수 있는 옵션들을 확인할 수 있다. 

     perf top

    top 옵션은 현재 커널 내부에서 실행되는 함수들의 부하 비율을 스냅샷 형태로 표시한다. [q] 를 입력해서 모니터링 화면을 빠져나갈 수 있다.

    perf stat

    stat 옵션은 perf 수행 중 커널 내부에서 발생한 이벤트 처리에 대한 통계정보를 보여준다. 예를 들어 3초 동안 발생한 이벤트 처리에 대한 통계를 보려면 다음과 같이 입력하면 된다.

    sudo perf stat sleep 3

    perf record

    record 옵션은 perf 명령을 이용해 프로파일링한 정보를 파일로 저장할 수 있다. top 옵션의 경우 커널 내부 이벤트에 대한 정보를 실시간으로 확인할 수 있지만 실시간으로 계속 바뀌기 때문에 분석하기 어려울 수 있다. 이 경우 record 옵션으로 정보들을 파일로 떨궈서 분석할 수 있다.

    perf record 옵션을 실행하면 커널 이벤트에 대한 프로파일링이 실행되며, Ctrl + C 를 눌러 종료할 수 있다. 프로파일링 된 정보들은 현재 작업 디렉토리에 perf.data 파일로 기록된다.

    record 옵션은 추가적인 옵션을 받을 수 있다.

    옵션 설명 예시
    -p 특정 프로세스의 정보를 저장 sudo perf record -p ${PID}
    -a 모든 프로세스의 정보를 저장 sudo perf record -a sleep 10
    -g 스택 정보도 함께 저장 sudo perf record -p ${PID} -g
    -e 특정 이벤트에 대한 정보를 저장 sudo perf record -e ${EVENT_NAME}
    -F 분석 주기(Frequency)를 숫자로 설정 sudo perf record -F ${NUM}

    perf report

    report 옵션은 record 옵션으로 저장한 perf.data 파일을 분석하기 위해 사용된다. perf.data 파일은 텍스트 파일이 아니기 때문에 텍스트 에디터를 통해 열어볼 수 없다. 대신 perf 명령의 report 옵션을 통해 분석할 수 있다.

    perf probe

    probe 옵션은 커널에서 특정 이벤트가 동작하는 시점부터 분석 정보를 추적할 수 있다. perf list 명령에서 확인할 수 있는 이벤트 이름을 사용하면 된다.

    perf probe --list # 등록된 이벤트 리스트 확인
    
    perf probe <EVENT> # 이벤트 추가
    
    perf probe --del <EVENT> # 이벤트 해제

    이후 record 옵션으로 probe에 등록한 이벤트를 지정할 수 있다.

    perf record -e probe:<EVENT> -agR sleep 10

    실행 결과로 perf.data 파일이 생성되고, report 옵션을 이용해 분석할 수 있다.

    Flame Graph

    perf record를 이용해 프로파일링한 정보는 perf.data 파일에 기록된다. 이 파일을 perf report 명령을 이용해 분석할 수 있는데 가독성이 좋은 편은 아니다. perf.data 파일의 정보를 좀 더 보기 쉽게 만들어주는 FlameGraph를 함께 사용하면 좋다.

    FlameGraph는 깃헙에 공개되어 있다.

    git clone https://github.com/brendangregg/Flamegraph.git

    저장소를 Clone 한 다음 디렉토리를 확인해보면 다양한 스크립트들이 들어있는 것을 확인할 수 있다. (pl 확장자) 그 스크립트를 이용해 다음과 같이 FlameGraph 이미지를 생성할 수 있다.

    perf script | stackcollapse-perf.pl | flamegraph.pl > graph.svg

    stackcollapse-perf.pl 스크립트와 flamegraph.pl 스크립트는 clone 한 디렉토리에서 찾을 수 있으며, perf script는 perf.data 파일이 있는 디렉토리에서 실행하면 된다.

    출처 : FlameGraph

    그 결과로 위와 같은 이미지를 얻을 수 있다.

    우선 Flame Graph에 등장하는 사각형 조각들은 스택 프레임을 의미한다. 각각의 사각형은 자바 메소드, C++ 함수, 시스템 호출일 수 있다. 컬러 스킴에 따라 스택 프레임의 종류는 색상으로 구별된다. 위 그래프에서 녹색은 자바 코드, 노란색은 C++ 코드, 빨간색은 시스템 호출을 의미한다.

    Flame Graph의 x축은 프로파일러가 수집한 샘플에서 등장하는 횟수를 의미한다. x 축에서 등장하는 순서에는 큰 의미가 없고, 그냥 스택 프레임을 알파벳 순으로 정렬했을 뿐이다. 가로 축으로 길게 나타나는 스택 프레임일 수록 더 많은 CPU 타임동안 리턴하지 않고 있었다는 의미다. 서버에 문제가 생겼을 경우 가로로 길게 나타나는 코드 패스를 먼저 분석해보면 문제를 찾을 가능성이 높아진다.

    Flame Grpah의 y축은 콜 스택의 깊이를 의미한다. 밑에 깔려 있는 스택 프레임에서 위에 있는 스택 프레임을 호출한 콜 스택을 표현했다고 생각하면 된다.

    댓글