카테고리 없음

perf usage (perf 사용법)

Roiei 2024. 2. 5. 14:43
반응형

event 기록 및 확인

~$ perf record ./my_program

perf.data가 생성됨

perf record -F 99 -g -p pid
와 함께하면 동작 중인 process의 event를 c99Hz 샘플링 주기로 캡쳐 함

~$ perf report perf.data

 

record 옵션

  • -F : 초당  sampling 횟수로 보통 49Hz나 99Hz를 많이 사용 (50이나 100같은 값을 사용시 lockstep sampling으로 결과 왜곡 발생 가능)
  • -a : 모든 CPU에 대해서 sampling (이를 명시하지 않을 시 my_program라는 명령어에 대해서만 sampling)
  • -g -- : perf.data에 호출 스택을 표시 (-- 대신 다른 것을 적으면 stack unwindling 방법을 사용할 수 있음)
  •  

함수별 수행 시간 확인

함수별 수행 시간을 보려면, perf record 시 -g 옵션을 줘야 함
executable은 -g -pg -C0 등으로 C_FALGS와 CXX_FLAGS가 설정되어서 빌드 되어야 함

 

cmake의 경우 ex

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g -pg")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g -pg")

 

~$ perf record ./my_program

이후 perf report perf.data를 수행해서 다음과 같이 함수별 수행 시간의 그래프를 얻을 수 있음

~$ perf report perf.data

 

다음과 같이 함수 별 수행시간을 보고싶다면 call graph 옵션인 (-g)를 줘서 perf record를 수행해야 합니다. 

 

perf record -g ./app

 

이후 다음과 같이 report 합니다. 

 

perf report -g

+   86.18%     0.00%  my_program   my_program                     [.] blas_memory_alloc
+   86.17%     0.12%  my_program   my_program                     [.] alloc_mmap
+   85.44%     0.00%  my_program   libpthread-2.17.so             [.] start_thread
+   85.40%     0.01%  my_program   my_program                     [.] blas_thread_server
+   85.12%    84.83%  my_program   my_program                     [.] run_bench
+    9.09%     0.65%  my_program   libc-2.17.so                   [.] _mcount
+    9.08%     0.00%  my_program   libintegration_template.so     [.] executeTestEntry
+    9.07%     0.00%  my_program   [unknown]                      [.] 0xe84866660023c2dc
...

frame graph

함수별 수행 시간을 좀 더 쉽게 frame graph로 볼 수 있습니다.

git clone https://github.com/brendangregg/FlameGraph.git
cd FlameGraph
cp ~/perf.data ./
perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > flamegraph.svg

 

 

 

probe 옵션

perf probe <event> 

kernel의 특정 event 발생 부터 추적

 

ex.

perf record -e probe: schedule -aR sleep 1

 

 

perf test

perf test를 수행 (sudo 권한 필요)하여 측정 가능한 event들이 정상적으로 수집되는지 여부를 확인할 수 있습니다. 

25: Use a dummy software event to keep tracking           : Ok
26: Parse with no sample_id_all bit set                   : Ok
27: Filter hist entries                                   : Ok
28: Lookup mmap thread                                    : Ok
29: Share thread mg                                       : Ok
30: Sort output of hist entries                           : Ok
31: Cumulate child hist entries                           : Ok
32: Track with sched_switch                               : Ok
33: Filter fds with revents mask in a fdarray             : Ok
34: Add fd to a fdarray, making it autogrow               : Ok
35: kmod_path__parse                                      : Ok
36: Thread map                                            : Ok

 

perf top

커널 내부에서 현재 실행되는 함수(symbol)들의 overhead %를 표시

 

 

 

참고

https://www.brendangregg.com/perf.html

반응형