通过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
几个组件
- SPRIGHT controller
- 平台级别
- 和kubelet交互
- 和autoscaler、placement engine交互
- SPRIGHT gateway
- 反向代理
- 和共享内存交互
- 一个chain一个gateway
- Direct Function Routing (DFR)
- 一些安全措施
- 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