eBPF는 Linux Kernel 내부를 매우 세밀하게 분석할 수 있는 강력한 기술이지만, 일반적으로는 C 언어를 이용해 프로그램을 작성하고 컴파일한 뒤 커널에 로드해야 합니다. 이러한 과정은 학습 비용이 높고 간단한 문제를 확인하기에도 다소 번거롭습니다.
이러한 불편함을 해결하기 위해 등장한 것이 bpftrace입니다.
bpftrace는 AWK와 DTrace 문법을 참고하여 만든 고수준 eBPF 추적 도구로, 한 줄 명령만으로도 프로세스, 시스템 콜, 파일 접근, 네트워크, 디스크 I/O, CPU 성능 등을 실시간으로 분석할 수 있습니다.
이번 글에서는 bpftrace의 개념과 특징, 설치 방법, 기본 문법, 자주 사용하는 명령어, 실무 활용 사례를 자세히 알아보겠습니다.
Linux bpftrace란?
bpftrace는 eBPF 프로그램을 간단한 스크립트 형태로 작성하여 실행할 수 있는 오픈소스 추적 도구입니다.
동작 구조는 다음과 같습니다.
사용자 명령
↓
bpftrace
↓
LLVM/Clang
↓
eBPF Bytecode
↓
Linux Kernel
↓
실시간 데이터 출력
복잡한 컴파일 과정을 직접 수행하지 않아도 다양한 커널 이벤트를 쉽게 분석할 수 있습니다.
bpftrace가 필요한 이유
기존 eBPF 개발 과정은 다음과 같습니다.
- C 코드 작성
- 컴파일
- ELF 생성
- Kernel 로드
- Map 생성
- 데이터 출력
반면 bpftrace는 다음과 같이 매우 간단합니다.
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s\n", comm); }'
한 줄만으로도 파일 열기 시스템 콜을 추적할 수 있습니다.
bpftrace의 특징
대표적인 특징은 다음과 같습니다.
- eBPF 기반 동작
- 간단한 문법
- 실시간 데이터 출력
- 다양한 Probe 지원
- Kernel 수정 불필요
- 운영 서버에서도 활용 가능
초보자도 eBPF를 쉽게 시작할 수 있다는 것이 가장 큰 장점입니다.
지원하는 Probe 종류
bpftrace는 다양한 Probe를 지원합니다.
| Probe | 설명 |
|---|---|
| kprobe | Kernel 함수 시작 |
| kretprobe | Kernel 함수 종료 |
| uprobe | User 함수 시작 |
| uretprobe | User 함수 종료 |
| tracepoint | Kernel 이벤트 |
| profile | CPU 샘플링 |
| interval | 일정 시간마다 실행 |
| software | Software Event |
| hardware | Hardware Performance Counter |
상황에 맞는 Probe를 선택하여 사용할 수 있습니다.
bpftrace 설치
Ubuntu에서는 다음과 같이 설치합니다.
sudo apt update
sudo apt install bpftrace
RHEL 계열
sudo dnf install bpftrace
설치 확인
bpftrace --version
사용 가능한 Probe 확인
현재 Kernel에서 사용할 수 있는 Probe 확인
sudo bpftrace -l
Tracepoint만 확인
sudo bpftrace -l 'tracepoint:*'
Kprobe 확인
sudo bpftrace -l 'kprobe:*'
가장 간단한 예제
5초마다 메시지 출력
sudo bpftrace -e '
interval:s:5
{
printf("Hello bpftrace\n");
}'
주기적으로 코드가 실행되는 것을 확인할 수 있습니다.
시스템 콜 추적
파일 열기 이벤트 추적
sudo bpftrace -e '
tracepoint:syscalls:sys_enter_openat
{
printf("%s opened file\n", comm);
}'
실행 중인 프로세스가 파일을 열 때마다 출력됩니다.
프로세스 실행 추적
새로운 프로세스 실행 확인
sudo bpftrace -e '
tracepoint:sched:sched_process_exec
{
printf("%s\n", comm);
}'
프로세스 생성 상황을 실시간으로 확인할 수 있습니다.
Kernel 함수 추적
예를 들어 tcp_sendmsg 함수 추적
sudo bpftrace -e '
kprobe:tcp_sendmsg
{
printf("TCP Send\n");
}'
TCP 송신 함수 호출 시마다 출력됩니다.
함수 호출 횟수 계산
호출 빈도를 집계할 수도 있습니다.
sudo bpftrace -e '
kprobe:tcp_sendmsg
{
@count++;
}'
종료하면
@count: 25614
처럼 결과가 출력됩니다.
히스토그램 출력
실행 시간 분포 확인
sudo bpftrace -e '
kprobe:vfs_read
{
@ = hist(pid);
}'
히스토그램 형태로 데이터를 확인할 수 있습니다.
실무에서 자주 사용하는 명령어
버전 확인
bpftrace --version
모든 Probe 확인
sudo bpftrace -l
Tracepoint 확인
sudo bpftrace -l 'tracepoint:*'
Kprobe 확인
sudo bpftrace -l 'kprobe:*'
실행 중인 eBPF 확인
sudo bpftool prog show
Kernel 버전
uname -r
bpftrace와 BCC의 차이
| 항목 | bpftrace | BCC |
|---|---|---|
| 개발 언어 | 자체 스크립트 | Python + C |
| 난이도 | 매우 쉬움 | 비교적 높음 |
| 복잡한 프로그램 | 제한적 | 가능 |
| 빠른 분석 | 매우 적합 | 적합 |
| 운영 환경 | 매우 많이 사용 | 많이 사용 |
간단한 추적은 bpftrace, 복잡한 개발은 BCC가 적합합니다.
실무 사례
운영 중인 서버에서 갑자기 CPU 사용량이 증가했다고 가정해 보겠습니다.
다음과 같이 분석할 수 있습니다.
tracepoint로 프로세스 실행 확인kprobe로 Kernel 함수 호출 분석profileProbe로 CPU 샘플링- 호출 횟수 집계
- 히스토그램으로 병목 분석
- 원인 프로세스 확인 후 최적화
복잡한 eBPF 프로그램을 작성하지 않고도 대부분의 문제를 빠르게 분석할 수 있습니다.
자주 묻는 질문
bpftrace와 eBPF는 같은 기술인가요?
아닙니다. eBPF는 Linux Kernel에서 실행되는 프로그램 기술이고, bpftrace는 eBPF 프로그램을 쉽게 작성하고 실행하기 위한 사용자 도구입니다.
bpftrace와 BCC 중 어느 것을 먼저 배우는 것이 좋나요?
처음 eBPF를 접한다면 bpftrace를 먼저 배우는 것이 좋습니다. 간단한 문법으로 다양한 추적 작업을 수행할 수 있기 때문입니다. 이후 복잡한 프로그램 개발이 필요하다면 BCC를 학습하는 것이 일반적인 순서입니다.
운영 서버에서 사용해도 안전한가요?
대부분의 추적 작업은 운영 서버에서도 사용할 수 있습니다. 다만 너무 많은 이벤트를 동시에 수집하거나 과도한 출력은 시스템 성능에 영향을 줄 수 있으므로 필요한 이벤트만 선택적으로 추적하는 것이 좋습니다.
마무리
Linux bpftrace는 eBPF를 가장 쉽고 빠르게 사용할 수 있는 대표적인 추적 도구입니다. 한 줄 명령만으로도 시스템 콜, 커널 함수, 프로세스, 파일 접근, 네트워크 이벤트 등을 실시간으로 분석할 수 있어 성능 분석과 장애 진단에 매우 유용합니다. eBPF를 처음 배우는 사용자라면 BCC보다 먼저 익혀 두면 이후의 고급 eBPF 개발도 훨씬 수월하게 이해할 수 있습니다.