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_kb | CPU당 버퍼 크기(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-buffervsentries-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)가 필요합니다. 배포판·보안 모듈에 따라 다를 수 있습니다.