SSD模拟器之Flashsim

时间:2024-04-08 12:44:31

在进行SSD相关的研究和开发时,比如SSD架构和FTL的优化改进时,直接在SSD上实现设计所花费的高昂成本和大量时间多数情况下是不可接受的,这时如果先把设计在模拟器上实现验证,不但能够快速地得到功能、性能、能耗等方面的估测数据,加快设计迭代周期,还有助于深入理解设计改进对于SSD各个部分工作的影响,来指导进一步改进设计方案。因此,对于设计SSD的工程师,掌握一款SSD模拟器的使用是非常重要的。

现有的SSD模拟器实际上已有不少种,像是Flashsim[1],SSDSim[2],Disksim加上微软的SSD Extension[3],等等。这次我主要介绍Flashsim。Flashsim是一款开源的SSD模拟器,可以在作者网站[4]或者GitHub上面下载到源代码,它是一款事件驱动的、模块化的基于C++的模拟器,内置了多种FTL策略,能够提供响应时间、能耗的模拟及许多额外的统计信息,新版本的Flashsim还提供了SSD RAID的模拟,功能上算是比较完善了。Flashsim有基于Disksim的版本和可以独立使用的版本,比较推荐大家使用独立的版本。

下面就为大家更加详细的介绍一下Flashsim的软硬件结构模型。

利用C++的面向对象特性,Flashsim实现了很好的模块化特性,使其内部结构与SSD的实际结构有着很好的映射关系,很便于我们理解。我们知道,SSD本身由控制器、RAM等硬件和运行在其上的FTL组成,而Flashsim模拟器也由这两部分组成,如图 1所示。实际上,新版的Flashsim还提供了数个图中所示的SSD连接组成RAID阵列进行模拟的功能。

SSD模拟器之Flashsim

图 1 Flashsim结构框图

Flashsim的硬件部分由处理器、内存、总线和flash芯片组成。首先简单介绍一下硬件部分的层级和功能,方便大家对模拟器与实际SSD的对应关系有个直观的认识。模拟器定义了以下模块:

  • SSD:用于例化整个模拟器并提供对外的调用接口,事件的建立、统计信息的获取等。

  • Package:包含一组共享总线通道的Die。

  • Die:一片Flash芯片,包含一组Plane。

  • Plane:包含许多Block,每个Plane具有一个与Page等大的寄存器,用来缓存数据和Plane内的merge操作。此处会产生寄存器读写延迟和merge延迟。(Merge操作是指FTL进行垃圾回收时,把多个块里面部分有效的数据合并到一个或者多个块的操作,按更新的类型还可以细分为Switch MergePartial MergeFull Merge三种,具体情况因为FTL类型不同而有所不同。这是SSD产生写入放大的直接原因)

  • Block(块):由许多Page组成,是擦除操作的最小操作单位。一个Block被擦除的次数是有限的,这项信息也可以被Flashsim统计。擦除Block会产生擦除操作延迟。

  • Page(页):维护每个Page的状态并且计算读写操作延迟。Page在Flashsim中有free(擦除后),valid(写后),invalid(Merge操作被复制到其他位置后)三种状态。是否模拟实际数据内容可以通过配置Flashsim选项来选择。

  • Controller(控制器):控制器是Flashsim软件部分和硬件部分的对接部件,它接收SSD发来的事件,向FTL查询如何处理之后,计算所耗的时间。控制器发送数据到总线时会先将其在RAM中缓存,会产生读写RAM的延迟。

  • RAM(内存):计算读写RAM的延迟。

  • Bus(总线):把事件分发到合适的通道。

  • Channel(通道):调度事件。每个通道维护一个调度表来记录通道的使用,新事件在依赖满足之后会被安置到下个可用的时间槽内。通道的调度将在之后做具体讲解。

从SSD开始,上层的部件负责下层部件的例化,用户只需要通过修改配置文件来配置每个层级包含多少个下层单元。

Flashsim的软件部分也就是FTL,另外,为了对事件进行描述和记录,Flashsim还定义了Event和Address两个类,用于在各层之间传送操作信息和记录事件处理状态,在此不再详述。SSDFans先前已有文章介绍过,FTL全称Flash Translation Layer,用于做逻辑地址和物理地址的转换,提供SSD这种具有读、写、擦除三种操作的存储设备和传统仅具有读、写两种操作的硬盘之间的兼容转换,考虑到SSD的寿命问题,FTL还有磨损平衡(Wear Leveling)、垃圾回收(Garbage Collect)及坏块管理(Bad Block Management)的功能。Flashsim的FTL包含了磨损平衡和垃圾回收功能。现在Flashsim内置的FTL有Page-level,BAST,FAST,DFTL和Bimodal几种。

各个模块具体包含哪些信息,留出了哪些接口,可以参考Flashsim的类图,对各个模块本身和模块间的关系有比较清晰的展现。由于类图比较复杂,在此不再给出,它已经包含在Flashsim的源码包中,可以下载查看。

下面展开讲解一下总线通道交叉存取,这是Flashsim调度中比较复杂的部分。上面提到,每个总线通道由一个Package中的多片Die共享,而各个总线通道之间是独立的、并行工作的。于是,连续到来的多个事件在一个总线通道上的操作处理有时是交叉进行的,总线通道上的交叉存取操作如图 2所示。总线上有数据传输时总线会被锁定。对于读操作,如图 2(a),会首先发送控制信号让Flash Die准备数据(Ctrl);Flash Die接收到读命令后会读取数据(Rd),此操作不占用总线,总线可以处理其他请求;然后锁定总线,发送控制信号请求Flash Die发送数据;最后,锁定总线,传输实际数据(Data)。可以看到当请求R1处于Rd阶段时,它不占用总线,因此请求R2发送了控制信号,而此时R1的第二次Ctrl开始之前剩余的时间不足以发送R3的Ctrl,于是它不能开始。对于写操作,如图2(b),首先锁定总线,发送控制信号通知Flash Die它将接收到数据(Ctrl);然后,继续锁定总线,发送实际数据(Data);最后,Flash Die写入数据(Wr)。类似地,在R1的Wr阶段,它不占用总线,可以处理R2的Ctrl和Data。即,当前一个请求虽然未完成,但是未占用总线时(读操作的Rd阶段,写操作的Wr阶段),总线会评估是否有充足的时间处理其他请求,如果可以的话,处理请求,否则,令其他请求等待。这种调度方式使请求在总线上交叉处理,能使总线得到更高效的利用。

SSD模拟器之Flashsim

图 2 Flashsim总线交叉存取

总结一下Flashsim的事件处理流程:首先,SSD接收到事件,传递给Controller,Controller通过FTL把一个多Page的请求转换成一个事件列表,并把列表中的每个事件发送到对应的总线通道,总线通道处理分发各个请求。最终,Merge事件可以在Flash Die或者Plane模块处理,Erase事件在Block中处理,Read和Write事件在Page中处理。

表 1 模拟参数配置及实际SSD参数

SSD模拟器之Flashsim

对用表 1所示配置(由于实际SSD资料不充分,有些配置是假定的)的Flashsim和两款实际的SSD进行测试后,得到的结果如图 3所示。可以看到,在各种的激励条件下,Flashsim和实际SSD显示出相似的趋势变化,说明Flashsim能够有效的模拟SSD的特性。

SSD模拟器之Flashsim

图 3 测试结果对比(Real SSD1: MTron, Real SSD2: Super Talent, Flashsim1: page-based FTL, Flashsim2: DFTL)

综上,可以看到,Flashsim是一款功能丰富、结构清晰、模拟效果真实的SSD模拟器,大家可以试着使用一下,也许能对你理解SSD有不小的促进作用。不过,Flashsim本身的文档资料不够充分,希望改进它或者把它用到开发研究中的话,就需要好好地调研并读一下它的代码了。

参考文献:

[1] Kim, Youngjae, et al. “Flashsim: A simulator for nand flash-based solid-state drives.” Advances in System Simulation, 2009. SIMUL’09. First International Conference on. IEEE, 2009.

[2] Hu, Yang, et al. “Performance impact and interplay of SSD parallelism through advanced commands, allocation strategy and data granularity.” Proceedings of the international conference on Supercomputing. ACM, 2011.

[3] Prabhakaran, Vijayan, and Ted Wobber. “SSD extension for DiskSim simulation environment.” Microsoft Research (2009).

[4] http://csl.cse.psu.edu/hybridstore