当前位置:首页 >> 信息与通信 >>

SSDsim


5 固态盘模拟器 SSDsim 的设计实现
作者:胡洋 说明:本文摘自胡洋博士毕业论文。 Yanghu@foxmail.com

固态盘模拟器可以给研究开发人员提供一个前期功能验证的手段,通 过固态盘模拟器的模拟,可以以最低开发成本,提前验证所设计的硬件结 构,软件算法的有效性,而最终设计出满足预定目标的固态盘产品。目前 开源的固态盘主要是两个:一个

是微软开发的 disksim 的固态盘模块 [46] ,另 外一个是宾夕法尼亚州立大学开发的固态盘模拟器 [47] ,这两个模拟器均未 实现高级命令的模拟,也不能对能耗进行模拟,最重要的一点是,这两个 模拟器没有经过验证,无法确保模拟结果的准确性。 本章介绍一个自主开发的高准确性、模块化、可配置的固态盘模拟器 SSDsim ,它能够对高级命令、能耗进行模拟,最终要的一点是它的模拟结 果经过了基本的验证。本章从 SSDsim 的设计思路,总体框架,操作流程, SSDsim 的验证工作,全面介绍 SSDsim 。 本章的结构如下: 5.1 节 阐述 SSDsim 的整体设计思路; 5.2 节介绍 SSDsim 的 总体框架 ,包括重 要的数据 结 构,模拟 流程等; 5.3 节介绍 了 SSDsim 的操作流程; 5.4 节给出了 SSDsim 的验证过程。 5.5 节是本章小结。

5.1 SSDsim 的设计思路
固态盘是一个既有系统软件,又有系统硬件的嵌入式系统, SSDsim 需 要对固态盘进行模拟, 就需要对固态盘上的软件算法, 硬件行为进行模拟。 SSDsim 作为一个模拟软件,其上的软件算法与真实系统的系统软件基本类 似,因此,模拟的关键在于对固态盘系统硬件的模拟。 而固态盘的系统硬 件是由多个通道、多个芯片组成,闪存作为固态盘硬件的核心,是 SSDsim 模拟的关键点。所以 SSDsim 的模拟就是围绕闪存的行为模拟进行的。 SSDsim 可以提供对时间和能耗的模拟。下面分别介绍 SSDsim 对时间 和能耗的模拟原理。

5.1.1 时间模拟

一般来说,模拟器的驱动方式分三种类型,即时间驱动,事件驱动和请 求驱动。时间驱动的模拟器需要设置一个时间的步进长度,每前进一个步 进时间窗口,系统时间增加一个步进长度,在处理器的模拟器中经常用到 这种类型的模拟方法;事件驱动的模拟器是根据系统内部各个部件的状态 改变来修改系统时间, SSDsim 就是采用的这种方式的驱动方法;请求驱动 是根据外部请求的到达来修改系统时间,这种方法实现简单,但是精确性 不高。 在高性能固态盘中, 存在三类主要的部件, 既固态盘中的嵌入式处理器, 内存颗粒,和闪存颗粒。处理器的时钟通常大于 100MHz ,既单个时钟的时 间为 10 纳秒甚至更短; 内存的读写操作时间是纳秒级; 与此形成对比的是, 闪存颗粒的读写时间是微秒级。因此在 SSDsim 中,只考虑对闪存的读写擦 除操作的时间开销,内存的读写时间开销取一个平均值,忽略处理器的时 间开销。对于一个独立的读、写、擦除操作,可以根据公式 5.1 、 5.2 、 5.3 获得准确的时间开销。表 5.1 中介绍了三个公式中出现的变量,表中所列参 数具体值取自具体的闪存芯片的数据手册 [26] 。

读操作: 7×t WC +t R +PS×t RC 公式 5.1 写操作: 7×t WC +PS×t WC +t PROG 公式 5.2 擦除操作: 5×t WC +t ERASE 公式 5.3 表 5.1 简称 tR t PROG t ERASE t WC t RC PS 时间开销公式中的主要变量 含义 数据从目标物理页中读到分组的寄存器所消耗的时间 数据从分组的寄存器写到目标物理页所消耗的时间 目标物理块的擦除时间 通过数据总线上向寄存器传输一个字节的数据所消耗的时 间 通过数据总线从寄存器向外传输一个字节的数据所消耗的 时间 传输的数据量 25 纳秒 时间 20 微妙 200 微 妙 1.5 毫秒 25 纳秒

图 5.1 是一个闪存读操作过程。从图中可以看到,一个读操作分成三个

阶段:输入命令地址阶段、访问介质阶段、数据传输阶段。公式 5.1 中的三 个部分分别对应这三个阶段。第一个部分是输入命令地址阶段耗费的时间。 一个读请求,首先花费一个 t WC 时间通过总线传输一个起始命令( 00h ) ,之 后花费 5 个 t WC 时间通过总线传输读操作的地址,紧接着是花费一个 t WC 时 间传输结束命令( 30h ) ,因此公式 5.1 中第一个部分是 7 个 t WC ;公式的第 二个部分是闪存将数据从介质中读到分组的数据寄存器上,这个过程如图 5.1 中忙( busy)状态所指。在读操作中这个时间是 t R ;公式的第三个部分 是数据的传输部分,在这个部分,上一阶段读出的数据将从数据寄存器通 过总线传输到通道控制器的缓存中,这个部分的传输时间与传输的数据量 有关,因此在公式 5.1 的的三个部分需要考虑传输的数据量 PS 大小。

tWC WE tRC RE tR I/O0~7/15 R/B
忙:busy
00h 列地址1 列地址2 行地址1 行地址2 行地址3 30h 数据0 数据1

≈ ≈


数据N-1

第一阶段 命令地址输入

第二阶段 访问介质

第三阶段 数据输出

图 5.1

闪存读操作流程

tWC WE RE

I/O0~7/15 R/B

≈ ≈



80h

列地址1 列地址2 行地址1 行地址2 行地址3

数据0

数据1

数据N-1

10h

tPROG
忙:busy

第一阶段 命令地址输入

第二阶段 数据输入

第三阶段 访问介质

图 5.2 闪存写操作流程

图 5.2 是一个闪存写操作过程。从图中可以看到,一个写操作分成三个 阶段:输入命令地址阶段、数据传输阶段、访问介质阶段。公式 5.2 中的三 个部分分别对应这三个阶段。第一个部分是输入命令地址阶段耗费的时间。 一个写请求,首先花费一个 t WC 时间通过总线传输一个起始命令( 80h ) ,之 后花费 5 个 t WC 时间通过总线传输写操作的地址, 在传输完数据之后将花费 一个 t WC 时间传输结束命令 ( 10h ) , 因此公式 5.2 中第一个部分是 7 个 t WC ; 公式的第二个部分是将数据从通道控制器的缓存传输到分组的数据寄存器 上的传输阶段,这个部分的传输时间与传输的数据量有关,因此在公式 5.2 的的第二个部分需要考虑传输的数据量 PS 大小;公式的第三个部分是访问 介质阶段,在这个部分,上一阶段传入的数据将从写到介质中,这个过程 如图 5.2 中忙( busy)状态所指,在写操作中这个时间是 t PROG 。 内存颗粒是固态盘中的独立服务单元,闪存通道相互之间也是独立的, 在 SSDsim 中,将这些单元称之为独立单元。在 SSDsim 中,每个独立单元 设置四个时间和状态变量:当前状态、当前状态时间、下一状态、下一状 态预计时间。当前状态表示这个独立单元的当前所处的状态,下一状态表 示这个独立单元从当前状态将进化到的下一状态。宏观上来看,固态盘中 的闪存颗粒和闪存通道都存在两种状态,既工作状态( busy )和空闲状态 ( idle ) 。从微观上看,根据读、写、擦除的状态变化,闪存颗粒存在四种 状态,包括空闲状态、接收命令地址状态、介质操作状态和数据传输状态, 后三种状态使得闪存颗粒处于工作状态;闪存通道存在三种状态,包括空 闲状态、数据传输状态和命令地址传输状 态,后两种状态使得闪存通道处

于工作状态。表 5.2 中列出了这几种状态的名称和含义。图 5.3 是这些状态 之间的状态变化图。

表 5.2 1 2

SSDsim 中独立单元的各种状态 含义 空闲 通 道 命令地址传 输 数据传输 空闲 介质操作: 芯 写 介质操作: 读 接收命令地 址 数据传输 tR 7×tWC 接受或发送的数据量 ×tRC 片 传输的数据量 ×tRC (0,∞) tPROG 停留时间 (0,∞) 7×tWC

独立服务单元状态 CHANNEL_IDLE CHANNEL_C_A_TRANSFER

3 CHANNEL_DATA_TRANSFER 4 5 6 7 8 CHIP_IDLE CHIP_WRITE_BUSY CHIP_READ_BUSY CHIP_C_A_TRANSFER CHIP_DATA_TRANSFER

1

读操作状态转换流程

1

写操作状态转换流程

状态1 CHANNEL_IDL E 4 状态5 CHIP_WRITE _BUSY 1

状态4 CHIP_IDLE

1

1 2

3

4

3

1 4 3 2 状态8 CHIP_DATA_ TRANSFER 3

状态6 CHIP_READ_ BUSY

状态2 CHANNEL_C_A _TRANSFER

状态3 2 CHANNEL_DAT A_TRANSFER

状态7 CHIP_C_A_T RANSFER

2

固态盘通道状态变化

闪存芯片状态变化

图 5.3 读写操作状态变化图

例如,对于一个执行读操作的内存颗粒而言,假设当前状态是接受命令 地 址 状 态 ( CHIP_C_A_TRANSFER ) ,则下一个状态必然是读介质状态 ( CHIP_READ_BUSY ) ,如图 5.3 从状态 7 到状态 6 的转变。表 5.2 给出了

各个状态的停留时间,独立单元的下一状态预计时间就是依据每个状态的 停留时间计算获得。在 SSDsim 中,状态的转变就是一个事件,每一个事件 的发生将招致 SSDsim 的系统时间向前推进。 具体来说, 时间的推进方法是: 已知每个独立单元的当前状态,和当前状态时间,同时下一状态和下一状 态的预计时间可以通过图 5.3 和表 5.2 获得,在所有独立单元中寻找最先到 达的下一个状态的时间,作为 SSDsim 的新的系统时间,周而复始地使模拟 不断向前推进。通过对所模拟的固态盘内的每个状态进行观测,可以准确 地得到对每条外部请求的响应时间,从而完成 SSDsim 的时间模拟。

5.1.2 能耗模拟

SSDsim 在提供对时间的模拟同时, 提供了对能耗的模拟。 在固态盘中, 存在三种主要的耗能元件,包括处理器,内存颗粒和闪存颗粒。因为不同 的固态盘所使用的处理器不一样,不管采用什么样硬件结构和软件算法, 处理器的能耗基本相同,所以在 SSDsim 中,不考虑处理器的能耗,只考虑 内存和闪存的能耗。 闪存芯片是 COMS 器件,只有在对其进行读写擦除操作时才产生能量 的损耗。闪存芯片的数据手册 [26] 给出了芯片在不同状态之间转换时的电流、 电压(通常,电压保存 3.3V 不变,电流在不同状态下有些区别) ,时间可 以根据前面描述的方法获得, 因此在 SSDsim 中可以获取闪存每次读写擦除 操作的能耗值。 固态盘中需要一定的内存空间存储映射关系和缓存数据, 通常采用两种 类型的内存, DRAM 或者 SRAM 。 SRAM 成本较高,容量较低,一般集成 在处理器中; DRAM 的成本较低,容量较大,一般是独立存在的。 DRAM 有 三 种工作状态,激活状态( active ) 、低功耗状态( standby ) 、刷新状态 ( refresh ) ,在对 DRAM 进行读写操作时, DRAM 处于激活状态;当短时 间内没有对 DRAM 进行读写操作时,DRAM 进入低功耗状态;当长时间内 没有对 DRAM 有读写操作, DRAM 就进入周期性刷新状态。 在 SSDsim 中, 每次对内存的操作的时间可以根据读写的数据量计算获得,所以 DRAM 处 于激活状态的能耗可以根据所使用的内存颗粒的电压电流以及内存操作时 间计算获得;当 DRAM 服务完一个读写操作后,随即进入低功耗状态,这 段时间是两次读写操作之间的间隔时间,也可以计算获得; DRAM 的刷新 过程与所服务的负载的时间跨度有关,特定 DRAM 芯片的刷新周期是一定 的,例如 64 毫秒,在 SSDsim 中可以根据负载的时间跨度, DRAM 的刷新 周期,以及 DRAM 的大小既 DRAM 刷新单位计算获得 DRAM 的刷新操作

所消耗的能耗。 SSDsim 通过采用上述的方法,分别获得闪存的能耗和内存的能耗,最 终获得所模拟的固态盘服务某个负载所耗费的能量。

5.2 SSDsim 的总体框架
本节介绍 SSDsim 的总体框架及其具体实现过程。

5.2.1 模块划分 SSDsim 用来模拟固态盘的硬件结构(包括闪存颗粒,固态盘内部通道 等) ,闪存转换层(包括数据缓存区、地址映射、垃圾回收及损耗均衡等) 。 SSDsim 分成三个逻辑模块,既硬件行为模拟层,闪存转换层,和数据缓存 层,这三个模块也是固态盘中标准的三个组成部分。 ( 1)硬件行为层 在硬件行为层, SSDsim 遵循 ONFI 2.2 协议 [19] 。根据 ONFI 2.2 协议, 不同的闪存厂商不但提供了除了基本的读、写、擦除命令,还提供了其他 类型的闪存命令。数据迁移( copy-back )命令使得数据从一个物理页移动 到同一个分组的另一个物理页。 多分组操作 ( multi-plane) 是一个组合命令, 它可以和读操作,写操作,擦除操作合并使用,既可以执行多分组读操作 ( multi-plane read ) ,多分组写操作( multi-plane write ) ,或者多分组擦除操 作( multi-plane write ) 。交错操作( interleave )也是一个组合命令,可以与 读、写、擦除甚至多分组操作组合在一起执行。交错操作是在同一个芯片 上的不同晶圆之间将多个数据传输过程流水执行。 因为在高性能的固态盘中, 上述的各种命令都使用到了, 所以在 SSDsim 中,为了能够模拟闪存的各种行为,必须实现这些命令的执行过程。所以 在硬件行为层, SSDsim 提供了对这些命令的模拟。 之前的文献 [20,21,22,23] 中,以及之前的实验都发现,不同使用程度的 固态盘的性能、能耗表现迥异,所以在固态盘模拟器中也需要有不同使用 程度的固态盘的模拟手段。在 SSDsim 中,设置一个参数( aged-ratio )来表 示不同的使用程度。当这个参数设置为 0 时,表示所要模拟的固态盘是一 个全新的没有写过的盘;当这个参数设置为 0.5 时,表示所要模拟的固态盘 用过一段时间,其中有 50% 的存储空间保存有失效数据。因此,在开始模 拟初始化时,根据这个参数的值, SSDsim 的硬件行为层将随机位置的闪存

物理页设置为失效的非空闲页。 ( 2)数据缓存层 数据缓存层对提高固态盘整体性能起着至关重要的作用,所以在 SSDsim 中,提供了对数据缓存层的行为模拟。在内存中,读写一个字节消 耗的时间是纳秒级,例如在 MT46V64M4 [56] 内存芯片中,是 5 纳秒。所以 读写内存的时间可以通过读写的数据量乘以每字节的时间得到。缓存数据 的最小单位是 512 字节, 所以读写缓存数据的时间可以确定。 因此在 SSDsim 的数据缓存层,通过计算数据量获得内存操作的具体时间。 数据缓存层还需要模拟各种固态盘的数据缓存管理算法, 例如最近最少 使用算法、最不经常使用算法等。在 SSDsim 中,数据缓存区的最小单位采 用一个结构体表示,结构体中最重要的成员是数据的逻辑地址。最小单位 的结构体根据某种缓存管理算法进行排序。 ( 3)闪存转换层 在 SSDsim 中,闪存转换层模拟固态盘的闪存转换层的各种算法,包括 地址映射、垃圾回收、损耗均衡。地址映射包括页映射、块映射、混合映 射、DFTL 等,垃圾回收算法包括贪婪算法等,损耗均衡算法包括动态损耗 均衡和静态损耗均衡。这个部分的算法与真实系统上的算法基本一致, SSDsim 上的部分代码可以直接移植到真实固态盘系统中使用。 闪存转换层对性能的影响主要是软件代码在处理器上执行的时间开销, 因为处理器的处理周期为几个纳秒,相对读写闪存的读写操作时间,速度 快三个数量级,在固态盘中,为完成一个物理页的读写操作,通常需要执 行许多行程序,执行这些代码通常需要消耗成千上万个处理器的时钟周期, 所以虽然单个时钟周期可以被忽略,但是在实际执行读写操作过程中,这 些软件开销不能被忽略。因为在模拟过程中需要将这个开销记录下来,在 SSDsim 中,采用一个估计值,近似地计算这个软件开销。因为这个软件开 销相对闪存的读写过程时间的比例还是很低,所以从整个模拟结果 来看, 这个估计值不会明显影响 SSDsim 的模拟准确性。 5.2.2 基本流程 本节介绍 SSDsim 的基本流程。图 5.4 是 SSDsim 的基本流程图。

初始化函数

预处理函数

旧化函数

寻找最近事件函数

获取外部请求函数

数据缓存层:

缓存管理函数

闪存转换层:

分布函数

硬件行为层:

处理函数

结果输出函数

图 5.4

SSDsim 的基本流程图

如图 5.4 中所示,在开始模拟之前,首先执行初始化函数( initialize ) , 通过这个函数 SSDsim 首先从参数文件中读入所有参数, 并且根据读入的参 数建立与之对应的结构体,例如相应的通道数,芯片数等。之后,执行预 处理函数( pre_process ) ,通过这个函数,将外部的请求文件逐条读入,预 先处理所有的读请求。预先处理读请求的目的在于,在映射表中将这些读 请求的数据的映射关系建立起来,以保证在正式的模拟过程中,读请求可 以根据这个映射关系从目标物理页读出该数据。预处理完成后,执行旧化 函数( make_aged ) ,这个函数根据参数文件给出的参数,在所模拟的固态 盘中生成部分保持有失效数据的存储空间,以模拟使用过一段时间的固态 盘。以上三个函数是模拟前准备过程。 模拟准备完成之后, 进入一个循环过程, 在循环中, 依次执行一下函数: 寻找最近事件函数 ( find_nearest_event ) , 获取外部请求函数 ( get_request ) , 缓存区管理函数( buffer_management ) ,分布函数( distribute ) ,处理函数 ( process ) ,结果输出函数( trace_output ) 。

寻找最近事件函数是在所有通道和芯片的下一状态预计时间中寻找距 离 SSDsim 系统时间最近的时间,作为 SSDsim 新的系统时间。只有保证系 统时间不断向前推进,才能使模拟过程继续。 获取外部请求函数根据 SSDsim 的系统时间、外部的请求文件指针所指 的外部请求到达时间、请求队列长度来决定是否要将文件指针所指的外部 请求读入到 SSDsim 中,所有读入 SSDsim 的请求将挂在 ssd_info 结构体的 request 队列上。 缓存区管理函数是用来模拟固态盘中缓冲区域对请求的服务过程。 将新 进来的请求首先在缓存区域寻找其目标数据。例如,如果是读请求,在缓 冲区域找到这个读请求的数据,则直接从缓冲区域将这个数据读出,然后 响应这个读请求;如果是写请求,在缓冲区域找到这个写请求的数据,则 直接将这个数据写到缓冲区域替换缓冲区域原来的旧数据,然后响应这个 写请求。如果请求的数据不在缓存区,则需要进一步访问闪存。 当需要访问闪存时,需要执行分布函数,在分布函数中,根据参数文件 给出的分布方法参数,将外部请求分散成独立的子请求,挂在相应的通道 的子请求队列( sub_request ) 。 处理函数根据子请求的数量,选择合适的闪存操作,模拟闪存的访问过 程。根据不同的闪存操作类型和请求大小,可以得到执行这个子请求的时 间,当一个外部请求的所有子请求完成后,就可以得到处理这个外部请求 总的服务时间,响应时间。 当一个外部请求的所有子请求完成后, 在结果输出函数中将这个外部请 求的模拟结果输出到结果输出文件。

5.2.3

基本的数据结构

在 SSDsim 中,存在三种类型的数据结构,他们分别是系统结构类、参 数类、操作类。下面分别讨论这三类数据结构。 ( 1)系统结构类数据结构 系统结构类数据结构组成 SSDsim 的基础平台。在这一类数据结构中, 每一种数据结构表示一种固态盘的逻辑或者物理单元。 表 5.3 列出所有系统 结构类数据结构。

表 5.3 编号 命名

系统结构类数据结构一览表 主要成员

模拟对象

1

ssd_info

一个固态盘

channel_head 、 dram 、 current_time 、 request_queue 、request_tail 、{子请求 } 、 {统计 }

2 3 4 5 6

channel_info chip_info die_info plane_info blk_info

一个通道 一个芯片 一个晶圆 一个分组 一个物理块

chip_head 、 { 状态 +时间 } 、 { 子请求 } 、 {统 计} die_head 、 { 状态 +时间 } 、 { 统计 } plane_head blk_head 、 add_reg_ppn 、 free_page page_head 、 erase_count 、 free_page_num 、 invalid_page_num 、 last_write_page

7 8 9 10 11 12

page_info dram_info map_info buffer_info

一个物理页 存

valid_state 、 free_state 、 lpn

固 态 盘 中 内 map 、 buffer 映 射 关 系 区 {统计 } 、 map_entry 域 数 据 缓 存 区 {队列 } 、 { 统计 } 、 pTreeHeader 域

buffer_group 数 据 缓 存 节 {队列 } 、 group 、 stored 、 dirty_clean 点 entry 映射关系 Pn 、 state

如表 5.3 中所列,1~8 是固态盘中的物理单元,9~12 是固态盘中的逻辑 单元。 1~6 的结构体中第一个成员是构成模拟平台的关键成员 ( channel_head 、 chip_head 、die_head 、plane_head 、blk_head 、page_head ) 。如第一章中所描 述的固态盘的基本结构,固态盘中存在多个独立的通道,每个通道上存在 多个独立的芯片,每个芯片包括多个晶圆,每个晶圆中有多个分组,每个 分组由多个块组成, 多个页组成一个块。 在 SSDsim 中, 结构体 channel_info 、 chip_info 、die_info 、plane_info 、blk_info 、page_info 分别表示通道、芯片、 晶圆、分组、块、页。所要模拟的固态盘是什么样的硬件结构, SSDsim 中 就由这些结构体来表示这个固态盘的组成。假设固态盘中存在 a 个独立通 道,每个独立通道中存在 b 个独立芯片,每个芯片中有 c 个晶圆,每个晶 圆中有 d 个分组, 每个分组中有 e 个块, 每个块中有 f 个页。 那么在 SSDsim 中就有 a 个 channel_info 结构体, 每个 channel_info 结构体中有 1 个 chip_info 结构体指针,这个指针所指向的是一个有 b 个 chip_info 结构体数组。每个

chip_info 结构体中有一个 die_info 结构体指针,这个指针所指向的是一个 有 c 个 die_info 结构体数组,依次类推。在固态盘中,除了上述闪存的物理 结构,还有一个物理结构就是内存,在 SSDsim 中的 ssd_info 结构体中,使 用结构体 dram_info 来表示这个物理结构。 在 dram_info 中, 存在两个成员, 既 map_info 结构体和 buffer_info 结构体。 map_info 结构体的成员 map_entry 结构指针指向一个名为 entry 的 map_entry 结构体数组,这个固态盘中有多 少映射关系就有多少个 entry 成员。 Buffer_info 结构体的成员 pTreeHeader 指向一个平衡二叉树的根节点, 这个平衡二叉树的节点是 buffer_group 结构 体,每个 buffer_group 表示一个数据缓存区节点。图 5.3 表示的是 SSDsim 中系统结构类结构体之间的关系。 在 ssd_info 结构体中,除了如图 5.5 中列出的两个指针成员外,还存在 另 外 四 种 成 员 : current_time 是 SSDsim 的 系 统 时 间 ; request_queue 和 request_tail 在 SSDsim 中维持请求队列的队首, 队尾指针。 外部请求到达时, 先 挂在 这 个 队列 上 , 等 待目 标 通 道和 芯 片 空 闲后 再 被 服务 ; {统 计}是在 SSDsim 中用来记录一些高层次的统计信息,例如外部请求到达个数,写闪 存次数,读闪存次数等。 在 channel_info 和 chip_info 结构体中都存在 { 状态 + 时间 }成员,它们是 前面谈到过的独立单元的状态和时间:当前状态,当前时间,下一状态, 下一状态预计时间。当前状态表示这个通道或者芯片当前的状态;当前时 间是指开始这个状态的起始时间;下一状态表示,根据图 5.3 的状态转换图 中,当前状态的下一个状态;下一状态预计时间是下个状态开始的时间, 也 就 是当前状态结束的时间 。在 SSDsim 中根据 ssd_info 中的系统时间 ( current_time )与每个通道、芯片的下一状态预计时间进行比较,可以得 到每个通道、芯片的新的当前状态。 在 ssd_info 和 channel_info 中都存在 { 子请求 } 成员,这个成员是指向子 请求队列的指针,所有外部请求到达固态盘后,需要将外部请求按照闪存 页大小分割成独立的子请求。在 SSDsim 中,将分割出来的子请求,分别挂 在 { 子请求 } 队列上。写请求到达时,不能立即确定写操作的物理位置,所 以写请求的所有子请求全部挂在 ssd_info 上;读请求可以根据映射表,确定 读操作的物理位置,所以读请求的所有子请求全部挂在 channel_info 上。

ssd_info * dram 其他 * channel_head

其他成员

channel_info 0 * chip_head

其他成员

channel_info 1 * chip_head

其他成员

channel_info a * chip_head

chip_info 0

chip_info b

其他成员 * die_head

其他成员 * die_head

dram_info

map_info buffer_info * map_entry 其他 其他 * pTreeHeader
entry 0 entry 1 entry n-1

die_info 0

die_info c

其他成员 * plane_head

其他成员 * plane_head

pn state pn state

pn state
buffer_group x

plane_info 0

plane_info d

其他成员 * block_head

其他成员 * block_head

其他 指针 group state dirty_clean
block_info 0 block_info e

其他成员 * page_head

其他成员 * page_head

buffer_group y

buffer_group z

其他 指针 group state dirty_clean

其他 指针 group state dirty_clean

page_info 0

page_info f

其他成员

其他成员

图 5.5SSDsim 中系统结构类结构体的相互联系

在 ssd_info 、 channel_info 、 chip_info 和 buffer_info 中,存在 { 统计 } 成 员, 这个成员用来记录各种统计信息。例如在 ssd_info 中需要记录总的请求 数等;channel_info 需要记录在这个通道上的子请求数量等;chip_info 需要 记录在这个芯片上的子请求数量等; buffer_info 需要记录数据缓存区的命中 率等。 plane_info 中存在 add_reg_ppn 成员,这个成员用来记录在这个分组中 进行读操作时的数据的物理页号。 因为在 SSDsim 中需要模拟多分组读操作: 当同一个晶圆的多个分组读出数据时,不同分组之间的数据需要相互区分, 所以设置这个成员。另外, free_page 用来记录在这个分组中还剩多少空闲 页,以此作为触发垃圾回收的条件。 blk_info 中 存 在 erase_count 、 free_page_num 、 invalid_page_num 、 last_write_page ,它们分别用来记录这个物理块被擦除的次数,剩余多少空 闲页,有多少保存失效数据的页,以及上一次写操作时使用的页号。前面 三项都是具体的统计信息。在闪存的物理块中,需要按照物理页的编号, 依次写入数据,第四项 last_write_page 是用作这个写入顺序的记录,下次对 这个物理块进行写操作时,直接将这个值加一即得到可以写入的物理页地 址。 page_info 中存在 valid_state 、 free_state 、 lpn 三个成员,分别表示一个

物理页中每个扇区的有效状态,空闲状态和所记录的逻辑页号。因为在部 分闪存中,比如 SLC 类型的闪存 K9NBG08U5A
[26]

中,允许只写入一个扇

区的数据,而其他几个扇区在后续时间再写入,所以可能出现一个情况就 是在一个物理页中,部分扇区有数据,部分扇区是空闲状态,在有数据的 部分扇区中可能有部分数据是失效数据。 因此在 SSDsim 中, 使用 valid_state 、 free_state 来记录一个物理页内部分有效、部分空闲的情况。lpn 用来记录保 存在这个物理页中数据的逻辑页号。 在固态盘的内存中,存在两种逻辑结构,既映射关系和数据缓存,在 SSDsim 中使用 map 、 buffer 分别模拟这两个逻辑结构。 map 是一个 map_info 类型的指针,它指向一个 map_info 结构的结构体,在这个 map_info 结构体 内,有一个 entry 结构体的指针 map_entry , map_entry 指向 n 个映射关系, 在 SSDsim 中, 每个映射关系用一个 entry 结构体来表示,每个 entry 结构体 中有 pn 和 state 两个成员。 pn 表示这个逻辑页所在的物理页; state 表示这 个逻辑页中有效子页的位置。buffer 是一个 buffer_info 类型的指针,它指向 一个 buffer_info 结构的结构体,在这个结构内,包括统计信息成员,和指 向缓存节点的指针。 在 SSDsim 中缓存节点使用结构体 buffer_group 来表示。 ( 2)参数类数据结构 因为 SSDsim 需要模拟不同的硬件结构,软件算法,所以需要提供外部 输入不同参数的方法。在 SSDsim 中,通过参数文件的方式,将这些参数输 入,输入的参数需要记录在模拟程序中,以便 SSDsim 在模拟过程中随时查 询。所以在 SSDsim 中存在一类数据结构:参数类数据结构,用作记录这些 参数。表 5.5 列出参数类数据结构的主要部分。

表 5.4 参数类数据结构 编 号 1 2 3 ac_time_characteristics 时序参 数 dram_parameter parameter_value 内存参 数 整体参 数 active_current 、 sleep_current 、 voltage 其他参数 tWC 、 tRC 、 tR 、 tPROG 命名 意义 主要成员

在表 5.4 中,第一个数据结构用来记录闪存的时序参数;第二个数据结

构用来记录内存颗粒的电气参数,包括各种状态下的电流和电压;第三个 数据结构包括以上两个结构体,并且还包括其他一些参数。 ( 3)操作类数据结构 表 5.5 操作类数据结构 编号 1 2 3 4 5 命名 request sub_request local gc_info gc_operation 意义 外部请求 子请求 物理地址 垃圾回收信息统计 垃圾回收操作请求 主要成员 类型、 LSN 、大小、到达时间 类型、 LPN 通道号、芯片号、晶圆号、分组 号、块号、页号 { 统计 } local

表 5.5 是 SSDsim 中操作类的数据结构。在固态盘内,从请求到达,到 响应请求,需要经过一系列的操作。当外部请求到达时,首先挂在请求队 列上,在 SSDsim 中,使用 request 结构体来记录每一个到达的外部请求, 这个结构体中包括请求到达的时间,类型(读还是写) ,请求起始地址,请 求的数据量大小。在 SSDsim 中,使用 sub_request 结构体来记录外部数据 转换成的子请求,这个结构体中包括请求类型,目标地址,子请求中的目 标地址就是逻辑页。local 结构体用来记录固态盘内物理的地址。 gc_info 结 构体用来记录垃圾回收操作的各种统计信息。gc_operation 结构体记录被触 发的垃圾回收请求,其成员是需要垃圾回收的地址(通道号、芯片号、晶 圆号、分组号) 。

5.3 SSDsim 的操作流程
SSDsim 用来模拟固态盘的行为,根据外部输入的请求流,得出在特定 硬件结构,闪存转换层算法及数据缓存算法下固态盘的性能表现。为达到 这个目的, SSDsim 在开始模拟前,需要输入三个文件:参数文件、负载踪 迹文件( trace ) 、输出文件。 参数文件说明当前实验所模拟固态盘的硬件结构,闪存转换层算法及 数据缓存算法。参数文件的第一个部分包括两种类型的参数,硬件的组织 结构 (芯片内的晶圆数, 每个晶圆中分组的数量, 每个分组内的块数量等) ,

及时间参数;第二个部分包括两种类型的参数,能耗参数和闪存转换层配 置参数,比如所要模拟的固态盘的内存芯片的激活状态电流为 125mA ,低 功耗状态电流为 50mA ,刷新状态电流为 5mA,内存和闪存芯片的工作电压 为 3.3V 。 负载踪迹文件既通常所说的 trace 文件,用作记录特定的负载的所有的 请求的到达时间,请求的类型,请求的逻辑地址,请求的大小。负载踪迹 文件的所有请求都是按照时间顺序排列。 SSDsim 根据这个踪迹文件,可以 重现出这个特定负载或者应用环境下的请求流,通过参数文件设定的硬件 结构和算法,可以得到在这种负载下 该硬件结构和算法的性能,从而寻找 出在这个负载下最优的硬件结构和或算法。 输出文件是用来记录每个请求的响应时间,以及特定硬件结构和软件 算法在服务这个负载时的性能, 能耗统计结果。 每个请求的队列等待时间, 服务时间和响应时间都依次输出到输出文件中,在模拟完成后输出服务整 个负载的平均响应时间,总能耗,读写请求数等统计信息。

5.4 SSDsim 的验证
为了确认 SSDsim 的模拟结果准确性,需要将同一负载在 SSDsim 的模 拟测试结果与真实系统上的测试结果进行比较,如果两者相差不大,说明 SSDsim 的模拟结果是可信的,否则 SSDsim 的模拟结果是失真的。这一节 讨论 SSDsim 的验证过程。

调试口
MiniUSB

串口 内存

供电 模块

控制器

NANDFlash

NAND-Flash 通道1

图 5.6 固态盘原型系统

NAND-Flash 通道2

内存

验证 SSDsim 所采用的实验平台是华中科技大学信息存储及应用实验 室自主开发的一款固态盘原型系统,如图 5.6 所示。在这个固态盘原型中, 采用 mini-USB 作为外部接口,四颗 DRAM 颗粒作为内存,八颗闪存颗粒 组成两个独立的通道。 因 为 需 要 对 比 真 实 系 统 上 和 SSDsim 上 相 同 请 求 的 响 应 时 间 来 验 证 SSDsim 的准确性,所以在验证 SSDsim 时,采用了以下四种负载,如表 5.6 所示。

表 5.6 请求流名称 金融 1 ( Financial-1 ) 金融 2 ( Financial-2 ) 邮件服务( Exchange )

验证所使用的负载 例 间 8.2 毫秒 11.1 毫秒 3.0 毫秒 1179 毫秒

平均请求大小( KB ) 读 请 求 比 请 求 间 隔 时 (读 / 写) 2.3/3.8 (读 / 写) 2.3/2.9 (读 / 写) 15.2/14.5 23.2% 82.3% 99.9% 30.8%

网页搜索( Websearch ) (读 / 写) 15.2/8.6

在验证前,需要保证真实平台和 SSDsim 模拟平台的硬件、软件组织完 全一致。因此,通过设置参数文件,使得 SSDsim 所模拟的平台硬件结构同 真实平台的硬件结构是一致的,然后再将真实平台上的软件移植到 SSDsim 中。 验证 SSDsim 的准确性从两个方面进行:首先比较两个平台下,每个负 载的平均响应时间的差距,这可以从宏观上说明 SSDsim 的准确性;另外再 比较两个平台的负载中每个请求的响应时间的差距(通过每个请求响应时 间的分别积累函数进行比较) ,这可以从微观上说明 SSDsim 的准确性。图 5.7 是四个请求流在 SSDsim 上得到的平均响应时间与在真实平台上的到的 平均响应时间的差距。从图 5.7 中看出, SSDsim 的模拟结果与真实结果的 偏差在 2.0%到 2.9% 之间。所以从宏观上来说, SSDsim 的模拟结果基本准 确。

平均请求响应时间偏差

3.0% 2.5% 2.0% 1.5% 1.0% 0.5% 0.0% 金融1 金融2 网页搜索 2.4% 2.2% 2.0%

2.9%

邮件服务

图 5.7SSDsim 模拟结果与真实平台结果的偏差 图 5.8 列出在四个负载下, SSDsim 上模拟得到的每条请求的积累分布函 数与真实平台的真实值的积累分布函数。 图 5.8 左边的图是完整的积累分布 函数图,右边的图是左边积累分布函数图中拐点的放大图。从该图中,我 们看到,从微观上来说, SSDsim 的模拟结果与真实平台结果基本吻合。

1 0.8 0.6 0.4 0.2 0 0
1 0.8 0.6 0.4 0.2 0 0 1 2 3 4 响应时间 (纳秒)

1
1

0.8 0.6 0.4
5

0.8 0.6 0.4 0.2

0.2 0 0

0

10

6

0

1

2 3 4 5 6 响应时间 (纳秒) 106

响应时间 (纳秒)

5

10

(a) 金融1
1
1

15 106

2

响应时间 (纳秒)

4

6

(b) 金融2
1 0.8 0.6 0.4
1 0.8 0.6 0.4 0.2

8 107

0.8 0.6 0.4 0.2 0 0

0.8 0.6 0.4 0.2 0 0 2 4 6 8 响应时间 (纳秒) 10
6

0.2 0 0

10

0 0

0.5 1 1.5 响应时间 (纳秒)

107

2

0.5

1 1.5 2 响应时间 (纳秒) (c) 网页搜索

2.5 108

0.5

响应时间 (纳秒)

1

1.5

2

2.5

(d) 邮件服务

3 108

图 5.8 SSDsim 模拟结果与真实平台结果的积累分布函数

从本节所讨论结果来看, SSDsim 是一个具有较高准确性的固态盘模拟 平台。

5.5 SSDsim 的应用与发布
SSDsim 的开发完成为固态盘的研究提供了一个重要的研究工具,任何 固态盘上的硬件组织设计,软件算法设计均可以在 SSDsim 上快速实现,通 过运行各种真实的、合成的负载,得到一系列性能、能耗结果,从而完成 所做设计的功能性的验证。本论文前面所有实验,除 SSDsim 本身的准确性 验证实验以外,均是基于 SSDsim 完成的。 为了将 SSDsim 提供的所有的研究者使用,目前 SSDsim 已经作为一个 开源工具,所有源码放在网络上以供下载。下载地址为: storage.hust.edu.cn/SSDsim 。

5.6 本章小结
本章介绍了一款自主开发的固态盘模拟器 — SSDsim ,从 SSDsim 的设 计思路、总体框架、操作流程、模拟器的验证及 SSDsim 的应用多个方面讨 论介绍 SSDsim 。 SSDsim 提供了对固态盘的时间和能耗方面的模拟测试功能。从时间和能耗 的模拟方面介绍了 SSDsim 的设计思路。 SSDsim 分成三个主要模块:硬件 行为模拟层、闪存转换层、数据缓存层。三个层次依次对固态盘硬件结构, 固态盘中 FTL,固态盘中数据缓存进行模拟。本章还介绍了 SSDsim 的验证 过程:为确保 SSDsim 模拟结果的准确性,将 SSDsim 的模拟结果与真实系 统上的结果进行对比。进过对比发现, SSDsim 的模拟结果与真实结果基本 吻合,所以 SSDsim 的模拟结果准确可信。最后介绍了设计 SSDsim 的应用 与发布


相关文章:
SSDsim_user_guide
通过对所模拟的固态盘内的每个状态进行观测,可以准确 地得到对每条外部请求的响应时间,从而完成 SSDsim 的时间模拟。 5.1.2 能耗模拟 SSDsim 在提供对时间的...
cad
[ D:\Orcad\\yangezuoye\js-PSpiceFiles\SCHEMATIC1\dassd.sim ] "SCHEMATIC1-dassd" *** DEG C OPERATING POINT INFORMATION R1 v in 1k TEMPERATURE = v...
生产实习报告
SSDsim 所模拟的就是基于闪存(FLASH)的固态盘的读写 性能。 在过去的二十年间,CPU、主存等部件基本按照摩尔定律在性能和及程度上快速 提高,处理器性能和内存...
更多相关标签:
ssdsim 下载 | github | ssdsim 胡洋 |