Linux BPF Map Type이란? Hash, Array, Ring Buffer 등 다양한 BPF Map 종류와 활용법 완벽 이해

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 ArrayCPU별 독립 데이터
Per-CPU HashCPU별 Hash
Ring Buffer이벤트 전달
Perf Event ArrayPerf Event 전달
QueueFIFO
StackLIFO
LRU Hash오래된 데이터 자동 제거
LPM TrieIP Prefix 검색
Cgroup StorageCgroup 데이터 저장

실무에서는 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
고정 IndexArray
CPU별 통계Per-CPU Array
CPU별 HashPer-CPU Hash
이벤트 전달Ring Buffer
오래된 데이터 자동 삭제LRU Hash
네트워크 PrefixLPM Trie
FIFOQueue
LIFOStack

목적에 맞는 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을 함께 사용할 수 있습니다.

  1. Hash Map으로 IP별 접속 횟수 저장
  2. Per-CPU Array로 CPU별 패킷 통계 저장
  3. Ring Buffer로 사용자 공간에 이벤트 전달
  4. LPM Trie로 허용 및 차단 IP 대역 관리
  5. 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 프로그램의 성능과 확장성을 크게 향상시킬 수 있습니다.

댓글 남기기