ftrace function_graph 사용법, 커널 경로를 어떻게 보나

한 줄 답: /sys/kernel/tracing에서 function_graph를 current_tracer에 쓰고, set_ftrace_filter로 관심 함수만 남긴 다음 tracing_on을 켜고 trace 또는 trace_pipe를 읽습니다.

이 글은 kernel.org의 ftrace - Function Tracer 문서(Documentation/trace/ftrace.rst)를 기준으로 한 일반 설명입니다. perf와의 비교·보드별 실측 로그는 다루지 않습니다.

버퍼는 어디?

한 줄 답: 제어·출력 파일은 tracefs의 /sys/kernel/tracing에 있고, 이벤트는 per-CPU 링 버퍼에 쌓이며 trace/trace_pipe와 buffer_size_kb로 읽고 크기를 조정합니다.

tracefs가 커널에 포함되면 /sys/kernel/tracing이 생깁니다. 마운트 예시는 다음과 같습니다.

mount -t tracefs nodev /sys/kernel/tracing
cd /sys/kernel/tracing

4.1 이전에는 debugfs 아래 /sys/kernel/debug/tracing이 쓰였고, debugfs를 마운트하면 호환 경로로도 보일 수 있습니다. 문서의 이후 예시는 이 디렉터리에 있다고 가정합니다.

핵심 파일만 정리하면 다음과 같습니다.

파일역할
available_tracers컴파일된 트레이서 목록
current_tracer활성 트레이서(변경 시 링·스냅샷 버퍼가 비워짐)
tracing_on링 버퍼 기록 on/off (0/1)
trace사람이 읽기 쉬운 스냅샷형 출력(소비자가 아님)
trace_pipe라이브 스트림용 소비자 읽기
buffer_size_kbCPU당 버퍼 크기(KB)
available_filter_functions필터에 넣을 수 있는 함수 이름 목록

tracing_on을 꺼도 계측 오버헤드 자체는 남을 수 있습니다. 기록을 멈추는 스위치이지 트레이서를 제거하는 동작은 아닙니다. 트레이서를 끄려면 echo nop > current_tracer가 문서에 안내되어 있습니다.

필터는?

한 줄 답: available_filter_functions에 있는 이름만 set_ftrace_filter/set_ftrace_notrace(그리고 graph용 set_graph_function)에 넣고, function 또는 function_graph를 current_tracer에 설정합니다.

# 사용 가능한 트레이서 확인
cat available_tracers

# function_graph 선택
echo function_graph > current_tracer

# 관심 함수만 (이름은 available_filter_functions에 있어야 함)
echo 'do_sys_open' > set_ftrace_filter
# 여러 개는 추가 쓰기 또는 와일드카드·인덱스 문법을 문서의 Filter commands에 따름

echo 1 > tracing_on
# 재현 작업 수행
echo 0 > tracing_on
cat trace
  • function: 진입(및 부모) 위주의 함수 호출 추적.
  • function_graph: 진입·퇴장을 모두 잡아 C 소스와 비슷한 호출 그래프와 duration을 보여 줍니다.
  • set_ftrace_notrace: 제외 목록. 필터와 겹치면 추적되지 않습니다.
  • set_graph_function: graph 트레이서에서 해당 함수와 그 하위 호출만 그리게 제한합니다.
  • PID 제한: set_ftrace_pid로 특정 스레드만 볼 수 있습니다.

전역 스위치 kernel.ftrace_enabled가 꺼져 있으면 function 계열이 nop처럼 동작할 수 있으므로, 문서처럼 sysctl kernel.ftrace_enabled=1을 확인합니다.

오버헤드는?

한 줄 답: 동적 ftrace가 켜진 커널에서는 비활성 시 호출이 nop에 가깝게 패치되지만, 활성 function/function_graph·넓은 필터·스택 옵션은 지연과 버퍼 덮어쓰기를 키우므로 필터를 좁히고 필요할 때만 tracing_on을 켭니다.

문서가 강조하는 실무 포인트는 다음과 같습니다.

  • 필터 없이 function 계열을 켜면 버퍼가 빨리 차고(entries-in-buffer vs entries-written 차이 = 유실), 시스템 부하가 커집니다.
  • func_stack_trace 같은 옵션은 필터를 먼저 건 뒤에만 켜라고 명시되어 있습니다. 그렇지 않으면 성능이 크게 떨어집니다.
  • function_graph는 진입·퇴장 계측과 duration 계산 비용이 function보다 큽니다. 동일 함수를 여러 인스턴스가 graph로 보면 타이밍이 살짝 어긋날 수 있다고 문서에 적혀 있습니다.
  • 버퍼가 가득 차면 기본 overwrite 동작으로 오래된 이벤트가 버려질 수 있습니다. 크기는 buffer_size_kb로 조정합니다.

읽기와 종료 절차의 최소 형태는 다음과 같습니다.

cat trace          # 또는: cat trace_pipe
echo nop > current_tracer
echo > set_ftrace_filter

trace는 비소비 읽기라 트레이싱이 꺼져 있으면 같은 내용이 반복될 수 있고, trace_pipe는 읽은 데이터를 소비합니다.

FAQ

Q. available_filter_functions와 current_tracer는 어디에 있나?
A. 둘 다 /sys/kernel/tracing/(또는 호환 경로 /sys/kernel/debug/tracing/) 아래입니다.

Q. 권한은?
A. 일반적으로 root(또는 CAP_SYS_ADMIN)가 필요합니다. 배포판·보안 모듈에 따라 다를 수 있습니다.

참고