이번 글에서는 리눅스 커널 성능 측정 도구인 perf
를 사용해볼 예정이다. perf
는 리눅스 커널 소스의 tools/perf/
경로에 있다. 글을 쓰는 현재(2021-05-23) 기준으론 apt
명령어로 5.12.2
커널 버전의 perf
를 다운받을 수 없다. 그래서 우선 해당 프로그램을 설치하는 법에 대해서 소개하려 한다.
perf
설치우분투에선 다음과 같이 패키지 매니저로 설치가 가능하다.
$ sudo apt-get install linux-tools-common linux-tools-generic linux-tools-(uname -r)
*
uname -r
양 옆의 괄호를 ` (backquote) 으로 바꿔야 제대로 동작합니다.
앞의 두 패키지는 설치가 제대로 될 수도 있지만, 마지막 패키지는 설치가 안 될 수도 있다. 아마 10
의 9
은 설치가 제대로 안될텐데 그럼 커널 디렉터리로 들어가서 직접 설치하는 방법으로 진행해야 한다.
cd tools/perf make make install sudo cp perf /usr/bin
다음과 같이 5.12.2
가 나오면 성공이다.
perf
사용 가볍게 perf
명령어를 커맨드 라인에 입력해보자:
perf
명령어는...
(> perf [OPTIONS] COMMAND [ARGS]
다음의 꼴을 가진다. 일단 list
옵션을 입력해서 평가 가능한 여러 항목이 나온다. 옵션 확인과 평가 가능 항목까지 확인 했다면 마지막으로 perf test
옵션을 입력해서 perf
가 제대로 사용 가능한지 테스트한다. perf
의 많은 옵션은 root
권한으로 실행해야 정상 동작하고 test
도 그 중 하나이다. 따라서 앞으론 perf
사용 시 무조건 앞에 sudo
를 붙여서 실행할 것이다.
# perf test
일부 항목에서 FAILED!
와 Skip
이 나올 수 있는데 크게 문제되는 사항은 아니다. 다만 FAILED
항목이 Ok
항목보다 많다면 뭔가 문제가 있는 것이므로 글을 처음부터 다시 읽어보길 바란다.
top
옵션 top
옵션은 현재 커널 내부에서 실행되는 함수(Symbol
)들의 부하(Overhead
) 비율을 스냅샵 형태로 표시한다. 실행 결과는 다음과 같다:
q
를 입력해서 탈출하는 것이 가능하다.
stat
옵션 다음은 stat
옵션이다. stat
은 perf
수행 중 커널 내부에서 발생한 이벤트 처리에 대한 통계 정보를 보여준다. 다음 명령어를 입력하여 3 초 발생한 이벤트 처리에 대한 통계를 보여준다:
# perf stat sleep 3
record
옵션 위에서 확인해본 top
옵션은 커널에서 실행하고 있는 정보들을 실시간으로 확인할 수 있다는 장점이 있지만, 반대로 내용이 실시간으로 변하기 때문에 분석하기에는 어려울 수 있다. record
옵션을 사용하면 이러한 분석 정보를 파일로 저장할 수 있다.
# perf record
(Ctrl + C
누르면 기록 종료)
다음과 같이 파일이 저장된 것을 확인할 수 있다. 다만 아쉽게도 해당 파일은 사람이 볼 수 있는 형태(text
파일)가 아니기 때문에 다른 방법으로 결과를 확인해야 한다. 아래에서 후술할 report
옵션이 바로 그것이다.
record
옵션은 이 밖에 여러 다양한 설정을 제공한다:
옵션 | 설명 | 명령어 예시 |
---|---|---|
-p | 특정 PID 의 정보만 저장 | perf record -p PID |
-a | 모든 프로세스의 정보 저장 | perf record -a sleep 5 |
-g | 스택 정보도 함께 저장 | perf record -ag |
-e | 특정 EVENT 의 정보를 저장 | perf record -e NAME |
-F | 분석 주기(Hz )를 NUM 으로 설정 | perf record -F NUM |
report
옵션 report
옵션은 record
에 의해 저장된 perf.data
파일을 분석하기 위해 사용되어질 수 있다. perf report
를 실행하여 perf record -ag
의 결과를 출력하면 다음과 같은 결과를 확인할 수 있다:
스택 옵션도 추가해서 실행 결과가 옆으로 길게 늘어졌다. 보통 이런 식으로 출력된 결과는 가독성이 썩 좋지 않기 때문에 위 정보를 조금 더 쉽게 확인할 수 있게 만들어주는 프로그램이 있다.
git clone https://github.com/brendangregg/Flamegraph.git
다음 저장소를 복제한 후 들어가서 파일을 확인하면 다양한 script
가 있는 것을 확인할 수 있다.
# perf record -e context-switching -ag (Ctrl + C 중지) # perf script | Flamegraph/stackcollapse-perf.pl | Flamegraph/flamegraph.pl > graph.svg
위 명령어는 context-switching
이벤트에 발생에 대한 스택 비율(가로 방향)과 호출된 스택 깊이(세로 방향)을 보여주는 이미지를 생성한다.
probe
옵션 probe
옵션은 커널에서 특정 이벤트가 동작하는 시점부터 분석정보를 추적할 수 있다. list
에서 찾은 옵션을 probe
를 통해 등록한다.
# perf probe <event>
을 통해 이벤트를 등록할 수 있고 등록된 이벤트는 다음을 통해 확인 가능하다:
# perf probe --list
삭제는 --del
옵션을 줘서 삭제할 수 있다.
# perf probe --del <event>
위 사진은 schedule
이벤트에 대한 이벤트 추적 실행을 등록, 등록된 probe
를 바탕으로 기록을 진행한 것이다. 결과는 앞서 해봤던 것처럼 report
옵션으로 확인 가능하다.
# perf report
필자의 경우 아래와 같은 report
결과가 나왔다:
[책] 리눅스 커널 소스 해설: 기초 입문 (정재준 저)
[사이트] https://xiaoyanzhuo.github.io/2019/01/18/Perf-Tool.html