애플리케이션 성능 문제가 커널 레벨에서 발생할 때, ftrace, perf, bpftrace 같은 도구로 커널 내부를 들여다볼 수 있습니다. 블랙박스가 아닌 화이트박스로 커널을 관찰하는 방법입니다.


커널 추적 도구 개요

PLAINTEXT
사용 편의성 ↑                              깊이 ↑
┌──────────┬──────────┬──────────┬──────────┐
│ top/htop │ strace   │ perf     │ ftrace   │
│ vmstat   │ ltrace   │ bpftrace │ kprobe   │
│ iostat   │          │ BCC      │ 커널모듈  │
└──────────┴──────────┴──────────┴──────────┘
  시스템 통계    시스템 콜    프로파일링    커널 내부

perf

리눅스 커널에 포함된 성능 분석 도구 입니다.

BASH
# 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 시간을 어디서 사용하는지 한눈에 보여줍니다.

BASH
# Flame Graph 생성
perf record -F 99 -g -p $PID -- sleep 30
perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg

ftrace

커널에 내장된 함수 추적 프레임워크 입니다.

BASH
# 사용 가능한 추적기
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 프론트엔드)

BASH
# 기록
trace-cmd record -p function_graph -g vfs_read

# 결과 보기
trace-cmd report

bpftrace

eBPF 기반 고수준 추적 도구 입니다. 원라이너로 강력한 추적이 가능합니다.

BASH
# 시스템 콜 빈도
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 도구 모음입니다.

BASH
# 디스크 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로 다양한 커널 이벤트를 모니터링할 수 있습니다.

댓글 로딩 중...