Serverless Computing on Heterogeneous Computers

文章的主要贡献是对异质性硬件(DPU、FPGA、GPU)的serverless支持。主要设计亮点

  • 添加了一个Shim层来对不同硬件的OS和接口进行统一调用和管理
  • vectorized sandbox来支持对FPGA的function的操作。主要就是用一个sandbox vector来代替一个sanbox

此外还搞了一个类似Catalyzer的cfork,但是cfork使用runtime实现的

Background

为什么需要异质硬件?

  • instance个数限制:需要DPU来提升density(1CPU 1000 instances;+1 DPU +256 instances)
  • 许多特殊的应用都需要accelerator:FPGA加速

几个挑战

  1. multi-OS。不同硬件有不同的OS
  2. abstract。不同硬件如何提供统一抽象
  3. 通信

Abstraction

主要包括两个部分:XPU-shim和vectorized sandbox

XPU-shim

主要有以下三个feature

  • 在所需要交互的OS之上,利用vectorized sandbox的接口,实现对函数的管理
  • 提供XPUcalls,类似系统调用
  • 支持通信

Distributed Capability

XPU-Shim使用分布式对象和Capability为用户空间的应用程序维护全局资源和状态。 目前,我们已经定义了以下两个分布式对象。

  • CAP_Group是记录进程所有Capability的对象
  • IPC是进程间的连接对象

XPU-Shim只利用能力系统来管理不同PU之间的权限和通信

同时还包括一个全局唯一ID和CAP_GROUP记载的权限list

Neighbor IPC

系统里一共有三种IPC

  • Remote IPC:访问不同机器,通过network
  • Local IPC:同一个机器上的同一个硬件
  • Neighbor IPC:同一个机器访问不同硬件,比如CPU访问DPU

Miscellaneous XPU Operations

此外还支持跨PU的spawn

Vectorized sandbox

直接在FPGA上实现容器OCI有两个挑战

首先,OCI接口在FPGA等异构设备上的可扩展性较差。与通用的PU不同,FPGA一次只能刷新一个image。 此外,这也导致了更高的启动延迟,因为我们需要为大多数请求重新编程FPGA设备。

第二,明确地删除沙盒会产生非实质性的费用,而这些费用在这些情况下是不必要的。 在CPU或DPU的情况下,无服务器的运行时间应该明确地删除沙盒以节省硬件资源。 然而,在FPGA中,刷新的函数不会占用任何资源,并且可以在创建新的FPGA少服务器函数时轻松替换。这两个限制促使了矢量沙盒的抽象化。

为此做了以下三个扩展

  • create不再是创建一个sandbox,而是创造一个sandbox的向量
  • start也是开始一个向量,这里面的都并行执行
  • delete不真正擦除,只是标记状态

Design

  • Programming models。类似Lambda的。DPU和CPU的编程模型一样。FPGA有自己的一套
  • container fork (cfork)。继承了Catalyzer中sandbox fork的思想,从预先准备好的模板容器(在CPU和DPU上)生成新的实例,但克服了三个新的挑战
    • 首先,一个容器可能包含多线程甚至多进程,这些线程很难被Unix fork正确和有效地克隆。Catalyzer依赖于underlying的管理程序(即gVisor)来提供fork整个沙盒的能力,这对于没有管理程序层的Molecule是不适用的。为了解决这个问题,cfork提出了可fork的语言运行时:一个无服务器函数的包装器,可以重新fork多线程实例。runtime将暂时把所有线程合并成一个线程,把多线程的上下文保存在内存中,并在cfork之后把它扩展成一个多线程的。
    • 其次,Molecule需要将fork的函数实例从模板容器中迁移到新的容器中进行隔离。为了满足这一需求,Molecule将为fork的实例准备一个新的容器(称为函数容器)。在cfork过程中,fork的运行时将根据函数的配置重新配置其命名空间和cgroup,然后加载函数的代码(如果有的话,还有依赖关系),并建立与Molecule的连接。之后,Molecule可以将请求分配给子实例,而子实例在函数容器中执行这些请求。默认情况下,Molecule为所有使用相同语言的函数准备了通用模板容器,例如,一个Python模板用于所有Python函数。Molecule可以为热点函数启动一个带有代码和依赖关系的专用模板,以进一步减少延迟。
    • 第三,cfork应该支持异构计算机上的多操作系统。为了在多个PU上fork新的实例,每个PU需要为每个语言的运行时间准备一个模板容器。之后,Molecule可以利用nIPC请求邻近的PU创建函数容器并fork新的实例。新的实例将利用nIPC来获取请求和返回响应。
  • Caching FPGA function instances。FPGA上没有fork,因此用cache,实现准备好image
  • nIPC-based DAG call。使用全双工的FIFO,通过XPU-shim直接连接。
  • XPUcall优化。XPU-Shim是一个os上的单独的程序,因此需要IPC。为此提出了两个加速方案
    • MPSC(Multi-Producer Single-Consumer)队列上进行轮询,并依靠IPC来通知进程进行XPUcall响应的情况。
    • MPSC队列只用于通知XPU-Shim哪个进程发出了XPUcalls。再有另一个per-process的share memory用来被user function轮询来得到invocation information
  • Inter-PU synchronization。一共有三种方式:不同步、即时同步、Lazy同步