- Today
- Total
Byeo
The eXpress Data Path (XDP): Fast Programmable Packet Processing in the Operating System Kernel 1 본문
The eXpress Data Path (XDP): Fast Programmable Packet Processing in the Operating System Kernel 1
BKlee 2023. 8. 21. 21:58이 글은 Conext '18에 공개된 The eXpress Data Path (XDP): Fast Programmable Packet Processing in the Operating System Kernel 를 번역해 정리한 글입니다.
개요
근래 연구는 packet을 처리하는 방법으로 kernel보다 userspace를 선호하고 있다. 이는 userspace가 kernel보다 프로그래밍에 용이하고, kernel-userspace 간의 context switch로 부터 야기하는 성능 저하를 피할 수 있기 때문이다. 하지만 Kernel을 우회함으로 인해 Kernel이 가져다주는 이점 (application isolation, 보안, 그리고 검증된 코드)들을 잃게 된다.
eXpress Data Path (XDP)는 이를 극복하기 위해 제안되었다. OS kernel은 XDP가 device driver context에서 실행함과 동시에 packet processing에 있어서 안전한 환경을 제공한다. 현재 XDP는 Linux의 일부로 구현이 되어있으며 (mainline), kernel과 병합하여 완벽하게 구동이 가능하다. XDP를 이용하고자 하는 application은 C로 작성이 가능하며, kernel이 safety를 분석하여 byte code를 생성한다.
이 논문에서는 XDP를 통해 L3 routing, DDOS protection, L4 LB를 구현할 수 있음과 동시에, 2,400만 pps를 달성할 수 있음을 보이고자 한다.
서문
High-performance networking은 packet processing에서 사용 가능한 시간이 매우 타이트하다. 보통의 OS 네트워크 스택은 일반적으로 flexibility를 우선하였고, 이를 다시 해석하면 하나의 packet을 처리하는데 필요한 작업이 너무 많아지는 결과를 가져왔다. 그러다 보니 High-performance networking을 달성하는 것이 갈수록 힘들어 졌고, DPDK와 같이 새로운 framework로 눈길을 돌리게 되었다. 이 DPDK는 network hardware의 제어권을 곧바로 application에 넘겨줌으로써 kernel을 완전히 우회하였다.
이러한 Kernel-bypass 방법은 성능을 상당히 끌어올릴 수 있지만, 기존 시스템과 통합하기 어렵다는 단점이 있다. 예를 들어, DPDK는 kernel을 완전히 bypass하기 때문에 기존 kernel이 제공하던 routing table 기능이나 다양한 프로토콜들 (e.g., ARP, ICMP) 등을 재구현해야 한다 (이를 극복하고자 DPDK에서 kernel network interface, KNI 기능이 있는 것으로 알고있다). 나아가 기존 kernel으로부터 받을 수 있었던 다양한 보안 기술들을 잃게되고 시스템의 복잡도를 증가시키는 결과를 초래한다. 또한, 현대에 도커나 쿠버네티스와 같은 contrainer-based 시스템을 많이 차용하는 방향으로 가고 있는데, 이 시스템은 kernel이 자원 관리와 같이 중요한 역할을 맡고 있어 그 중요성은 점차 커지고 있다.
이 논문에서는 kernel bypass의 대안으로 OS의 kernel 내부에서 프로그래밍이 가능한 디자인, XDP를 제안하였다. XDP는 기존 시스템과 매끄럽게 동작을 할 수 있으면서 packet processing 성능도 뛰어나다. 이는 eBPF (extended BSD Packet Filter (BPF))를 실행하는 virtual machine의 형태로 작성되어 동작한다. 이는 kernel context에서 동작하며, hardware와 kernel 바로 사이에다가 코드를 넣을 수 있어서 kernel이 packet을 직접 다루기 전에도 조작할 수 있다. Kernel이 이 프로그램을 load하기 전에 안정성을 체크하고 (kernel은 굉장히 민감한 친구이기에), machine instruction으로 컴파일 되어 고성능을 달성할 수 있다.
이 논문에서는 XDP의 디자인과 활용 가능성, 그리고 Linux kernel이 어떻게 통합되었는지 설명한다. 그리고 실험을 통해서 CPU 1개당 2400만 pps (packets per second)를 달성할 수 있음을 보였다. DPDK의 최고 성능에는 못 미치기는 하나, DPDK에 비해 XDP는 다음과 같은 강력한 장점을 가지고 있다:
- Kernel networking stack과 통합됨으로써 kernel의 보안 기술을 누릴 수 있고, network configuration과 관리 툴의 변화가 필요 없다. 또한, 기존 네트워크 장비는 별도의 hardware 지원 기술을 필요로 하지 않고 기존 Linux driver에 XDP execution hook만 추가하면 사용이 가능하다.
- XDP는 kenrel의 networking stack (e.g., routing table, TCP stack)기능 중 일부만을 자유롭게 선택이 가능하다. 특정 기능이 필요 없으면 bypass하여 성능을 향상시킬 수 있다.
- eBPF instruction set과 API의 안정성을 보장한다.
- XDP는 user space에 올라온 packet을 다시 kernel에 넣는 비싼 과정을 필요로 하지 않는다.
- 서비스의 중단 없이 프로그래밍이 가능하다. 다양한 기능들이 현재 흐르는 network traffic을 방해하지 않고 추가/제거가 가능하다.
- CPU core를 전부 할애할 필요가 없다. Traffic이 적으면 그만큼 적은 CPU를 사용한다. (DPDK는 traffic이 적든 많든 CPU를 항상 full로 사용한다.)
관련 연구
Packet processing programmability를 위한 frameworks는 다양하게 존재한다. Switching, routing, name-based forwarding, classification, caching, traffic generation 등의 역할에서 progrmability를 제공하기 위해 각각 framework 존재한다. 최신 NIC에서 line rate를 달성하기 위해서는 NIC과 packet processing 사이에서 bottleneck을 제거할 필요가 있다. 그 중 한 가지 주요 원인으로는 kernel-userspace를 넘나드는 packet processing을 뽑을 수 있다. DPDK는 kernel을 우회하고 userspace에서 동작함으로써 이 비용을 획기적으로 절감했다. Intel의 NIC에서 출발했으나 근래에는 많은 곳에서 사용되고 있을 정도로 유명하다. DPDK 외에도 PF_RING ZC, OpenOnload 등의 예제도 존재한다. 하지만 서론에서 언급했듯, kernel이 가져다주는 이점을 모두 포기해야 하고, 필요한 기능을 직접 다시 재구현해야 하는 단점이 존재한다.
반대로 kernel 내부에다가 직접 기능들을 구현하려는 예제도 소수 존재한다. OpenVswitch가 virtual switch로서 대표적인 사례이며, Click, contrail 등의 router framework들도 존재한다. 하지만 kernel 내부에서 직접 구동하는 방식은, (i) 코드에 실수가 있다면 전체 시스템에 crash를 발생시킬 수 있고, (ii) 내부 kernel APIs가 자주 바뀔 수 있다는 점에서 단점이 존재한다. 하지만 XDP는 별도의 안전한 실행 환경에서 구동이 되고, kernel community로부터 API를 유지하기 위한 노력을 하고 있다는 점에 장점이 있다. 추가로, XDP는 입맛에 따라 kernel의 일부 기능을 사용할지 말지 고를 수 있다. 따라서 XDP는 networking stack을 우회하고 곧바로 userspace application에 데이터를 꽂아주어 zero-copy를 달성할 수 있다. (AF_XDP라고 알고 있다.) 비슷한 방식으로 netmap, PF_RING, packet shader I/O engine 등이 존재한다.
Programmable hardware device도 high-performance packet processing을 달성하기 위한 방법중에 하나이다. NetFPGA는 FPGA-based 하드웨어에서 임의의 packet processing을 가능토록 하는 API를 제공한다. P4 language 역시 packet processing hardware의 programmability를 확장하기 위한 방법 중에 하나이다. 이러한 관점에서 XDP는 packet processing 성능을 향상시키기 위하여 software offload라고 볼 수도 있을 것이다.
요약하여 XDP는 성능, 기존 시스템과의 통합, 그리고 flexibility 사이의 균형에서 적절한 지점을 찾은 접근법이라고 볼 수 있다.