커널 디버깅 — ftrace, perf, BPF로 커널 추적하기
애플리케이션 성능 문제가 커널 레벨에서 발생할 때, ftrace, perf, bpftrace 같은 도구로 커널 내부를 들여다볼 수 있습니다. 블랙박스가 아닌 화이트박스로 커널을 관찰하는 방법입니다.
커널 추적 도구 개요
사용 편의성 ↑ 깊이 ↑
┌──────────┬──────────┬──────────┬──────────┐
│ top/htop │ strace │ perf │ ftrace │
│ vmstat │ ltrace │ bpftrace │ kprobe │
│ iostat │ │ BCC │ 커널모듈 │
└──────────┴──────────┴──────────┴──────────┘
시스템 통계 시스템 콜 프로파일링 커널 내부
perf
리눅스 커널에 포함된 성능 분석 도구 입니다.
# CPU 프로파일링 (30초간 샘플링)
perf record -g -p $PID -- sleep 30
perf report
# 시스템 전체 통계 (하드웨어 카운터)
perf stat -a sleep 5
# → CPU 사이클, 명령 수, 캐시 미스, 분기 예측 실패 등
# 실시간 함수 호출 빈도
perf top
# 특정 이벤트 카운트
perf stat -e cache-misses,cache-references,instructions ./myapp
# 스케줄링 지연 분석
perf sched record -- sleep 10
perf sched latency
Flame Graph (불꽃 그래프)
perf 데이터를 시각화하여 CPU 시간을 어디서 사용하는지 한눈에 보여줍니다.
# Flame Graph 생성
perf record -F 99 -g -p $PID -- sleep 30
perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg
ftrace
커널에 내장된 함수 추적 프레임워크 입니다.
# 사용 가능한 추적기
cat /sys/kernel/debug/tracing/available_tracers
# 함수 추적 활성화
echo function > /sys/kernel/debug/tracing/current_tracer
echo 1 > /sys/kernel/debug/tracing/tracing_on
# 특정 함수만 추적
echo 'vfs_read' > /sys/kernel/debug/tracing/set_ftrace_filter
# 추적 결과 확인
cat /sys/kernel/debug/tracing/trace
# 함수 호출 그래프 (호출 깊이 포함)
echo function_graph > /sys/kernel/debug/tracing/current_tracer
# 추적 중지
echo 0 > /sys/kernel/debug/tracing/tracing_on
trace-cmd (ftrace 프론트엔드)
# 기록
trace-cmd record -p function_graph -g vfs_read
# 결과 보기
trace-cmd report
bpftrace
eBPF 기반 고수준 추적 도구 입니다. 원라이너로 강력한 추적이 가능합니다.
# 시스템 콜 빈도
bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @[comm] = count(); }'
# 프로세스별 파일 열기 추적
bpftrace -e 'tracepoint:syscalls:sys_enter_openat {
printf("%s %s\n", comm, str(args->filename));
}'
# vfs_read 지연 시간 히스토그램
bpftrace -e '
kprobe:vfs_read { @start[tid] = nsecs; }
kretprobe:vfs_read /@start[tid]/ {
@us = hist((nsecs - @start[tid]) / 1000);
delete(@start[tid]);
}'
# TCP 연결 추적
bpftrace -e 'kprobe:tcp_connect {
printf("%s → %s\n", comm, ntop(((struct sock *)arg0)->__sk_common.skc_daddr));
}'
BCC (BPF Compiler Collection)
사전 제작된 BPF 도구 모음입니다.
# 디스크 I/O 지연 히스토그램
biolatency
# TCP 연결 추적
tcpconnect
# 파일 시스템 지연
ext4slower 1 # 1ms 이상 걸린 ext4 작업
# 프로세스별 페이지 폴트
drsnoop
# off-CPU 분석 (스레드가 CPU를 못 쓰는 시간)
offcputime
도구 선택 가이드
| 상황 | 추천 도구 |
|---|---|
| CPU 핫스팟 찾기 | perf + Flame Graph |
| 시스템 콜 추적 | strace, bpftrace |
| 커널 함수 추적 | ftrace, bpftrace |
| I/O 지연 분석 | BCC (biolatency) |
| 네트워크 분석 | BCC (tcpconnect, tcplife) |
| 메모리 문제 | perf mem, BCC (memleak) |
핵심 포인트
- perf vs strace: strace는 시스템 콜만, perf는 하드웨어 카운터 + CPU 프로파일링
- Flame Graph 읽는 법: x축은 알파벳 순서(시간 아님), y축은 호출 깊이, 너비가 CPU 시간 비율
- bpftrace가 strace보다 오버헤드가 적은 이유: eBPF는 커널 내에서 실행되므로 컨텍스트 스위칭 최소
정리
리눅스 커널 디버깅 도구는 시스템 성능 문제의 근본 원인을 찾는 데 필수적입니다. perf로 CPU 프로파일링, ftrace로 커널 함수 추적, bpftrace/BCC로 다양한 커널 이벤트를 모니터링할 수 있습니다.