리눅스 환경에서 성능을 분석하고 튜닝하는 것은 시스템 최적화에 있어 매우 중요하다. perf
는 리눅스 커널에 내장된 성능 분석 도구로, CPU 사용량, 메모리, 디스크 I/O, 네트워크 트래픽 등의 다양한 성능 지표를 측정할 수 있다. 이 글에서는 perf
를 사용하여 CPU 사용량을 분석하는 방법에 대해 알아본다.
perf
란?
perf
는 리눅스 커널의 성능 이벤트를 측정하고 분석하는 도구로, 리눅스 커널 2.6.31 버전 이후 기본적으로 포함되었다. 이 도구는 CPU와 메모리, 캐시, I/O와 같은 다양한 시스템 성능 메트릭을 측정할 수 있으며, 시스템 전체나 특정 프로세스의 성능을 분석할 때 사용된다.
perf
설치
대부분의 최신 리눅스 배포판에는 perf
가 포함되어 있지만, 설치되지 않은 경우 아래와 같이 관련 패키지를 설치해 준다.
sudo apt update
sudo apt install linux-tools-common linux-tools-$(uname -r)
uname -r
명령어를 사용하면, 현재 커널 버전에 맞는 perf
패키지가 설치된다. 설치가 완료되면 perf
명령어가 사용 가능하다.
perf
를 이용한 CPU 사용량 분석 방법
perf
는 다양한 성능 분석 기능을 제공하지만, 여기서는 CPU 사용량 분석에 초점을 맞추어 몇 가지 중요한 명령어와 사용법에 대해 설명한다.
1. CPU 프로파일링 (perf top
)
perf top
은 실시간 CPU 사용량을 확인하는 데 유용한 명령어로, 실행 중인 프로그램의 CPU 사용량과 각 함수가 얼마나 많은 CPU 시간을 사용하는지를 실시간으로 보여준다.
sudo perf top
perf top
을 실행하면, 시스템에서 실행 중인 프로세스와 함수별로 CPU 사용량을 실시간으로 확인할 수 있다. 출력 결과는 top
명령어와 유사하지만, 더 세밀하게 함수 수준에서 CPU 사용량을 분석할 수 있다는 점이 특징이다.
주요 출력 항목
- Overhead: 각 함수가 차지하는 CPU 사용 비율(백분율)
- Shared Object: 함수가 포함된 실행 파일이나 라이브러리 이름
- Symbol: CPU 시간을 많이 차지하는 함수의 이름

2. CPU 이벤트 샘플링 (perf stat
)
perf stat
은 특정 명령어의 CPU 사용량을 측정할 때 유용한 명령어이다. CPU 사이클, 명령어 수, 캐시 미스 등의 정보를 포함한 다양한 성능 이벤트를 요약하여 보여준다.
sudo perf stat -d <your_command>
예를 들어, ls
명령어에 대한 CPU 사용량과 성능 메트릭을 확인하고 싶다면 다음과 같이 실행한다.
$ sudo perf stat -d ls
Desktop Documents Downloads Music Pictures Public snap Templates Videos work
Performance counter stats for 'ls':
1.30 msec task-clock # 0.661 CPUs utilized
0 context-switches # 0.000 /sec
0 cpu-migrations # 0.000 /sec
94 page-faults # 72.322 K/sec
<not supported> cycles
<not supported> instructions
<not supported> branches
<not supported> branch-misses
<not supported> L1-dcache-loads
<not supported> L1-dcache-load-misses
<not supported> LLC-loads
<not supported> LLC-load-misses
0.001966250 seconds time elapsed
0.000000000 seconds user
0.002795000 seconds sys
출력 결과에서 CPU 사이클(cycles), 명령어 수(instructions), 페이지 폴트(page-faults), 캐시 미스(branch-misses) 등을 확인할 수 있다. 이를 통해 특정 명령어가 얼마나 많은 CPU 리소스를 사용하는지 파악할 수 있다.
3. 특정 프로그램의 CPU 프로파일링 (perf record
와 perf report
)
perf record
는 특정 프로그램을 실행하면서 해당 프로그램의 CPU 사용량과 성능 이벤트를 기록한다. 기록이 완료된 후, perf report
를 사용하여 결과를 분석할 수 있다.
3.1. perf record
다음 명령어를 사용하여 perf record
로 프로그램의 CPU 사용량을 기록한다.
sudo perf record -F 99 -p <PID> -g
-F 99
: 초당 샘플링 횟수를 99로 설정한다.-p <PID>
: 특정 프로세스 ID(PID)를 지정하여 해당 프로세스의 성능 이벤트를 기록한다.-g
: 콜 그래프(Call Graph)를 활성화하여 함수 호출 계층 구조를 기록한다.
예를 들어, dd 명령어 수행을 기록하려면 다음과 같이 실행한다.
sudo perf record -g dd if=/dev/zero of=tmp.img bs=1M count=100
이 명령어는 perf.data
파일을 생성하며, 이 파일에 프로그램의 CPU 사용량이 기록된다.
~$ sudo perf record -g dd if=/dev/zero of=tmp.img bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.0590251 s, 1.8 GB/s
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.030 MB perf.data (105 samples) ]
3.2. perf report
perf record
로 기록한 데이터를 분석하려면 perf report
명령어를 사용한다.
sudo perf report
perf report
는 CPU 사용량이 높은 함수와 그 함수가 호출된 경로를 계층 구조로 표시하여, 어떤 함수가 CPU 자원을 가장 많이 소모했는지 쉽게 파악할 수 있도록 해준다.

4. CPU 캐시 분석 (perf mem
)
CPU 캐시 효율을 분석하려면 perf mem
명령어를 사용할 수 있다. 캐시 히트와 캐시 미스에 대한 정보를 수집하여, 캐시의 효율성을 평가할 수 있다.
명령어 예제
sudo perf mem record -t load -p <PID>
-t load
: 메모리 로드 이벤트 기록- -p <PID> : 지정한 PID의 메모리 접근 추적
기록을 완료한 후에는 perf mem report
명령어로 결과를 분석한다.
sudo perf mem report
이 명령어는 특정 프로세스가 메모리 접근 시 캐시를 얼마나 효율적으로 사용하는지에 대한 정보를 제공하며, 캐시 미스율이 높은지 여부를 확인할 수 있다. 캐시 미스가 높다면, 메모리 접근 패턴을 개선하거나 캐시 활용을 높이는 방법을 고려해야 한다.
Overhead Symbol Source LLC miss
-------- ------------ ------------- --------
45.23% funcA moduleA 12.5%
25.11% funcB moduleB 8.3%