eBPF 프로그램은 일반적으로 프로세스가 종료되면 함께 제거됩니다. 또한 eBPF 프로그램이 사용하는 BPF Map 역시 해당 프로그램과 함께 해제되는 경우가 많습니다.
하지만 실제 운영 환경에서는 프로그램을 다시 로드하지 않고도 BPF Map을 계속 유지하거나, 여러 프로세스가 동일한 eBPF 프로그램과 Map을 공유해야 하는 경우가 자주 발생합니다.
이러한 문제를 해결하기 위해 Linux는 eBPF Pinning(Pinned Object) 기능을 제공합니다.
Pinning을 사용하면 eBPF Program이나 BPF Map을 BPF 파일 시스템(bpffs)에 고정(Pin) 하여 프로세스 종료 이후에도 계속 유지하고 다른 프로그램에서 재사용할 수 있습니다.
이번 글에서는 eBPF Pinning의 개념과 동작 원리, bpffs 구조, Program과 Map Pinning 방법, 실무 활용 사례를 자세히 알아보겠습니다.
Linux eBPF Pinning이란?
Pinning은 eBPF Program 또는 BPF Map을 bpffs(BPF File System)에 등록하여 지속적으로 유지하는 기능입니다.
기본 구조는 다음과 같습니다.
Application A
↓
BPF Program
↓
Pin
↓
bpffs (/sys/fs/bpf)
↓
Application B
↓
Reuse
Pinning을 하면 프로그램이 종료되어도 Kernel 객체는 삭제되지 않습니다.
Pinning이 필요한 이유
다음과 같은 상황을 생각해 보겠습니다.
- 프로그램이 재시작되어도 통계 데이터를 유지해야 하는 경우
- 여러 프로세스가 동일한 BPF Map을 공유해야 하는 경우
- 운영 중인 eBPF 프로그램을 재사용해야 하는 경우
- 시스템 재구성 없이 새로운 애플리케이션이 기존 Map에 접근해야 하는 경우
Pinning은 이러한 환경에서 매우 유용합니다.
bpffs(BPF File System)란?
Pinning은 bpffs(BPF File System) 를 이용합니다.
기본 위치는 다음과 같습니다.
/sys/fs/bpf
구조 예시
/sys/fs/bpf
├── xdp_prog
├── counter_map
├── firewall
└── trace_event
여기 저장된 객체는 Kernel이 관리합니다.
bpffs 마운트 확인
현재 bpffs가 마운트되어 있는지 확인합니다.
mount | grep bpf
출력 예시
bpffs on /sys/fs/bpf type bpf
마운트되어 있지 않다면
sudo mount -t bpf bpf /sys/fs/bpf
명령으로 마운트할 수 있습니다.
Program Pinning
Program을 Pin합니다.
sudo bpftool prog pin id 15 /sys/fs/bpf/xdp_prog
이후
/sys/fs/bpf/xdp_prog
경로에 Program이 저장됩니다.
Program 재사용
Pinned Program 확인
sudo bpftool prog show pinned /sys/fs/bpf/xdp_prog
다른 애플리케이션도 동일한 Program을 사용할 수 있습니다.
Map Pinning
Map도 동일하게 Pin할 수 있습니다.
sudo bpftool map pin id 8 /sys/fs/bpf/counter_map
이후 Map은 계속 유지됩니다.
Map 재사용
Pinned Map 확인
sudo bpftool map show pinned /sys/fs/bpf/counter_map
User Space 프로그램에서도 동일한 Map을 열 수 있습니다.
Pin 해제(Unpin)
Pin 파일을 삭제하면 참조가 제거됩니다.
sudo rm /sys/fs/bpf/counter_map
주의할 점은 파일이 삭제되더라도 다른 프로세스가 해당 객체를 사용 중이라면 즉시 제거되지 않을 수 있습니다.
모든 참조가 해제되면 Kernel이 객체를 정리합니다.
libbpf에서 Pinning
libbpf에서는 Pin Path를 지정할 수 있습니다.
예를 들어
bpf_map__set_pin_path(map,
"/sys/fs/bpf/counter_map");
Program도 동일한 방식으로 Pin할 수 있습니다.
Pinning의 장점
Pinning을 사용하면 다음과 같은 장점이 있습니다.
- 프로그램 재시작 후에도 Map 유지
- 여러 애플리케이션에서 공유 가능
- 운영 중 데이터 유지
- 빠른 재사용
- Loader와 독립적인 관리 가능
- 유지보수 편리
운영 환경에서는 거의 필수적으로 사용하는 기능입니다.
Pinning 사용 시 주의사항
Pinning은 매우 편리하지만 관리가 필요합니다.
주의할 점은 다음과 같습니다.
- 불필요한 Pin 객체는 삭제
- 파일 이름 중복 방지
- 접근 권한 관리
- bpffs 용량 관리
- 사용하지 않는 Program 정리
오래된 Pinned 객체가 누적되면 관리가 어려워질 수 있습니다.
Pinning과 일반 로드의 차이
| 항목 | 일반 로드 | Pinning |
|---|---|---|
| 프로그램 종료 시 제거 | O | X |
| Map 유지 | X | O |
| 재사용 | 어려움 | 매우 쉬움 |
| 여러 프로세스 공유 | 제한적 | 가능 |
| 운영 환경 | 불편 | 권장 |
Pinning은 장기간 실행되는 서비스에서 큰 장점을 제공합니다.
실무에서 자주 사용하는 명령어
bpffs 확인
mount | grep bpf
Program Pin
sudo bpftool prog pin id 15 /sys/fs/bpf/demo_prog
Map Pin
sudo bpftool map pin id 8 /sys/fs/bpf/demo_map
Pinned Program 확인
sudo bpftool prog show pinned /sys/fs/bpf/demo_prog
Pinned Map 확인
sudo bpftool map show pinned /sys/fs/bpf/demo_map
bpffs 목록 확인
ls -l /sys/fs/bpf
실무 사례
예를 들어 Kubernetes 클러스터에서 eBPF 기반 네트워크 정책을 관리한다고 가정해 보겠습니다.
다음과 같은 방식으로 Pinning을 활용할 수 있습니다.
- XDP Program을
/sys/fs/bpf/xdp_firewall에 Pin - 접속 통계 Hash Map을
/sys/fs/bpf/ip_counter에 Pin - 관리 프로그램이 종료되어도 Program과 Map 유지
- 새로운 관리 프로세스가 기존 Map을 열어 통계 확인
- 서비스 중단 없이 정책 변경 및 모니터링 수행
이처럼 Pinning을 사용하면 eBPF 객체를 장기간 유지하고 여러 애플리케이션에서 안전하게 공유할 수 있습니다.
자주 묻는 질문
Pinning을 하면 시스템을 재부팅해도 객체가 유지되나요?
아닙니다. Pinning은 프로세스 종료 후에도 객체를 유지하게 해주지만, 메모리에 존재하는 Kernel 객체이므로 일반적으로 시스템을 재부팅하면 사라집니다. 재부팅 후에는 다시 로드하고 Pin해야 합니다.
Pinning은 Program과 Map 모두 가능한가요?
네. eBPF Program뿐 아니라 대부분의 BPF Map도 Pinning을 지원합니다. 운영 환경에서는 Map을 Pin하여 여러 프로그램이 데이터를 공유하는 경우가 많습니다.
bpffs를 반드시 사용해야 하나요?
네. Linux에서는 Pinning 기능을 위해 bpffs(BPF File System)를 사용합니다. 일반 파일 시스템이 아니라 커널이 관리하는 특수 파일 시스템입니다.
마무리
Linux eBPF Pinning은 Program과 BPF Map을 bpffs에 고정하여 프로세스 종료 이후에도 유지하고 재사용할 수 있도록 하는 핵심 기능입니다. 여러 애플리케이션이 동일한 객체를 공유할 수 있어 운영 환경에서 매우 유용하며, 장기 실행 서비스와 컨테이너 환경에서도 널리 활용됩니다. eBPF 기반 시스템을 설계한다면 Pinning은 반드시 익혀야 할 중요한 기술입니다.