topics eBPF eBPF란 무엇인가요?
IBM Instana Observability 살펴보기
운영 체제 활동을 나타내는 추상적 디자인
eBPF란 무엇인가요?

확장 버클리 패킷 필터(eBPF)는 개발자가 Linux 운영 체제(OS) 커널 공간에서 직접 실행되는 효율적이고 안전하며 비침입적인 프로그램을 작성할 수 있도록 지원하는 프로그래밍 기술입니다.

샌드박스가 적용된 프로그램을 OS 커널과 같은 권한 있는 컨텍스트에서 실행할 수 있기 때문에, eBPF는 커널 소스 코드를 수정하거나 커널 모듈을 로드하거나 전체 프로그램 실행을 방해하지 않고 런타임에 기존 소프트웨어의 기능을 확장할 수 있습니다. eBPF 기술은 사용자 공간 프로그램에서 네트워크 패킷을 선택하고 분석하는 간단한 방법을 제공했던 최초의 버클리 패킷 필터(BPF)의 발전된 형태입니다. 하지만 패킷 필터링 외에도 BPF 프로그램은 커널 내에서 더 복잡한 작업을 처리할 수 있는 유연성이 부족했습니다.

Linux 커뮤니티는 더욱 다양한 기술의 필요성을 인식하여 BPF의 백엔드 기능을 기반으로 하지만 커널 내 프로그래밍 기능을 확장한 eBPF를 개발했습니다. 개발자는 eBPF 프로그램의 고급 기능을 통해 온사이트 데이터 센터와 클라우드 네이티브 환경 모두에서 향상된 패킷 필터링 프로세스를 구현하고, 고급 성능 분석을 수행하며, 방화벽 및 디버깅 프로토콜을 설치할 수 있습니다.

eBPF 기술이 발전함에 따라 소프트웨어 개발자는 모든 운영 체제로 애플리케이션을 확장하여 Linux 기반이 아닌 플랫폼에서도 eBPF의 정교한 추적, 네트워킹 및 모니터링 기능을 활용할 수 있도록 해야 했습니다.1 실제로 Google, Meta, Netflix, Microsoft, Intel, Isovalent 등이 회원사로 있는 Linux Foundation이 확장되어 설립된 eBPF Foundation은 eBPF 프로그램의 OS 호환성 확장에 많은 투자를 하고 있으며, 궁극적으로 eBPF 프로그래밍의 유용성을 확대할 수 있기를 기대하고 있습니다.2

Instana 데모 요청하기

IBM Instana Observability 데모를 통해 몇 분 만에 Full Stack Observability 및 모니터링을 달성하는 방법을 알아보세요.

관련 내용

IBM 뉴스레터 구독하기

eBPF 프로그램의 구성 요소

eBPF 프로그램의 주요 구성 요소는 다음과 같습니다.

eBPF 바이트코드

eBPF 프로그램은 처음에 제한된 C 하위 집합으로 작성된 다음, Clang과 같은 프런트엔드 프로그래밍 언어를 위한 eBPF의 백엔드 아키텍처 역할을 하는 LLVM과 같은 툴을 사용하여 eBPF 바이트코드로 컴파일됩니다. 바이트코드는 기본적으로 eBPF 명령어 세트 아키텍처를 준수하고 런타임 오류를 방지하는 제한된 명령어 세트입니다.

eBPF 인터프리터/JIT 컴파일러

Linux 커널 기술은 eBPF 바이트코드를 실행 가능한 동작으로 변환할 수 있지만, JIT(Just-In-Time) 컴파일러가 더 뛰어난 성능을 제공합니다. JIT 컴파일러는 바이트코드를 특정 하드웨어 플랫폼을 위한 기본 기계어로 즉시 변환할 수 있습니다. 

사용자 공간 로더

사용자 공간 로더는 eBPF 바이트코드를 커널에 로드하고 이를 적절한 후크에 연결하여 관련 eBPF 맵을 관리하는 사용자 공간의 프로그램입니다. 사용자 공간 로더의 예로는 BPF 컴파일러 컬렉션(BCC) 및 bpftrace와 같은 툴이 있습니다.   

eBPF 맵

eBPF 맵은 키-값 쌍과 읽기-쓰기 액세스가 있는 데이터 구조로, 공유 저장 공간을 제공하고 eBPF 커널 프로그램과 사용자 공간 애플리케이션 간의 상호 작용을 용이하게 합니다. 시스템 호출을 사용하여 생성 및 관리되는 eBPF 맵은 eBPF 프로그램의 여러 반복 작업 사이에 상태를 유지하는 데에도 사용할 수 있습니다.

eBPF 베리파이어

eBPF 시스템의 핵심 구성 요소인 베리파이어는 바이트코드가 커널에 로드되기 전에 이를 검사하여 프로그램에 무한 루프, 불법 명령어 또는 범위를 벗어난 메모리 액세스와 같은 유해한 연산이 포함되지 않도록 합니다. 또한 프로그램의 모든 데이터 경로가 성공적으로 종료되도록 보장합니다.

eBPF 후크

후크는 커널 코드에서 eBPF 프로그램을 연결할 수 있는 지점을 말합니다. 커널이 후크에 도달하면 연결된 eBPF 프로그램을 실행합니다.

추적점, kprobe 및 네트워크 패킷 수신 대기열과 같은 다양한 유형의 후크는 eBPF 프로그램에 광범위한 데이터 접근성을 제공하며 다양한 작업을 수행할 수 있도록 합니다. 예를 들어 추적점을 사용하면 프로그램이 커널이나 기타 프로세스에 대한 데이터를 검사하고 수집할 수 있으며, 트래픽 제어 후크를 사용하면 네트워크 패킷을 검사하고 수정할 수 있습니다.

헬퍼 함수

eBPF는 임의의 함수를 생성할 수 없고 가능한 모든 커널 버전과의 호환성을 유지해야 하므로, 때로는 기본 eBPF 명령어 세트가 고급 연산을 수행하기에는 충분히 섬세하지 못한 경우가 있습니다. 헬퍼 함수는 이러한 격차를 해소합니다.

헬퍼 함수는 eBPF가 시스템 내에서 호출할 수 있는 사전 정의된 API 기반 커널 함수의 집합으로, 명령어 집합에서 직접 지원하지 않는 더 복잡한 작업(예: 현재 시간 및 날짜 가져오기 또는 난수 생성)을 eBPF 프로그램이 수행할 수 있는 방법을 제공합니다.  

eBPF는 어떻게 작동하나요?

일반적으로 eBPF는 Linux 커널 내부에서 가상 머신(VM)으로 작동하며, 저수준 명령어 집합 아키텍처에서 작동하고 eBPF 바이트코드를 실행합니다. 그러나 eBPF 프로그램을 실행하는 복잡한 프로세스는 몇 가지 주요 단계를 따르는 경향이 있습니다.

개발자는 먼저 eBPF 프로그램을 작성하고 바이트코드를 컴파일합니다. 프로그램의 목적에 따라 적절한 유형의 코드가 결정됩니다. 예를 들어 팀에서 CPU 사용량을 모니터링하려는 경우, 사용량 메트릭을 캡처하는 기능이 포함된 코드를 작성합니다.

eBPF 컴파일러가 상위 수준 C 코드를 하위 수준 바이트코드로 변환하면, 사용자 공간 로더는 BPF 시스템 호출을 생성하여 프로그램을 커널에 로드합니다. 로더는 오류를 해결하고 프로그램에 필요한 eBPF 맵을 설정하는 역할도 담당합니다.

프로그램 바이트코드와 맵이 준비되면 eBPF는 프로그램이 커널에서 실행하기에 안전한지 확인하기 위해 검증 프로세스를 실행합니다. 안전하지 않다고 판단되면 프로그램을 로드하는 시스템 호출이 실패하고, 로더 프로그램은 오류 메시지를 받게 됩니다. 프로그램이 검증을 통과하면 실행이 허용됩니다.

eBPF는 인터프리터나 JIT 컴파일러를 사용하여 바이트코드를 실행 가능한 기계어로 변환합니다. 그러나 eBPF는 이벤트 기반 기술이기 때문에 커널 내의 특정 후크 지점이나 이벤트(예: 시스템 호출, 네트워크 이벤트, 프로세스 시작, CPU 유휴 상태 등)에 대한 응답으로만 실행됩니다. 이벤트가 발생하면 eBPF는 해당 바이트코드 프로그램을 실행하여 개발자가 시스템의 다양한 구성 요소를 검사하고 조작할 수 있도록 합니다.

eBPF 프로그램이 실행되면 개발자는 eBPF 맵을 사용하여 사용자 공간에서 프로그램과 상호 작용할 수 있습니다. 예를 들어, 애플리케이션은 주기적으로 맵을 확인하여 eBPF 프로그램에서 데이터를 수집하거나 맵을 업데이트하여 프로그램의 동작을 변경할 수 있습니다.

프로그램 언로드는 대부분의 eBPF 실행 프로세스의 마지막 단계입니다. eBPF가 작업을 완료하면 로더는 BPF 시스템 호출을 다시 사용하여 커널에서 언로드할 수 있습니다. 이때 eBPF는 실행을 중지하고 관련 리소스를 비웁니다. 언로드 프로세스에는 팀에서 더 이상 필요하지 않은 eBPF 맵을 반복하여 유용한 개별 요소를 확보한 다음 맵 자체를 삭제('delete' syscall 사용)하는 작업도 포함될 수 있습니다.

eBPF 사용 사례 및 이점

eBPF 기술은 이미 최신 Linux 시스템의 초석이 되어 Linux 커널을 세밀하게 제어하고 기업이 Linux 에코시스템 내에서 더욱 혁신적인 솔루션을 구축할 수 있도록 지원하고 있습니다.

eBPF는 다음과 같은 분야의 발전을 촉진했습니다. 

네트워킹

개발자는 eBPF를 통해 더욱 빠르고 맞춤화된 패킷 처리 기능, 로드 밸런싱 프로세스, 애플리케이션 프로파일링 스크립트 및 네트워크 모니터링 관행을 구현할 수 있습니다. Cilium과 같은 오픈 소스 플랫폼은 eBPF를 활용하여 Kubernetes 클러스터와 워크로드, 기타 컨테이너화된 마이크로서비스를 위한 안전하고 확장 가능한 네트워킹을 제공합니다. 또한, 커널 수준의 패키지 포워딩 로직을 활용함으로써 eBPF는 라우팅 프로세스를 간소화하고 전반적인 네트워크 응답 속도를 높일 수 있습니다.

관측성

개발자는 eBPF를 통해 커널 및 사용자 공간 애플리케이션을 계측하여 시스템 성능에 큰 영향을 주지 않으면서 상세한 성능 데이터와 메트릭을 수집할 수 있습니다. 이러한 기능을 통해 조직은 실시간 모니터링 및 관측 가능성을 확보해 앞서 나갈 수 있습니다.

보안

eBPF는 시스템 호출, 네트워크 트래픽, 시스템 동작을 모니터링하여 잠재적인 보안 위협을 실시간으로 감지하고 대응할 수 있습니다. 예를 들어, Falco와 같은 IT 솔루션은 eBPF를 사용하여 런타임 보안 감사 및 인시던트 대응을 구현해 시스템의 전반적인 보안을 강화합니다.

성능 튜닝

eBPF는 시스템 호출을 추적하고, CPU 사용률을 모니터링하며, 리소스 사용률(예: 디스크 I/O)을 추적함으로써 개발자가 시스템 성능의 병목 현상을 더 쉽게 조사하고 최적화 기회를 파악할 수 있도록 지원합니다.

관련 솔루션
IBM Instana Observability

IBM Instana는 DevOps, SRE, 플랫폼, ITOps, 개발 전반에서 누구나 필요한 컨텍스트에 따라 원하는 데이터를 얻을 수 있는 솔루션을 제공함으로써 관측 가능성을 대중화합니다. 클라우드 네이티브용으로 구축되었지만 기술에 구애받지 않는 이 플랫폼은 모바일, 웹, 애플리케이션 및 인프라 전반에 걸친 논리적, 물리적 종속성의 맥락에서 고충실도 데이터(1초 단위 세분화 및 엔드 투 엔드 추적)를 자동으로 지속적으로 제공합니다.

Instana 살펴보기 Instana 데모 요청하기

IBM Turbonomic

IBM Turbonomic 하이브리드 클라우드 비용 최적화 플랫폼을 사용하면 중요한 작업을 실시간으로 지속적으로 자동화하여 스택의 모든 레이어에서 앱에 컴퓨팅, 스토리지 및 네트워크 리소스를 가장 효율적으로 사용할 수 있도록 선제적으로 제공할 수 있습니다. 

Turbonomic 살펴보기 Turbonomic 무료 체험하기
다음 단계 안내

IBM Instana는 모두가, 그리고 누구나 활용할 수 있는 실시간 관측성을 제공합니다. 가치 실현 시간을 단축하는 동시에 관측성 전략이 현재 및 미래 환경의 역동적인 복잡성을 따라잡을 수 있는지 검증해 줍니다. Instana는 모바일에서 메인프레임에 이르기까지 250여 개 기술을 지원하고 있으며 그 수는 점차 늘어나고 있습니다. 

IBM Instana 살펴보기 라이브 데모 예약하기
각주

여러 운영 체제에서의 eBPF 도입 촉진을 제안하는 재단(ibm.com 외부 링크), DevOps.com, 2021년 8월 21일

IT의 주요 변화를 예고하는 최신 eBPF의 발전(ibm.com 외부 링크), DevOps.com, 2023년 9월 13일