eBPF는 Linux Kernel 내부에서 다양한 작업을 수행할 수 있는 강력한 기술이지만, 처음부터 C 언어로 eBPF 프로그램을 작성하고 컴파일하여 로드하는 과정은 상당히 복잡합니다.
이러한 어려움을 해결하기 위해 등장한 것이 BCC(BPF Compiler Collection) 입니다.
BCC는 eBPF 프로그램을 쉽게 작성하고 실행할 수 있도록 다양한 라이브러리와 도구를 제공하는 프로젝트입니다. Python이나 Lua 같은 고수준 언어와 함께 사용할 수 있어 eBPF 입문자뿐 아니라 운영 환경에서도 널리 활용되고 있습니다.
이번 글에서는 BCC의 개념과 구조, 주요 도구, 설치 방법, 사용 예제, 그리고 실무 활용 사례를 자세히 알아보겠습니다.
Linux BCC란?
BCC(BPF Compiler Collection)는 eBPF 프로그램을 손쉽게 개발하고 실행하기 위한 오픈소스 프레임워크입니다.
기본 구조는 다음과 같습니다.
Python Program
↓
BCC Library
↓
LLVM / Clang
↓
eBPF Bytecode
↓
Linux Kernel
개발자는 복잡한 시스템 호출을 직접 구현하지 않고도 eBPF 프로그램을 실행할 수 있습니다.
BCC가 필요한 이유
순수 eBPF 개발은 다음과 같은 과정을 거칩니다.
- C 코드 작성
- LLVM 컴파일
- eBPF Bytecode 생성
- Kernel 로드
- BPF Map 생성
- 이벤트 처리
반면 BCC를 사용하면 대부분의 과정을 자동으로 처리해 줍니다.
따라서 개발자는 eBPF 로직 작성에만 집중할 수 있습니다.
BCC의 동작 원리
전체 흐름은 다음과 같습니다.
Python Script
↓
BCC API
↓
Clang 컴파일
↓
Verifier 검사
↓
Kernel 로드
↓
eBPF 실행
BCC가 컴파일과 로딩 과정을 자동으로 수행합니다.
BCC의 주요 구성 요소
BCC는 크게 다음 요소로 구성됩니다.
| 구성 요소 | 설명 |
|---|---|
| Python API | Python에서 eBPF 제어 |
| Lua API | Lua 지원 |
| C Frontend | eBPF C 코드 |
| LLVM/Clang | 컴파일러 |
| Kernel Loader | eBPF 로드 |
| Helper Library | 다양한 유틸리티 제공 |
Python API가 가장 널리 사용됩니다.
BCC 설치
Ubuntu에서는 다음과 같이 설치할 수 있습니다.
sudo apt update
sudo apt install bpfcc-tools
sudo apt install python3-bpfcc
RHEL 계열에서는
sudo dnf install bcc-tools
를 사용할 수 있습니다.
설치 확인
설치가 완료되면 다음 명령으로 확인합니다.
which execsnoop
또는
which opensnoop
정상 설치되었다면 실행 파일 위치가 출력됩니다.
대표적인 BCC 도구
BCC에는 매우 다양한 분석 도구가 포함되어 있습니다.
| 도구 | 설명 |
|---|---|
| execsnoop | 실행되는 프로세스 추적 |
| opensnoop | 파일 열기 추적 |
| biosnoop | 디스크 I/O 추적 |
| tcpconnect | TCP 연결 추적 |
| tcptracer | TCP 세션 추적 |
| filetop | 파일 사용량 분석 |
| runqlat | 스케줄러 지연 분석 |
| profile | CPU 프로파일링 |
운영 서버에서도 자주 활용됩니다.
execsnoop 사용
프로세스 실행을 추적합니다.
sudo execsnoop
출력 예시
PID COMM
1234 bash
2345 nginx
3456 python
새로운 프로세스가 실행될 때마다 표시됩니다.
opensnoop 사용
파일 접근을 추적합니다.
sudo opensnoop
출력 예시
PID
COMM
FILE
1234
nginx
/etc/nginx/nginx.conf
어떤 프로세스가 어떤 파일을 여는지 확인할 수 있습니다.
biosnoop 사용
디스크 I/O 분석
sudo biosnoop
예시
TIME
PID
DISK
LAT(ms)
디스크 지연 시간을 분석할 수 있습니다.
tcpconnect 사용
TCP 연결 추적
sudo tcpconnect
출력 예시
PID
COMM
SADDR
DADDR
현재 생성되는 TCP 연결을 실시간으로 확인합니다.
BCC 프로그램 예제
Python에서 간단한 eBPF 프로그램을 실행하는 예시입니다.
from bcc import BPF
program = """
int hello(void *ctx) {
bpf_trace_printk("Hello eBPF\\n");
return 0;
}
"""
b = BPF(text=program)
Python 코드에서 직접 eBPF 프로그램을 정의하고 실행할 수 있습니다.
실무에서 자주 사용하는 명령어
BCC 도구 설치 확인
which execsnoop
프로세스 추적
sudo execsnoop
파일 추적
sudo opensnoop
디스크 분석
sudo biosnoop
TCP 연결 분석
sudo tcpconnect
CPU 분석
sudo profile
설치 패키지 확인
dpkg -l | grep bpfcc
실무 사례
예를 들어 운영 중인 웹 서버에서 갑자기 응답 속도가 느려졌다고 가정해 보겠습니다.
다음과 같은 절차로 분석할 수 있습니다.
execsnoop으로 비정상 프로세스 실행 여부 확인opensnoop으로 과도한 파일 접근 확인biosnoop으로 디스크 지연 분석tcpconnect로 비정상 네트워크 연결 확인profile로 CPU 사용량 분석- 병목 원인을 확인하고 최적화
별도의 커널 수정 없이도 실시간으로 문제를 분석할 수 있다는 것이 BCC의 큰 장점입니다.
자주 묻는 질문
BCC와 eBPF는 같은 기술인가요?
아닙니다. eBPF는 Linux Kernel에서 실행되는 기술이고, BCC는 eBPF 프로그램을 쉽게 작성하고 실행할 수 있도록 지원하는 개발 프레임워크입니다.
BCC와 bpftrace의 차이는 무엇인가요?
BCC는 Python과 C를 기반으로 복잡한 eBPF 프로그램을 개발하는 데 적합합니다. 반면 bpftrace는 간단한 한 줄 명령으로 추적 작업을 수행할 수 있어 빠른 분석과 디버깅에 유리합니다.
BCC는 운영 서버에서도 사용할 수 있나요?
가능합니다. 필요한 도구만 실행하면 성능에 미치는 영향이 크지 않아 운영 환경에서도 성능 분석과 장애 진단에 널리 사용됩니다.
마무리
BCC(BPF Compiler Collection)는 eBPF 프로그램을 보다 쉽고 효율적으로 개발할 수 있도록 지원하는 강력한 프레임워크입니다. 다양한 내장 도구를 통해 프로세스, 파일, 디스크, 네트워크, CPU를 실시간으로 분석할 수 있으며, 운영 서버의 성능 문제와 장애 원인을 빠르게 파악하는 데 큰 도움이 됩니다. eBPF를 본격적으로 활용하려는 개발자와 시스템 엔지니어라면 반드시 익혀야 할 핵심 도구입니다.