Solid-State Drive
Updated: Sep 12th, 2023
固态硬盘(Solid-State Drive,SSD)是一种使用集成电路设计制作的存储设备。SSD中没有可活动的机械部件,这是SSD与HDD在概念上的重要区别。固态硬盘中一般使用闪存(特别是NAND Flash)作为一种非易失存储介质,其具有非常好的随机读写能力,但同时也由于闪存本身具有的特性带来一些问题。因此基于闪存的存储设备还需要在其上增加一层Flash Translation Layer来更加充分利用闪存的性能以及在读写闪存过程中实现磨损均衡、数据纠错、坏块管理等。
固态硬盘的读写粒度
一块闪存芯片的结构如下图所示,大概分成LUN,Plane,Block、Page这几个级别,最小的粒度,page,就是SSD的读写粒度。这个粒度不同的SSD有些区别,在4K、8K,16KB不等。可以发现,这个粒度要比机械硬盘(机械硬盘中是512B的扇区)大很多。这会有一个问题:写放大问题。我可能指向写一个byte,但是实际在硬件中就写入了一个页,这样子无论是性能还是对硬件寿命都非常不好。
(图源《深入浅出SSD》P10)
固态硬盘中的FTL
对于这样的闪存芯片,我们不能够不加任何中间层就使用,试想一下,如果我重复读写某一个闪存芯片,某一个闪存芯片就先坏了(如NAND Flash闪存芯片寿命有限),显然是对用户非常不友好的。
所以,现在的每个SSD,实际的结构如下图所示,其在NAND和上层应用之间都有一个这样的中间层:FTL(Flash Translation Layer),FTL通过地址转换将用户的写请求转换到实际的闪存芯片上,并还包含有多种功能。如FTL能够实现磨损均衡,即在重复读写相同地址的数据块时,适当地将读写操作进行重定向防止某个闪存芯片寿命降低过快,平摊磨损。FTL算法的优劣与否,直接决定了SSD在性能、可靠性、耐用性的好坏。
(图源《深入浅出SSD》P12)
固态硬盘的进一步发展
现在随着SSD的发展,延迟越来越小(100us -> 10us -> 1us),带宽越来越大(500MB/s -> 3GB/s),原来为HDD而设计的总线和协议,现在已经成为了系统的瓶颈本身。因此,我们切换到带宽更大的总线,并使用了并发性更强的协议,进一步释放SSD的性能潜力。
- SATA总线(600MB/s) -> PCIe总线( PCIe 3.0 x16 = 16GB/s )**
- AHCI协议 -> NVMe 协议
- 队列深度(32 -> 64K)
- 队列数量(1 -> 64K)
另外,近几年还出现了一种名为Zone Namespace SSD的变种。
参考资料
- 《深入浅出SSD》
一些有意思的工作
- 如何管理SSD中的buffer?
- 关于SSD中的SLC
- 使用强化学习方法实现SSD中的SLC cache[3]
- 关于SSD中的GC
- 使用LSTM、K-Means去预测数据块的热度并对相似热度的数据块做聚类放到同一个block里。[4]
- 软硬件协同设计相关
Related Reading
The Life Journey of an I/O Request - Feishu Docs