perf CPU 사용량 분석 방법

리눅스 환경에서 성능을 분석하고 튜닝하는 것은 시스템 최적화에 있어 매우 중요하다. 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 recordperf 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%

참고 사이트

답글 남기기