[2026-06-25] eBPF 를 활용한 네트워크 지연시간 분석

🦥 본문

Intro

eBPF (extended Berkeley Packet Filter)

Linux 커널의 수정이나 재컴파일 없이 커널 내부에서 안전하게 JIT(Just-In-Time) 컴파일을 통해 사용자 정의 코드를 실행하게 해주는 샌드박스형 가상 머신

  • JIT 컴파일 방식
    • 기존 방식 : 프로그램 실행 전 코드를 기계어로 번역(AOT)하는 정적인 방식
    • JIT : 코드를 실행하는 순간에 컴파일하여 실행 중인 환경에 맞춰 최적화된 코드를 동적으로 생성.
  • 이벤트 기반 Hooks : 특정 이벤트가 발생할 때 트리거
  • 동작 흐름
    1. 사용자가 코드를 작성하고 eBPF 바이트 코드로 컴파일
    2. Verifier : 코드가 커널에 로드되기 전, 커널 패닉이 일어나지 않는 지 샌드박스 검증
      • 메모리 접근이 안전한 지, 무한 루프에 빠지지 않는지
    3. JIT 컴파일러 : 검증을 통과한 코드가 JIT 컴파일러에 의해 실시간으로 변환
    4. 커널 내부에서 코드 실행

BCC (BPF Compiler Collection)

복잡한 eBPF를 추상화하여 쉽게 개발하고 실행할 수 있게 만들어주는 개발 프레임워크

Endpoint latency measurement tool using eBPF

Kernel module

Linux 커널에 주입된 코드를 담당. 해당 코드는 sk_buff와 sock 구조체에 접근하여 송수신되는 메시지에 대한 정보를 획득.

  • sk_buff (소켓 버퍼) : NIC → 애플리케이션 도달까지 패킷 한 개에 대한 payload와 메타데이터를 담고 있는 버퍼.
    • 정의 : 커널에서 패킷 단위 하나를 메모리 상에 표현하고 관리하기 위한 데이터 구조체
  • sock : Connection을 저장하는 구조체
    • 정의 : 커널에서 네트워크 통신의 세션 자체의 상태와 정책을 관리하는 구조체

Analyzer module

Kernel module로부터 수집된 정보를 사용하여 패킷이 각 계층에 진입한 시점을 파악

동작 흐름

  1. 각 컴퓨터 네트워크 계층에서 패킷이 진입할 때 트리거 이벤트 생성
  2. eBPF를 통해 sk_buff와 sock에 접근하여 IP/TCP 헤더 등의 정보를 추출
  3. 이전에 수집했던 패킷 기록들과 비교하여 재전송 된 것은 아닌 지 오류가 있는 것인지 아닌 지 확인
  4. 데이터를 event로 만든 후 BPF Ringbuf를 통해 analyzer module로 전송
    • 이 때 이벤트는 record의 의미
    • BPF Ringbuf는 사용자 영역의 애플리케이션으로 전송하기 위해 설계된 Circular-queue 형태의 공유 메모리
  5. analyzer module에서는 이벤트가 순서대로 도착하지 않을 수 있으므로 버퍼에 저장
  6. 이벤트들을 timestamp 순으로 큐에 전송
    • 각 Connection마다, 각 네트워크 계층마다 송신부와 수신부를 위한 두 개의 큐가 존재
    • 예시 : [A연결 - TCP계층 - 수신 큐], [A연결 - IP계층 - 수신 큐]
  7. 각 큐에 저장된 이벤트들은 연결 별로 생성된 데이터 시퀀스 번호를 통해 매칭 후 기록
    • A 연결 TCP 계층 수신 큐에 있는 데이터 시퀀스 번호를 확인하여 A연결 - IP계층 - 수신 큐에 같은 데이터 시퀀스 번호가 있는 지 확인하고 매칭. 같은 패킷이 계층 이동을 한 것임.

Evaluation

Sender/Receiver의 latency 측정

image.png

ELEMENT와의 비교

image.png

시스템 오버헤드

구글 클라우드(GCP) 환경에서 100Mbps 속도로 통신할 때 CPU 사용량을 확인해 보니, 송신자와 수신자 모두 평균 3.5%라는 매우 낮은 점유율

Contribution

  • 네트워크 스택의 각 계층 별 latency 추적
  • 재전송 및 엔드포인트 지연 시간 분석에 도움이 되는 패킷 메타데이터

vs ELEMENT

  • 나은 점
    • ELEMENT에 비해 정밀할 것
      • 이유 : ELEMENT는 근사한 값이지만 eBPF는 timestamp를 찍기 때문
    • 네트워크 스택 계층 별로 분석 가능.
    • 메타 데이터도 존재
  • 안 좋은 점
    • ELEMENT는 관리자 권한이 없어도 되지만, eBPF는 커널 내부에 코드를 주입해야 하므로 관리자 권한이 필요
      • 코드를 주입한다는 것은 사용자가 작성한 코드를 eBPF 바이트코드 형태로 컴파일한 후, bpf()라는 System Call을 호출하여 현재 실행 중인 커널 공간의 메모리 영역에 해당 바이트코드를 밀어 넣고 실행
    • ELEMENT는 지연 시간을 측정하면서 전송 속도를 조절하지만 eBPF는 측정에만 불과함

Categories:

Updated:

Leave a comment