Linux bpftrace란? 한 줄 명령으로 eBPF를 사용하는 강력한 추적 도구 완벽 이해

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설명
kprobeKernel 함수 시작
kretprobeKernel 함수 종료
uprobeUser 함수 시작
uretprobeUser 함수 종료
tracepointKernel 이벤트
profileCPU 샘플링
interval일정 시간마다 실행
softwareSoftware Event
hardwareHardware 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의 차이

항목bpftraceBCC
개발 언어자체 스크립트Python + C
난이도매우 쉬움비교적 높음
복잡한 프로그램제한적가능
빠른 분석매우 적합적합
운영 환경매우 많이 사용많이 사용

간단한 추적은 bpftrace, 복잡한 개발은 BCC가 적합합니다.

실무 사례

운영 중인 서버에서 갑자기 CPU 사용량이 증가했다고 가정해 보겠습니다.

다음과 같이 분석할 수 있습니다.

  1. tracepoint로 프로세스 실행 확인
  2. kprobe로 Kernel 함수 호출 분석
  3. profile Probe로 CPU 샘플링
  4. 호출 횟수 집계
  5. 히스토그램으로 병목 분석
  6. 원인 프로세스 확인 후 최적화

복잡한 eBPF 프로그램을 작성하지 않고도 대부분의 문제를 빠르게 분석할 수 있습니다.

자주 묻는 질문

bpftrace와 eBPF는 같은 기술인가요?

아닙니다. eBPF는 Linux Kernel에서 실행되는 프로그램 기술이고, bpftrace는 eBPF 프로그램을 쉽게 작성하고 실행하기 위한 사용자 도구입니다.

bpftrace와 BCC 중 어느 것을 먼저 배우는 것이 좋나요?

처음 eBPF를 접한다면 bpftrace를 먼저 배우는 것이 좋습니다. 간단한 문법으로 다양한 추적 작업을 수행할 수 있기 때문입니다. 이후 복잡한 프로그램 개발이 필요하다면 BCC를 학습하는 것이 일반적인 순서입니다.

운영 서버에서 사용해도 안전한가요?

대부분의 추적 작업은 운영 서버에서도 사용할 수 있습니다. 다만 너무 많은 이벤트를 동시에 수집하거나 과도한 출력은 시스템 성능에 영향을 줄 수 있으므로 필요한 이벤트만 선택적으로 추적하는 것이 좋습니다.

마무리

Linux bpftrace는 eBPF를 가장 쉽고 빠르게 사용할 수 있는 대표적인 추적 도구입니다. 한 줄 명령만으로도 시스템 콜, 커널 함수, 프로세스, 파일 접근, 네트워크 이벤트 등을 실시간으로 분석할 수 있어 성능 분석과 장애 진단에 매우 유용합니다. eBPF를 처음 배우는 사용자라면 BCC보다 먼저 익혀 두면 이후의 고급 eBPF 개발도 훨씬 수월하게 이해할 수 있습니다.

댓글 남기기