개요
리눅스 네트워크 스택에서 사용되는 BPF와 eBPF에 대해 학습
등장 배경
리눅스 네트워크 스택은 복잡하고, 변경에 많은 시간이 소요되고, 정해진 레이어들을 건너 뛰기 어렵다는 단점이 존재하는데, 이를 극복하기 위한 수단으로 BPF가 등장
BPF
BPF (Berkeley Packet Filter)는 일종의 커널 훅으로, 커널에 삽입하여 패킷을 제어할 수 있으며 다양한 영역에서 훅을 통해 필터에 접근 가능
1992년에 등장한 BPF를 확장하여 2014년에 eBPF (extended Berkeley Packet Filter)가 등장했으며, 초기에는 Networking, Observability, Tracing, Security 등의 영역에서 이용
•
Networking : 커널 영역을 이탈하지 않고도 패킷 처리가 가능하도록 하고, 추가적인 프로토콜 파서를 추가하여 요구사항에 따라 변경되는 로직을 쉽게 프로그래밍 할 수 있도록 지원
•
Observability : 커널에서 커스텀 지표들을 집계하여 이벤트 시각화를 생성하는 기능을 지원
•
Tracing & Profiling : eBPF 프로그램들을 트레이싱 지점마다 심어서 커널과 사용자 애플리케이션의 통찰을 얻고 강한 내성을 얻게하여 성능적인 문제 발생 시 용이한 트러블 슈팅을 지원
•
Security : 패킷과 소켓 레벨의 관점에서의 시스템 콜을 이해하기 쉽게 보안 체계에 적용할 수 있도록 통합을 지원
eBPF가 주목 받는 이유는 해당 영역에서의 역할 외에도 커널 내에서 자유롭게 프로그래밍하여 커널 기능을 조작하는 혁신적인 샌드박스 환경을 제공하기 때문
eBPF는 일종의 커널에서의 VM과 같은데, BPF와 구조를 비교해보면 범용적 목적의 레지스터들을 갖는다는 점, 해당 레지스터들이 별도의 스택 포인터를 이용한다는 점, 그리고 무제한 크기의 Maps를 이용한다는 차이가 존재
•
커널 데이터에 대한 캐시 구축
•
eBPF 프로그램들 간 데이터를 공유
•
eBPF 프로그램들의 상태를 저장
•
사용자 영역 프로그램에서 커널 데이터에 접근
XDP
XDP는 (eXpress Data Path)로 eBPF를 기반으로 한 빠른 데이터 경로를 지칭
일반적인 커널에서의 패킷 경로는 위와 같은데, 호스트 A → 호스트 B로 UDP 패킷을 전송할 때 10G 이더넷을 쓴다고 가정
영역 별 패킷 차단
사용자 영역의 패킷 차단
Netfilter 영역의 패킷 차단
TC Ingress 영역의 패킷 차단
XDP 영역의 패킷 차단
TC는 Traffic Control의 약자로 패킷 스케줄러인 QDisc의 QoS, Filter, NAT, Mangle 등 기능을 수행
차단 지표 비교 시 10G에 가장 근접한 처리 성능을 보이는 것은 계층을 많이 거치지 않은 XDP로, 약 7G 정도의 성능을 보임
XDP에 대해서 보다 자세히 흐름을 살펴보면 아래와 같은 구조로 패킷을 처리하는데, 패킷 차단을 하는 경우 거의 즉시 XDP_DROP으로 패킷을 버리는 것을 볼 수 있음
XDP 모드
XDP 모드에는 Generic, Native, Offloaded로 나뉨
Generic은 리눅스 커널의 네트워크 스택을 그대로 이용하는 것을 의미하고, Native는 네트워크 드라이버에서 XDP를 처리하는 것을 의미하며, Offloaded는 네트워크 하드웨어 상에서 처리하는 것을 의미
XDP Generic 모드가 약 7G의 성능을 냈었는데, 이를 Offloaded 모드로 변경하여 운용하게 되면 하드웨어 단에서 패킷을 쳐내기 때문에 10G의 성능을 고스란히 유지하는 것을 볼 수 있음
특히나 XDP Generic 모드는 커널 단까지 올라가서 처리하기 때문에 꽤나 많은 CPU를 소모하지만, Offloaded는 별도의 하드웨어에서 처리되므로 CPU 사용률도 없는 것과 마찬가지로 볼 수 있음
시중 제품
XDP Offloaded로 사용되는 대표적인 제품으로는 Mellanox와 Netronome, Intel이 있음
Reference
기업 사례