perf usage (perf 사용법)
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 %를 표시