Linux 서버의 성능 문제를 분석하거나 시스템 내부에서 어떤 일이 발생하는지 확인하려면 커널 이벤트(Kernel Event) 를 관찰해야 합니다. 과거에는 Kernel 로그나 디버깅 기능에 의존하는 경우가 많았지만, 최근에는 eBPF와 함께 Tracepoint를 활용하는 방식이 표준이 되었습니다.
Tracepoint는 Linux Kernel에 미리 정의된 이벤트 지점으로, 특정 동작이 발생할 때마다 정보를 수집할 수 있는 기능입니다. eBPF 프로그램을 Tracepoint에 연결하면 커널을 수정하지 않고도 프로세스 실행, 파일 접근, 시스템 콜 호출, 네트워크 이벤트 등을 실시간으로 추적할 수 있습니다.
이번 글에서는 Linux Tracepoint의 개념과 동작 원리, 확인 방법, eBPF와의 관계, 실무 활용 사례를 자세히 알아보겠습니다.
Linux Tracepoint란?
Tracepoint는 Linux Kernel 내부에 미리 정의된 이벤트 발생 지점입니다.
커널에서 특정 작업이 실행될 때 Tracepoint가 호출되고, 여기에 eBPF 프로그램이나 추적 도구를 연결하여 정보를 수집합니다.
구조는 다음과 같습니다.
Application
↓
System Call
↓
Kernel
↓
Tracepoint 발생
↓
eBPF Program
↓
데이터 수집
Tracepoint는 커널 코드 수정 없이도 다양한 이벤트를 관찰할 수 있도록 설계되었습니다.
Tracepoint가 필요한 이유
운영 서버에서 다음과 같은 문제가 발생했다고 가정해 보겠습니다.
- CPU 사용률이 갑자기 증가
- 특정 프로세스가 반복 실행
- 디스크 I/O 급증
- 네트워크 패킷 폭증
원인을 확인하려면 커널 내부에서 실제 어떤 이벤트가 발생하는지 확인해야 합니다.
Tracepoint는 이러한 정보를 안전하게 수집할 수 있도록 도와줍니다.
Tracepoint의 동작 과정
전체 흐름은 다음과 같습니다.
프로그램 실행
↓
Kernel 함수 호출
↓
Tracepoint 실행
↓
eBPF 연결 여부 확인
↓
데이터 수집
↓
User Space 전달
Tracepoint 자체는 거의 성능 영향을 주지 않으며, 필요할 때만 프로그램을 연결하여 사용할 수 있습니다.
Tracepoint와 Kprobe의 차이
둘 다 커널 이벤트를 추적하지만 동작 방식에는 차이가 있습니다.
| 항목 | Tracepoint | Kprobe |
|---|---|---|
| 대상 | 미리 정의된 이벤트 | 임의의 Kernel 함수 |
| 안정성 | 매우 높음 | Kernel 버전에 영향 받을 수 있음 |
| 성능 | 우수 | 우수 |
| 사용 난이도 | 쉬움 | 비교적 어려움 |
일반적으로 지원되는 이벤트라면 Tracepoint를 사용하는 것이 권장됩니다.
대표적인 Tracepoint
Linux에는 수백 개 이상의 Tracepoint가 존재합니다.
대표적인 예는 다음과 같습니다.
| Tracepoint | 설명 |
|---|---|
| sched_switch | 프로세스 전환 |
| sched_process_exec | 프로그램 실행 |
| sched_process_exit | 프로세스 종료 |
| sys_enter_openat | 파일 열기 |
| sys_exit_openat | 파일 열기 종료 |
| netif_receive_skb | 네트워크 수신 |
| block_rq_issue | 디스크 요청 |
| block_rq_complete | 디스크 완료 |
성능 분석에서 매우 자주 사용됩니다.
Tracepoint 목록 확인
현재 Kernel이 제공하는 Tracepoint는 다음 명령으로 확인할 수 있습니다.
ls /sys/kernel/debug/tracing/events
또는
ls /sys/kernel/tracing/events
Kernel 버전에 따라 위치가 조금 다를 수 있습니다.
특정 Tracepoint 확인
예를 들어 스케줄러 관련 Tracepoint를 확인하려면
ls /sys/kernel/tracing/events/sched
출력 예시
sched_switch
sched_wakeup
sched_process_exec
sched_process_exit
사용 가능한 이벤트를 확인할 수 있습니다.
bpftrace에서 Tracepoint 사용
가장 많이 사용하는 예시는 다음과 같습니다.
sudo bpftrace -e '
tracepoint:sched:sched_process_exec
{
printf("%s\n", comm);
}'
프로세스가 실행될 때마다 이름을 출력합니다.
시스템 콜 추적
파일 열기 이벤트 추적
sudo bpftrace -e '
tracepoint:syscalls:sys_enter_openat
{
printf("%s\n", comm);
}'
현재 어떤 프로그램이 파일을 열고 있는지 실시간으로 확인할 수 있습니다.
Tracepoint 정보 확인
특정 이벤트의 구조를 확인하려면
cat /sys/kernel/tracing/events/sched/sched_switch/format
출력 예시
field:char prev_comm[];
field:pid_t prev_pid;
field:pid_t next_pid;
eBPF 프로그램에서 사용할 필드 정보를 확인할 수 있습니다.
perf와 Tracepoint
perf에서도 Tracepoint를 사용할 수 있습니다.
예시
sudo perf trace
또는
sudo perf record -e sched:sched_switch
스케줄링 이벤트를 기록하여 분석할 수 있습니다.
실무에서 자주 사용하는 명령어
Tracepoint 목록
ls /sys/kernel/tracing/events
스케줄러 이벤트
ls /sys/kernel/tracing/events/sched
포맷 확인
cat /sys/kernel/tracing/events/sched/sched_switch/format
bpftrace 실행
sudo bpftrace
perf Trace
sudo perf trace
TraceFS 마운트 확인
mount | grep tracefs
실무 사례
예를 들어 운영 중인 웹 서버에서 응답 속도가 갑자기 느려졌다고 가정해 보겠습니다.
다음 순서로 분석합니다.
sched_switchTracepoint로 CPU 스케줄링 확인block_rq_issue이벤트로 디스크 I/O 분석sys_enter_openat이벤트로 파일 접근 확인- eBPF 프로그램으로 필요한 데이터 수집
- 병목 원인 분석 및 최적화
이처럼 Tracepoint는 성능 문제를 실시간으로 분석하는 데 매우 효과적인 도구입니다.
자주 묻는 질문
Tracepoint와 로그(Log)는 어떤 차이가 있나요?
로그는 애플리케이션이나 커널이 직접 기록한 메시지입니다. Tracepoint는 커널 내부의 특정 이벤트가 발생하는 순간을 추적하기 위한 기능으로, 보다 세밀한 성능 분석과 디버깅에 적합합니다.
Tracepoint는 운영 서버에서도 사용할 수 있나요?
가능합니다. Tracepoint는 커널에 기본적으로 내장되어 있으며, 필요한 시점에만 eBPF 프로그램이나 perf, bpftrace 같은 도구를 연결해 사용할 수 있어 운영 환경에서도 널리 활용됩니다.
eBPF 없이 Tracepoint만 사용할 수도 있나요?
네. perf, ftrace 등의 도구를 이용해 Tracepoint를 직접 사용할 수 있습니다. 하지만 eBPF와 함께 사용하면 데이터를 필터링하거나 가공하는 등 훨씬 유연한 분석이 가능합니다.
마무리
Linux Tracepoint는 커널 내부에서 발생하는 다양한 이벤트를 안전하고 효율적으로 추적하기 위한 핵심 기능입니다. eBPF, perf, bpftrace와 함께 사용하면 시스템 콜, 프로세스 실행, 스케줄링, 파일 접근, 디스크 I/O 등 다양한 이벤트를 실시간으로 분석할 수 있습니다. Linux 성능 최적화와 Observability를 이해하려면 반드시 익혀야 하는 기술입니다.