AmmoMercy的技术博客

Stay hungry, stay foolish.

0%

Flashsim安装与解析

0 安装

git clone https://github.com/MatiasBjorling/flashsim

然后直接make 即可

可能出现的错误:

  1. g++:命令未找到 没安装g++

    CentOS 下yum install gcc-c++

    Ubuntu下 sudo apt install g++

  2. boost/multi_index_container.hpp:没有那个文件或目录 没安装libboost依赖

    CentOS 下yum install boost-devel

    Ubuntu下sudo apt-get install libboost

1 测试

输入./test进行测试

image-20210104093023694

SSD组成

一块SSD由硬件processing unit,bus,Flash chips

软件FTL(flash translation layer)组成

三种基本操作:erase、read和write。其中erase以block为单位,读写以page为单位。page由block组成。 page有三种状态free/erased、valid和invalid。free/erased表示其未被使用。其状态图如图所示

图中的out-of-place update(异位更新)指SSD在更新数据时,并不是写到原page,而是写到另一个空白的page。这是因为SSD不同于传统磁盘,不能直接在已经有数据的位置进行写,而是必须要在空白的位置进行写,根本原因是flash在本质上是一种特殊的EEPROM。out-of-place update的主要目的是耗损平均,wear-leveling。

FTL(Flash Translation Layer)层主要由三个部件组成,地址翻译、垃圾回收(GC)和耗损平均。主要用来做地址翻译,也被叫FTL层。地址翻译组件将磁盘系统的逻辑地址翻译为物理地址,使得SSD可以封装为普通的块存储设备。并且使用out-of-place update操作以隐藏erase操作,使用的Mpping-table存放在SSD内部的RAM中。GC顾名思义,是用来回收out-of-place update之后invalid block。因为SSD的每个block的寿命有限,所以平均利用每块block很重要,即要进行耗损平均。

模拟器

面向对象,事件驱动,c++编写,单线程。每个实际上的硬件都有与之对应的模拟器软件C++类,体现了良好的设计规范。下面简要介绍其组成。

硬件

SSD:SSD类提供了对Disksim的接口。该类创建事件对象——将Disksim 的 ioreq_event封装成事件对象,同时将事件时间流返回给Disksim。

Package:package就是一组共享bus的die。package类中在构造器中分配die,同时将die连入bus并分配和管理地址。

Die:一个die就是一片flash颗粒。包含多个plane。

Plane:plane由block组成,并且提供了一个单页大小的register用以进行总线传输。这个register也被用于页内的合并操作。

Block:block由page组成,是擦除操作的单位。当一块被擦除时,它包含的所有页都被擦除变成erased/free。相关事件对象更新时,会考虑擦除延迟时间。

Page:每个page都包含它的状态并且利用特读写延迟更新事件驱动对象,page状态有free/empty、valid和invalid,它们分别被在擦除操作、成功写入和merge操作之后被更新。

RAM:RAM类计算读写时间,RAM将事件驱动虚拟化提供给controller以送到bus。

Bus:bus类有许多由许多在同一个package的die共享的channel,bus测试事件地址并传递事件对象到合适的channel。Bus使用交叉存储技术

Channel:channels调度事件的使用,并且更新事件的时间值。每个channel都有一个调度表用来跟踪channel的使用,新的事件在下一个空闲时间段被调度。显然,调度表的大小和请求队列长度有关。

软件组件设计

事件:Flashsim的事件与Disksim的ioreq_event相关。每个事件都是使模拟器发生改变的方法和元素的合集。模拟器的对象传递事件对象然后更新事件对象的统计数据。事件就是真实SSD的I/O请求等真实发生的事件的映射。

地址:地址即从package到page每个硬件的地址。

FTL:FTL将逻辑地址翻译为物理地址,将一个多页事件变成一组有序单页事件以便controller执行。FTL负责进行硬件的并行操作以提升性能。

Wear Leveler:耗损平均器,负责进行耗损平均。

Garbage Collector:当写操作所选中的block是invalid状态时,GC就进行垃圾回收。GC将部分使用(未写满)的block合并起来,将原来的block擦除以腾出空间其他的GC算法也可以被模拟。

事件流

要使用SSD模拟器,首先要实例化一个从Disksim接收ioreq_event的SSD对象。SSD对象的详细设计如图:

在die层级数据的流通如图: