HXDP: Efficient software packet processing on FPGA NICs


개요

eBPF program을 FPGA를 통해서, 압축시키고, 병렬화 시키며, CPU가 아닌 FPGA CHIP을 통해서 빠르게 적은 리소스를 통해서 처리할 수 있음을 보인 논문이다.

Motivation

FPGA기반의 NIC은 성능, re-programmability측면에서 다른 NIC들과는 차별성을 가진다. 그러나 FPGA를 직접 프로그래밍하는 것은 매우 어려운 일이다. 이를 해결하기 위해서 hXDP는 일반적이고 쉬운 Programming convention을 통해서, FPGA의 리소스는 적게 사용하지만, 성능 향상 없이 FPGA에 Network program을 Offload할 수 있는 기법을 개발하고자 하였다.

Importance

eBPF를 사용하면 XDP를 통해서 다양한 Network program을 작성할 수 있다. 그러나 eBPF instruction은 CPU에서 작동하게 되어 있지, FPGA에서 작동하게 되어 있지는 않다. 그에 반해서, FPGA는 CPU보다 클럭스피드는 느리지만 병렬적으로 작동하게 되어 있다. 이런 상황에서 FPGA에 대한 고려 없이 Offloading하게 되면 성능하락이 필연적으로 발생하게 된다.

Main Idea

  • eBPF 명령어에서 FPGA에서 사용하면 필요없어지는 구문들을 제거
  • eBPF 명렁어에 병렬화를 위한 구문 추가 및, 병렬화 프로그래밍 컨벤션 추가

Design

hXDP Compiler
FPGA에서 돌리는 경우 필요 없어지는 Instruction, 예를 들어서 Bound checks 나 memory zeroing, 과 같은 명령어들을 eBPF에서 제거하도록 하였다. 이러한 check들은 Hardware를 통해서 이루어지도록 하였다. 또한 hXDP를 위한 ISA를 만들어서, 기존에는 여러단계로 이루어지던 일을 한번에 이루어 질 수 있도록 하였다. 예를 들어서 return XDP_DROP은 기존에는 r0=1; exit; 으로 이루어지는데 hXDP에서는 exit_drop이라는 하나의 명령어로 이루어지도록 하였다. 그리고 기존에 two-operand뿐만이 아니라 thread-operand도 도입하여서, 명령어가 compaction될 수 있도록 하였다. 그리고 패킷 처리로 자주사용되는 (MAC 주소가 6B임), 을 허용하도록 하여서, 명령어가 추가적으로 줄 수 있도록 하였다.
Instruction Parallelism
Bernstein condition을 확인하여서, 명령어가 병렬화 될 수 있음을 컴파일 타임에 체크하여 가속화 될 수 있도록 하였다. 이를 위해서 hXDP의 eBPF 컴파일러는 CFG를 형성하고 Data dependency graph (DDG)를 통해서 Bernstein condition즉 각각의 병령화 시킨 block이 다른 block혹은 결과에 영향을 미치는 지를 파악하여, 병렬화를 시키도록 하였다. 그외의 과정은 eBPF와 동일하다.
Hardware
SKIP

Contribution

FPGA에 eBPF를 Offloading하면 어떤 점을 고려해야 하고 어떻게 Optimization해야 할까? FPGA에 eBPF를 사용하는 것의 이점은 무었일까?

Criticize

  1. 성능 향상이 CPU사용할때 보다 그렇게 빠르지는 않다. 그치만 XDP에서 사용되는 비용이 FPGA로 Offloading할만큼 크다고 보지는 않는데 성능이 아니라면 굳이 Offloading할 이유가 있을까?
  2. Single core에서만 구현되고 테스트됨. Multi-core일 경우 Evaluation이 나머지가 월등히 빨라지지 않을까?
  3. FPGA에 eBPF XDP를 적용시키면 저러한 점이 문제가되고 Optimize할 수 있다는 것이 정보전달이 잘됨.
  4. Development 노력이 매우 크고 내용이 많아서 큰 work이라고 생각됨.
  5. 향후, NIC offloading에서 어떠한 점을 Optimize해야 할때 잘 참고할 수 있을 것이라 생각된다.

Reference