eBPF 프로그램은 커널 내부에서 실행되지만, 프로그램 자체에는 큰 데이터를 저장하거나 상태를 유지할 수 있는 공간이 거의 없습니다. 또한 여러 eBPF 프로그램이 데이터를 공유하거나 사용자 공간(User Space)과 정보를 교환하기 위해서는 별도의 저장 공간이 필요합니다.
이 역할을 담당하는 것이 BPF Map입니다.
하지만 BPF Map은 하나의 종류만 존재하는 것이 아닙니다. 저장 방식과 목적에 따라 Hash Map, Array Map, Ring Buffer, Queue, Stack, LRU Hash 등 다양한 Map Type이 제공됩니다.
적절한 Map Type을 선택하는 것은 eBPF 프로그램의 성능과 메모리 사용량에 큰 영향을 미칩니다.
이번 글에서는 BPF Map Type의 개념과 종류, 특징, 사용 목적, 실무 활용 사례를 자세히 알아보겠습니다.
Linux BPF Map이란?
BPF Map은 eBPF 프로그램과 사용자 공간이 함께 사용하는 커널 메모리 기반 데이터 저장소입니다.
기본 구조는 다음과 같습니다.
User Space
↓
BPF Map
↑
eBPF Program
여러 eBPF 프로그램이 동일한 Map을 공유할 수도 있으며, User Space에서도 자유롭게 데이터를 읽고 수정할 수 있습니다.
BPF Map Type이 필요한 이유
모든 데이터를 하나의 형태로 저장하면 비효율이 발생합니다.
예를 들어
- 사용자 정보 저장
- CPU 통계 저장
- 이벤트 전달
- FIFO 처리
- LIFO 처리
는 각각 가장 적합한 자료구조가 다릅니다.
Linux Kernel은 이러한 상황에 맞게 다양한 Map Type을 제공합니다.
대표적인 BPF Map Type
| Map Type | 용도 |
|---|---|
| Hash | 일반 Key-Value 저장 |
| Array | 고정 인덱스 저장 |
| Per-CPU Array | CPU별 독립 데이터 |
| Per-CPU Hash | CPU별 Hash |
| Ring Buffer | 이벤트 전달 |
| Perf Event Array | Perf Event 전달 |
| Queue | FIFO |
| Stack | LIFO |
| LRU Hash | 오래된 데이터 자동 제거 |
| LPM Trie | IP Prefix 검색 |
| Cgroup Storage | Cgroup 데이터 저장 |
실무에서는 Hash와 Array가 가장 많이 사용됩니다.
Hash Map
가장 많이 사용하는 Map입니다.
Key
↓
Hash
↓
Value
예시
PID
↓
Count
사용 예
- 프로세스 통계
- IP 접속 횟수
- 파일 접근 횟수
대표 Helper
bpf_map_lookup_elem()
bpf_map_update_elem()
Array Map
Array는 Index 기반 저장 방식입니다.
0
1
2
3
↓
Value
특징
- 매우 빠름
- 크기 고정
- Index 접근
사용 예
- CPU 통계
- 상태 저장
- Counter
Per-CPU Array
CPU마다 독립된 Array를 가집니다.
CPU0
↓
Array
----------------
CPU1
↓
Array
Lock 경쟁이 거의 없어 매우 빠른 성능을 제공합니다.
사용 예
- CPU별 패킷 수
- CPU별 이벤트
- 통계 수집
Per-CPU Hash
Hash도 CPU별 독립 저장이 가능합니다.
장점
- Lock 최소화
- 병렬 처리 향상
- Cache 효율 증가
멀티코어 환경에서 많이 사용됩니다.
Ring Buffer
Ring Buffer는 이벤트 전달용 Map입니다.
Kernel
↓
Ring Buffer
↓
User Space
실시간 이벤트 전달에 가장 많이 사용됩니다.
사용 예
- Process Event
- TCP Event
- XDP Event
Perf Event Array
Ring Buffer 이전의 이벤트 전달 방식입니다.
CPU
↓
Perf Buffer
↓
Application
기존 BCC 기반 프로젝트에서 많이 사용됩니다.
Queue
Queue는 FIFO(First In First Out) 구조입니다.
Push
↓
Queue
↓
Pop
먼저 들어온 데이터가 먼저 나갑니다.
사용 예
- 작업 대기열
- 이벤트 순차 처리
Stack
Stack은 LIFO(Last In First Out) 구조입니다.
Push
↓
Stack
↓
Pop
가장 최근 데이터가 먼저 반환됩니다.
LRU Hash
LRU(Hash Least Recently Used)는 오래 사용하지 않은 데이터를 자동으로 제거합니다.
Hash
↓
Full
↓
Old Entry Delete
↓
New Entry Insert
메모리가 제한된 환경에서 매우 유용합니다.
사용 예
- IP Cache
- Session Cache
- Connection Tracking
LPM Trie
LPM(Longest Prefix Match) Trie는 네트워크 주소 검색에 사용됩니다.
예를 들어
192.168.0.0/16
↓
Match
대표 사용처
- 방화벽
- 라우팅
- ACL
- XDP 필터
CIDR 기반 네트워크 검색을 매우 빠르게 수행할 수 있습니다.
Cgroup Storage
Cgroup별 데이터를 저장합니다.
사용 예
- Container 통계
- Resource 사용량
- Kubernetes 모니터링
컨테이너 환경에서 활용도가 높습니다.
Map Type 선택 기준
| 상황 | 추천 Map |
|---|---|
| 일반 저장 | Hash |
| 고정 Index | Array |
| CPU별 통계 | Per-CPU Array |
| CPU별 Hash | Per-CPU Hash |
| 이벤트 전달 | Ring Buffer |
| 오래된 데이터 자동 삭제 | LRU Hash |
| 네트워크 Prefix | LPM Trie |
| FIFO | Queue |
| LIFO | Stack |
목적에 맞는 Map Type을 선택하는 것이 중요합니다.
Map Type 확인
현재 생성된 Map을 확인하려면 다음 명령어를 사용합니다.
sudo bpftool map show
특정 Map의 상세 정보 확인
sudo bpftool map show id 10
Kernel이 지원하는 Map Type 확인
sudo bpftool feature
실무에서 자주 사용하는 명령어
Kernel 버전 확인
uname -r
Map 목록 확인
sudo bpftool map show
Map 데이터 출력
sudo bpftool map dump id 10
Program 확인
sudo bpftool prog show
Kernel 기능 확인
sudo bpftool feature
BTF 확인
sudo bpftool btf show
실무 사례
예를 들어 데이터센터에서 네트워크 트래픽을 실시간 분석하는 eBPF 프로그램을 개발한다고 가정해 보겠습니다.
다음과 같이 여러 Map Type을 함께 사용할 수 있습니다.
- Hash Map으로 IP별 접속 횟수 저장
- Per-CPU Array로 CPU별 패킷 통계 저장
- Ring Buffer로 사용자 공간에 이벤트 전달
- LPM Trie로 허용 및 차단 IP 대역 관리
- LRU Hash로 오래된 세션 정보 자동 제거
이처럼 하나의 eBPF 애플리케이션에서도 여러 종류의 Map을 조합하여 사용하면 성능과 효율성을 크게 높일 수 있습니다.
자주 묻는 질문
가장 많이 사용하는 BPF Map Type은 무엇인가요?
Hash Map이 가장 널리 사용됩니다. Key-Value 구조로 다양한 데이터를 저장할 수 있으며, 대부분의 eBPF 프로젝트에서 기본적으로 활용됩니다.
Ring Buffer도 BPF Map인가요?
네. Ring Buffer는 이벤트 전달을 목적으로 하는 특별한 형태의 BPF Map입니다. 일반 데이터를 저장하기보다는 커널과 사용자 공간 사이의 실시간 데이터 전송에 사용됩니다.
Per-CPU Map은 언제 사용하는 것이 좋나요?
CPU별 통계를 독립적으로 관리하거나 Lock 경쟁을 줄여 높은 성능이 필요한 환경에서 사용하는 것이 좋습니다. 네트워크 패킷 처리나 성능 모니터링에서 자주 활용됩니다.
마무리
Linux BPF Map Type은 eBPF 프로그램이 데이터를 저장하고 공유하는 핵심 메커니즘입니다. Hash, Array, Ring Buffer, LRU Hash, LPM Trie 등 다양한 자료구조를 제공하여 목적에 맞는 최적의 저장 방식을 선택할 수 있습니다. 각 Map Type의 특징을 이해하고 적절하게 활용하면 eBPF 프로그램의 성능과 확장성을 크게 향상시킬 수 있습니다.