Willow -- A User-Programmable SSD


Willow: A User-Programmable SSD

0x00 引言

Willow这篇Paper发表在OSDI ‘14上面,关于一个可编程的SSD系统。在不影响现在的文件系统的情况下,Willow通过可以让应用开发一些SSD的一些增强功能来拓展SSD的应用和提高SSD的性能表现。这个的拓展思路和现在的Open Channel、lightnvm很相似,但是在如何去实现可编程拓展SSD功能存在很大的差别。Willow SSD提供的一些功能更像是一种功能增强的“裸”设备,

 We find that defining SSD semantics in software is easy and beneficial, and that Willow makes it feasible for a wide range of IO-intensive applications to benefit from a customized SSD interface.

0x01 系统设计

下图显示了Willow SSD的一个基本的架构,基本的组件和一般的SSD没有很大的差别。在结构上面,一个Willow的SSD会包含一组的storage processor units (SPUs),一个SPU包含了一个微处理器以及与其它的SPU连接的接口,一组non-volatile的存储介质。在每一个SPU上面,运行一个很小的操作系统SPU-OS 。

willow-arch

而Willow提供的接口则和传统的SSD存在很大的区别。主机上面的Willow驱动通过一组的Host RPC Endpoints (HREs)来实现与SPU之间的通信。这些数据结构由内核创建,归属于某个进程,其中会包含一个HRE ID用于识别不同的通信请求。这里提供的接口类似于RPC,如下图所示。Willow的另外一个部分就是SSD App,每一个Willow的SSD Apps包含三个基本部分,1. 一个RPC处理Handler的集合,由内核安装到SPU上面,就代表了这个SSD App,2. 一个库,用于应用程序能够访问这个SSD App,3. 一个内核模块,用于在SSD Apps需要内核支持的时候使用。这里Willow上面可以同时运行多个SSD Apps。

willow-anatomy

对于用户来说,他要关心的一个是Willow的使用模型。Willow可以通过多种的使用模型,Paper中讨论了两种,

  • Base-IO,在这种模式下面,Willow SSD更像是一个传统的SSD,提供一个基本的块设备的功能。Base-IO模式下面,会将数据分区分发到一个Willow SSD的SPUs上面,Willow使用了8KB分段的方式。此时每个SPU上面运行的代码是相同的。
  • Direct-IO,这种模式更高更好地利用Willow SSD的可编程性。上面的图中表示。Direct-IO通过RPC的方式提供了一种Bypass内核的方式来实现读写,这样可以避免系统调用和文件系统带来的开销。这里访问权限的授予以及 HRE等还是要先请求内核。

一个完整的SSD Apps有基本部分共同实现,客户端的应用程序(使用Willow提供的libDirectIO库),内核中相关的模块,以及Willow SSD。如前面所言,这里很多的系统都是利用RPC的现实来实现看的。 SPU-OS实现了这样的一些接口:发送/接收 RPC请求、发送RPC回复,初始化数据传输以及分配内存的一些接口。在SPU-OS上实现RPC请求的一个代码例子,使用C语言实现,

void Read_Handler (RPCHdr_t *request_hdr) { 
    // RPCHdr_t part of the RPC interface
    // Parse the incoming RPC
    BaseIOCmd_t cmd;
    RPCReceiveBytes(&cmd, sizeof(BaseIOCmd_t)); 
    // DMA the IO command header RPCResp_t response_hdr; Allocate response
    RPCCreateResponse(request_hdr, &response_hdr, RPC_SUCCESS);
    RPCSendResponse(response_hdr); // Send the response
    // Send the read data back via a second RPC
    CPUID_t dst = request_hdr->src;
    RPCStartRequest(dst, sizeof(IOCmd_t) + cmd.length, READ_COMPLETE_HANDLER); 
    // Read completion RPC ID
    RPCAppendRequest(LOCAL_MEMORY_PORT, sizeof(BaseIOCmd_t), &cmd);
    // Source DMA port
    // IO command header size
    // IO command header address
    RPCAppendRequest(NV_MEMORY_PORT,  cmd.length, cmd.addr); 
    // Read address RPCFinishRequest(); 
    // Complete the request
}

SPU上面运行的小型操作系统支持多线程,可以和主机配合管理存储资源,可用于增强文件系统的保护功能,也用于实现多个SSD Apps的同时运行。一个SPU包含了这样的几个组件,

  • SPU处理器,应该就是一个小型的嵌入式处理器;
  • Local non-volatile memory,用于数据存储;
  • Network interface,用于通信;
  • Programmable DMA controller ,可编程的DMA控制器,用来处理数据传输,可以在Local non-volatile memory、网络端口和处理器的本地存储之间路由数据。

Willow的保护与共享的功能有Willow提供的这几个概念实现,1. 可以运行不受信任的SSD Apps,2. 可以保护系统免受恶意SSD Apps的影响,3. 不同的SSD Apps可以同时运行,4. 一个SSD App可以使用其它的Apps提供的功能。这些功能的实现依赖于Willow实现的几种保护机制,

  • Willow必须清楚是哪一个主机的进程负责SSD哪一个运行中的代码,这个是基础。主机的系统负责为Willow设计保护策略。Willow通过追踪每一个RPC原始的来源的HRE。为了优化性能,这里给每一个进程中的线程一个HRE,其高位的bit系统,用以区分,

    ... The PCIe interface hardware in the Willow SSD sets the originating HRE for the initial RPC, and SPU hardware and SPU-OS propagate it within the SSD. As a result, the originating HRE ID is unforgeable and serves as a capability.
    
  • Willow必须保证SSD App只有有访问权限的情况下才能访问达指定的数据。每个SPU中会维护一个权限表,这里也要利用到来源的HRE,加上这个权限表来确定某一个块的存储Chunk是否有访问的缺陷。

  • 一个SSD App必须只能直接访问自己的内存和运行自己部分的代码。这里SPU的处理器提供了端寄存器,区分每个App使用的内存端。不允许器访问另外的内存端。每个SSD App有自己的指令和数据存储的空间。访问段外的内存会引发异常,导致这个App变得不可用。另外,Willow通过软硬件组合的方式来实现限制一些RPC的访问,SPU-OS中保存一个SSD App-intercall table来指明这些调用的限制,

    To implement kernel-only RPCs, we use the convention that a zero in the high-order bit of the HRE ID means the HRE belongs to the kernel. RPC implementations can check the ID and return failure when a non-kernel HRE invokes a protected RPC.
    
  • 提供在SSD Apps中控制数据传输的功能,以便于组合使用一些SSD Apps。

0x02 实现 和 Case Studies

Paper中描述了一个Willow SSD的原型,并在其的基础上做了一些测试。在这个原型下面,使用Direct-IO的情况下,XFS文件系统可以实现比Base-IO高66%的小文件读性能和8x的小文件写性能。这里Bypass内核的方式减少了很大的一些开销,特别是在每次操作小数据量的情况下,减少上下文切换之类的开销更加明显。

willow-read-perf

另外提供一些一些功能有很有趣,比如原子写功能。这个可以很大地简化类似数据库之类系统的实现。Paper中用于直接实现Key-Value Store也很有意思。

0x03 评估

这里的具体信息可以参看[1],

参考

  1. Willow: A User-Programmable SSD, OSDI ‘14.