SPRIGHT: Extracting the Server from Serverless Computing! High-performance eBPF-based Event-driven, Shared-memory Processing

通过eBPF和shared memory来实现zero copy等data plane的数据平面优化。

开源,基于knative https://github.com/ucr-serverless/spright.git

Background

造成性能开销的原因:核心是数据平面的设计过于复杂

  • 数据拷贝、上下文切换、中断
  • 额外的protocol处理
  • 不必要的序列化、反序列化
  • sidecar的设计很冗余

System design of SPRIGHT

Overview of SPRIGHT

几个组件

  1. SPRIGHT controller
  2. 平台级别
  3. 和kubelet交互
  4. 和autoscaler、placement engine交互
  5. SPRIGHT gateway
  6. 反向代理
  7. 和共享内存交互
  8. 一个chain一个gateway
  9. Direct Function Routing (DFR)
  10. 一些安全措施
  11. eBPF交互

Optimizing communication within function chains

  • per-chain独有的共享大页内存
  • 通过packet descriptors交互
    • 下一个function的ID
    • pointer to the data in the shared memory
  • zero copy
    • 通过维护eBPF中的一个socket map,通过function ID找到target socket info(比如文件描述符)

相比于DPDK的busy-polling,这种方式虽然有一些overhead,但是用的CPU更少。

Event-driven proxy (EPROXY & SPROXY)

主要负责

  • 提供原来的sidecar proxy的功能
  • 提供metric collection,比如三层的packet rate或者七层的request rate

Security domains in SPRIGHT

包含两个部分

  • private共享内存池for each chain(通过DPDK的支持实现)
  • inter-function packet descriptor filtering

eBPF-based dataplane acceleration for external communication

通过eBPF的XDP/TC hooks来加速和外部的通信。

Event-driven protocol adaptation

在gateway向function pod发送消息之前,添加了一个protocol adaptation hook