SSD的核心设计全在这篇论文里啦
Design Tradeoffs for SSD Performance
这是一篇2008年发表在USENIX的会议论文,引用次数达到1227次
代表什么,不管是期刊还是会议论文,要记得引用哦
摘要
本文介绍了此类设计选择的分类,并使用跟踪驱动的模拟器和从实际系统中提取的工作负载跟踪分析各种配置的可能性能。我们发现SSD性能和生命周期对工作负载非常敏感,并且通常较高的复杂系统问题出现在存储堆栈中甚至在分布式系统中,与设备固件相关。
SSD性能研究点:
延长和带宽:
- 读写可以多快
- 随机写会慢
永久行: - 最快多久可以代替传统硬盘
- Flash块受磨损影响
Introduction
SSD设计中出现的许多问题似乎都模仿了以前在存储堆栈中出现的问题。在解决这些难题时,设计选择有相当大的自由度。我们表明以下系统问题与SSD性能有关:
- data placement: 在SSD的芯片上仔细放置数据不仅对负载平衡至关重要,而且对于实现耗损均衡至关重要
- parallelism: 任何给定闪存芯片的带宽和操作速率都不足以实现最佳性能。因此,存储器组件必须协调以便实行并行操作。
- write ordering:Nand闪存的属性给SSD设计者带来了难题。小的,随机排序的写入尤其棘手。
- workload management: 性能高度依赖于工作负载。例如,在顺序工作负载下产生良好性能的设计决策可能不会使非顺序工作负载受益,反之亦然。
随着SSD复杂性的增加,现有的磁盘模型将不足以预测性能。特别是,由于磁盘写入操作的位置,随机写入性能和磁盘寿命会有很大差异。我们引入了一种基于清除效率来表征这种行为的新模型,并提出了一种新的耗损均衡算法来延长SSD寿命。
2.Nand背景
Bandwidth and Interleaving
闪存包接收命令和传输数据的串行接口是SSD性能的主要瓶颈。三星部分需要大约100μs才能将4KB页面从片内寄存器传输到片外控制器。这使将数据从NAND单元移入寄存器所需的25μs相形见绌。当这两个操作串联时,闪存包每秒只能产生8000页读取(32 MB /秒)。如果在die内采用交织,则单个部分的最大读取带宽提高到每秒10000个读取(40 MB /秒)。另一方面,写入每页需要与读取相同的100μs串行传输时间,但编程时间为200μs。在没有交错的情况下,这给出了每秒3330页(13 MB /秒)的最大单部分写入速率。交错串行传输时间和程序操作使总带宽加倍。理论上,因为我们正在考虑的封装上有两个独立的die,我们可以将两个die上的三个操作交错放在一起。这将允许写入和读取以串行互连的速度进行。
当操作等待时间大于串行访问等待时间时,交错可以提供相当大的加速。例如,在某些情况下,昂贵的擦除命令可以与其他命令并行进行。作为另一个示例,尽管单个写入操作的成本为200μs,但是如图所示,两个封装之间的完全交错packages复制可以以接近100μs的每页 进行。这里,4个源平面和4个目标平面以高速复制pages而不在同一plane对上执行同时操作,同时最佳地利用连接到两个闪存die的串行总线引脚。加载pipe后,每隔一段时间(100μs)完成写入。
并行的研究:采用交织技术,外部串行,内部并行。
即使闪存架构支持交错,它们也会受到严格限制。因此,例如,同一闪存plane上的操作不能交错。这表明相同的package交错最适用于精心设计的一组相关操作,例如图2所示的多页读或写 。我们检查的三星部件支持快速内部复制操作,允许将数据复制到片上的另一个模块而不会穿过串行引脚。这种优化是有代价的:数据只能在同一个闪存plane(2048块)内复制。两个这样的副本本身可以在不同的plane上交错,结果产生与图2所示的完全交错的封装间复制相似的性能,但不要垄断串行引脚。
3 SSD基础
3.1 Logical Block Map
NAND闪存的性质决定了写入不能像在旋转磁盘上那样执行。此外,为了实现可接受的性能,必须尽可能顺序执行写入,如在log中。由于每个单个逻辑磁盘块地址(LBA)的写入对应于不同闪存页面的写入,因此即使最简单的SSD也必须在逻辑块地址和物理闪存位置之间保持某种形式的映射。我们假设逻辑块映射保存在易失性存储器中,并在启动时从易失性存储器重建。
采用allocation pool的抽象来讨论logical block map,以考虑SSD如何分配flash blocks来服务写入请求。处理写请求时,每个目标logical page(4KB)都是从预先确定的闪存池中分配的。allocation pool的范围可能与一个闪存plane一样小,也可能与多个闪存packages一样大。在考虑allocation pool的属性时,会想到以下变量。
- Static map:每个LBA的一部分固定映射到特定allocation pool
- Dynamic map:LBA的非静态部分是allocation pool映射的lookup key
- Logical page size:映射条目的引用大小可能与闪存block(256KB)一样大,也可能小到四分之一page(1KB)
- Page span:逻辑页面可能跨越不同packages上的相关pages,从而创建了并行访问部分pages的可能性
以上这些变量受三个条件的约束: - Load balancing:最理想的是,I / O操作应在allocation pool 之间平衡
- Parallel access:分配LBA到物理地址时,应尽可能少干扰并行访问这些LBA的能力。例如,如果始终同时访问LBA0…LBAn,则不应将它们存储在需要逐个访问的组件中
- Block erasure:如果没有先擦除,就无法重写Flash页面。只能删除固定大小的连续页面块
定义allocation pool 的变量会与这些约束进行权衡。例如,如果LBA空间的大部分是静态映射的,那么平衡负载的余地很小。如果连续范围的LBA被映射到相同的物理die上,则large chunk中的顺序访问的性能将受到影响。使用较小的逻辑页面大小,将需要更多工作来消除擦除候选者的有效页面。如果逻辑页面大小(单位跨度)等于块大小,则擦除被简化,因为写入单元和擦除单元是相同的,但是所有小于逻辑页面大小的写入都会导致读取 - 修改 - 写入操作涉及逻辑页面的部分未被修改。
RAID系统通常跨多个物理磁盘划分逻辑上连续的数据块(例如64KB或更大)。在这里,我们使用fine granularity精细粒度来在多个闪存die或package上分配逻辑页面(4K)。这样做既可以分配负载,也可以将连续的页面放在可以并行访问的不同package上。
3.2 Cleaning
使用flash blocks作为allocation pool中的自然分配单元,在任何给定时间内,一个pool中可以具有很多可用于保持写入的active blocks,为了支持继续分配新的活动块,我们需要一个垃圾收集器来枚举以前使用过的块,这些块必须被擦除和回收。如果logical page size小于闪block size, 则必须在擦除之前清除闪存块。Cleaning可以这样总结,当完成一个page写入,那么之前page映射的page 位置将被取代,因为这个位置的内容现在已经被更新了。在回收候选的block时,所有未被取代的page必须在擦除前写入其他位置。
最坏的情况下,当被取代的页面均匀地分布在所有块上时,必须为每个新数据写入发出N-1个cleaning写入( 每个块有N个 页面)。当然,大多数工作负载会产生写入活动的集群&