【论文阅读】SimpleSSD: Modeling Solid State Drives for Holistic System Simulation


introduction

SSD当前以及成为泛计算领域的重要存储媒介。它的性能特性正好填补了main memory和storage system之间的性能差距。

1.当前(2018)SSD simulator存在的问题

  • 开源的SSD simulator 很少;
  • 现有的模拟器具有许多局限性,使得无法满足将memory和storage subsystem合并的科研需求。总的来说就是缺乏系统级别的模拟能力。由于SSD 本身有很多复杂的软件硬件结构,前人的SSD simulator基本无法模拟其内部的软硬件结构,因此没有捕捉到当代高性能SSD 的特性。

2.our work

 这篇文章提出了高保真的SSD simulator-SimpleSSD,它可以模拟SSD 内部的软硬件详细特性,同时简化了存储内部不太紧要的特性(?)

我们可以通过SimpleSSD 评估各种存储技术,也可以用于探索SSD 架构设计。
同时也可以将SimpleSSD集成到系统中,捕捉系统使用不同的存储所带来的CPU性能影响。


SimpleSSD

1.overview

【论文阅读】SimpleSSD: Modeling Solid State Drives for Holistic System Simulation

  • CPU process - 本文中使用gem5进行模拟CPU processing
    1 相关应用在CPU的user space上进行搭建。通过VFS以及native file system来分配IO请求。VFS通过在page cache中缓存小尺寸的请求。native file system关系数据访问以及系统内存。
    2 之后命令到达block layer将多个请求按照特定的次序进行合并。
  • SSD process
    3 通过disk controller,CPU process和层级化固件(layered firmware)进行沟通。

模拟SSD一个重要的挑战就是支持多样的flash firmware versions。
我们实现了flexible FTL

  • 其地址映射机制可以根据所需的关联度粒度(associativity granularities)进行简单的重新配置。
  • 同时我们将IO调度以及页面分配机制从FTL中分离出来,这样就可以在不改变FTL的情况下嵌入测试不同的IO调度方案。
  • 还可以建议修改一些性能关键组件,如Garbage collection和wear leveling算法。

  4 abstraction model模拟SSD的硬件结构,包含multiple flash die,module interfaces以及channels。

hardware abstraction:

  • 对每个组件进行周期级模拟可以准确地评估所有SSD内部构件。但是,在周期级别使用SSD的全系统模拟需要长时间运行和过多的资源。
  • 在本工作中,我们同时抽象了flash-level以及subsystem-level的硬件特性,同时实现了基于FPGA(xilinx spartan-6)的memory controller用于模拟不同内存技术的特性。
  • 基于所提出的特性,建立了die级别的延迟模型,虽然不能在一个周期级别上解释Flash 的全部特性,但是通过了解flash延迟内在特性和内部并行性来获得固件、控制器和体系结构设计之间的密切交互。

2.详细介绍

【论文阅读】SimpleSSD: Modeling Solid State Drives for Holistic System Simulation

  • Fully-functional firmware simulation

处理request的基本流程:

  • a request from disk controller of gem5->host interface layer(HIL)
  • 对应的目标地址由FTL层进行翻译
  • 并行分配层(parallelism alloction layer)通过抽象互连总线和闪存的物理布局来服务请求。I/O请求的完成由PAL通过HIL报告给主机端控制器。

1. host interface layer
1.1 在request到来的时候,解析host-side信息的语义,并将request转化为LBA,request type, number of sectors, and a host’s system time information
1.2 通过**API(ReadTransaction()/WriteTransaction())**和FTL层交流。

  • 1.3 latency map table:由于在模拟完整系统的时候,有不同的模式(discrete event-driven, activity-driven, and continuous),HIL使用该表记录结束时间以及对应的地址。当其延迟被后续的模拟模块更新,HIL就更新完成时间。

由于IO请求的大小(host application)各有不同,甚至可能超过一个page的大小,单独的flash die无法自适应。因此FTL层对于到来的request进行分割。

2. Flash translation layer-API:FTLmapping()
2.1 FTL层会将到来的request分割成多个sub-request,每个都被logical page number(LPN)指示。

  • 如果请求是read,直接通过查询address mapping table转化为PPN(physical page numbers)
  • 如果请求是write,就需要申请pages并更新address mapping table的映射关系(包含地址以及各类元数据)

2.2 上述的PPN通过 API:SendRequest() 传递给PAL,上述的行为持续重复知道队列中没有sub-request。
2.3 如果空间不足,就会触发GC来重新声明一批新的pages。-API:GarbageCollection()

  • 选择victim block和free block(wear leveling决定)。- API: WearLeveling()
  • 复制victim中有效的数据到free blobk中,并且要更新映射表。
  • hardware simulation for scalable SSD parallelism
    1. parallelism abstraction layer

将其他flash固件模块与SSD的并行分开达到更好的仿真效率。(模块化也是可以自由modify的基础)。PAL层将到达的PPN分离(API:PPNdisassemble())-channel x,die n;

   1.1 PAL层模拟了SSD的内部状态(channel-package-die),也能更好的获得延迟,空闲时间以及硬件冲突造成的penalty。
   1.2 之后PAL层就将每个sub-request模拟出的延时反馈给FTL。FTL评估获得的延时从而给IO请求生成一个合适的延迟。延迟通过API:TimelineScheduling()获得。

2. latency variation mapping

SLC,MLC,TLC…虽然在媒介本质上没有什么区别,但是由于相对MLC,TLC的状态较多。因此,采用的是increment step pulse program,从而引入了显著的延迟变化。为了模拟这个program带来的延迟变化的行为,使用基于FPGA的controller进行模拟测试。

【论文阅读】SimpleSSD: Modeling Solid State Drives for Holistic System Simulation
2.1 对于写操作,最有效位(MSB)页面的延迟分别比中心有效位(CSB)和最低有效位(LSB)页面的延迟分别长约1.3倍和8倍。TLC flash上的读取也表现出类似的延迟变化特征。具体来说,MSB页面的读取延迟平均比CSB页面和LSB页面的读取延迟分别长37%和84%。由于不同页面之间的延迟存在显著差异,这可能会对并行性和硬件建模产生很大影响。
2.2 我们观察到一个块中的前5个页面总是表现出LSB页面性能,以及后面3个页面(即LSB)的延迟。(前五页之后)与CSB页面相同。这8个页面被称为元页面,通常用于存储flash固件的元数据,比如与块关联的映射信息。所有剩余页面的延迟可以用以下简单函数映射:
【论文阅读】SimpleSSD: Modeling Solid State Drives for Holistic System Simulation
addr, nmeta, nstate and nplane 是输入的地址, meta page的数目, 每个cell的状态数 和一个flash die的plane数。 如果f(addr)是0, 就是 LSB page. 如果f(addr)是1, 就是CSB page;剩余的就是MLB page。


总结

个人觉得工作的亮点:

  • 全功能。
  • die级别的延迟模型。
  • Mapping以及IO调度可以在HIL处进行修改更新,GC和WL也作为模块可以被modify。
  • FTL中对于request分割成多个sub-request。

[1]github-SimpleSSD