--- title: bpftrace — eBPF 기반 추적 스크립트 date: 2026-10-18 time: 12:00 model: admin category: programs author_type: human summary: eBPF로 커널·유저스페이스 이벤트를 실시간 추적합니다. DTrace·SystemTap에 대응합니다. tags: 프로그램, 장애 진단 및 복구, bpftrace --- **💬 "bpftrace 명령어"** bpftrace는 **eBPF 기반 추적 스크립트** eBPF로 커널·유저스페이스 이벤트를 실시간 추적합니다. DTrace·SystemTap에 대응합니다. 커널 함수·시스템콜·유저스페이스 프로브를 지원합니다. 단일 명령으로 집계·분포·이벤트 추적을 수행합니다. - **개념**: 커널 함수·시스템콜·유저스페이스 프로브를 지원합니다. - **주요 기능**: 단일 명령으로 집계·분포·이벤트 추적을 수행합니다. - **장점**: DTrace 문법과 유사합니다 (oneliner 위주). - **활용**: 프로덕션 서버에 안전합니다 (오버헤드 극소). ## 설치 및 다운로드 bpftrace는 패키지 매니저 또는 공식 스크립트로 설치합니다. | 환경 | 명령 | | --- | --- | | Ubuntu 22.04+ | sudo apt install bpftrace | | RHEL 9+ | sudo dnf install bpftrace | | Arch | sudo pacman -S bpftrace | | 소스 빌드 | github.com/bpftrace/bpftrace | | 확인 | bpftrace --version | 설치 확인은 `bpftrace --version`으로 합니다. ## 자주 쓰는 옵션 | 옵션 | 설명 | | --- | --- | | bpftrace -e '' | 인라인 스크립트를 실행합니다 | | bpftrace | 파일에서 스크립트를 실행합니다 | | -l | 사용 가능한 프로브 목록 | | BEGIN { } | 시작 시 실행 (초기화) | | END { } | 종료 시 실행 (집계 출력) | ## 필수 명령어 조합 3가지 - `bpftrace -e 'tracepoint:syscalls:sys_enter_openat { @[comm] = count(); }'` — 프로세스별 open 호출 집계 - `bpftrace -e 'kprobe:do_sys_openat2 { @[probe] = count(); }'` — 커널 프로브 집계 - `bpftrace -l 'tracepoint:syscalls:*'` — 사용 가능한 프로브 확인 **💬 "실제 서버에서 bpftrace를 사용하는 예시를 보여줘"** 실제 운영 중인 서버에서 자주 만나는 상황을 순서대로 정리했습니다. ### 1단계 · 설치 확인 설치 여부를 확인합니다. ``` bpftrace --version || sudo apt install -y bpftrace ``` ### 2단계 · 프로브 확인 사용 가능한 프로브를 확인합니다. ``` sudo bpftrace -l 'tracepoint:syscalls:sys_enter_openat' ``` ### 3단계 · 추적 실행 프로세스별 open 호출을 집계합니다. ``` sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { @[comm] = count(); }' ``` ## 실제 실행 화면 bpftrace로 프로세스별 open 호출을 집계한 결과입니다. ![bpftrace 명령어 실행 결과](https://games.cursorai.co.kr/assets/bpftrace-demo.png) 실제 운영 중인 서버 ## 실무에서는 이렇게 씁니다 ### 1. I/O 병목 추적 **상황** — 디스크 I/O가 느려진 원인을 찾습니다. ``` sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { @[comm] = count(); }' ``` **결과** — postgres가 2891회로 가장 많습니다. **포인트** — 프로세스별 open 호출 횟수로 병목을 찾습니다. ### 2. 파일별 분석 **상황** — 특정 프로세스가 어떤 파일을 자주 여는지 봅니다. ``` sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat /comm == "postgres"/ { @[str(args->filename)] = count(); }' ``` **결과** — base/16384/1259 파일이 1024회로 가장 많습니다. **포인트** — DB 파일 접근 패턴을 분석할 수 있습니다. ## 실제 실행 화면 bpftrace로 파일별 open 호출을 분석한 결과입니다. ![bpftrace 명령어 실행 결과 2](https://games.cursorai.co.kr/assets/bpftrace-demo2.png) 실제 운영 중인 서버 ## 주의할 점 - bpftrace는 루트 권한이 필요하며 커널 버전에 따라 사용 가능한 프로브가 다릅니다. - 과도한 프로브는 커널 오버헤드를 유발합니다. 프로덕션에서는 샘플링 간격을 조정합니다. - 상용 커널에서는 BTF(BPF Type Format) 지원이 필요합니다. --- 원문(HTML): https://games.cursorai.co.kr/programs/linux/troubleshooting/bpftrace.html