DRAM/NVRAM高速缓存如何减少闪存SSD写入放大存储与灾备
不熟悉闪存SSD实际写入数据的方式的读者将会对其与硬盘驱动器(HDD)的区别感到有点惊讶。
HDD像所有的其它磁性存储介质一样以位元(bit)的方式存放数据,但是闪存SSD则以区块的方式存放数据。数据在HDD上被改动的时候,位元就被修改了。但是,坦率地说,数据在闪存SSD上被改动的时候,对下文的NAND技术不甚了了的那些人就觉得有点儿匪夷所思了。
与磁性的HDD不同,闪存或者NAND必须处于数据可以被写入的状态,没有HDD所具有的“位写入”(write-in-place)功能。如果数据已经被写在NAND上,那么该数据必须被擦除NAND才能接受新的数据。擦除是一个破环薄层材质的过程。
NAND机构的简单解释应该对此稍做澄清,虽然这仍然令人困惑。
NAND记忆体实质上由被称为页(page)和区块(block)的两类结构组成。每页最常见是4/2 KB(可以是其它大小,但这是最常见的),代表一个读取和写入单元。多个页组成32/128 KB或者128/512 KB的区块。NAND读取和写入是在页的级别上被执行的。相反,擦除是在区块级别上被执行的。
在一个写入可以出现在一个被写页之前,包含该页的整个区块必须被擦除。这是一个低效、冗长的操作。它也被称为写入放大(write amplification)。
比较它们各自的延时即可一目了然:读取速度为55微秒;写入速度为550微秒;擦除速度为900微秒。写入应该被均匀地分布到整个卷,这被称为耗损均衡(wear leveling)。
SSD控制器必须同时跟踪已被写和未被写的区块。它们以此向所有的区块提供均匀的耗损均衡并跟踪含有无效数据的区块。含有无效数据的区块被指定用于擦除。这被称为垃圾收集(garbage collection)。这些指定的区块在被使用前被擦除,以避免高的擦除延时。
一旦区块被擦除,它们被放回可供写入的区块池中。如果垃圾收集落后于写入量,那么性能就急转直下。
这是大多数SSD经常被超配20%的一个原因。200 GB的SSD通常实际有256 GB的NAND,以免用完可用的写入区块。
在大多数系统中,页和区块大小可由存储管理员配置。较大的区块比较小的区块的使用率低。优点是随机区块的写入延时较低,因为SSD控制器要跟踪的区块要少得多。小区块提供更有效的利用率,但是以较高的延时为代价。大区块适合持续写入。小区块适合随机写入。
当SSD被配置成大区块而写入是非常随机化的时候,SSD的耗损寿命就被缩短了。大量未被写的NAND(区块未被写的闲置部分)被更频繁地擦除。因此,SSD管理员的挑战变成平衡随机和持续写入的性能(延时),同时优化耗损寿命。这是一项重要的、劳动密集型的挑战。
Nexsan、Nimble、Nimbus、Oracle、Tegile等几家混合和纯SSD存储系统厂商以及NexentaStor等一些存储堆栈软件一直不遗余力解决这项挑战。(注:这样做的厂商在他们的营销材料中直言其实。)
这些系统使用聪明的算法,装载在DRAM或者NVRAM上,然后利用该记忆体对SSD写入进行高速缓存。DRAM和NVRAM要比闪存快得多,延时以纳秒而非微秒计算。这个高速缓存使存储系统可以接受可能是各种大小的随机写入,把它们汇总并变成持续写入。对闪存SSD写入进行排序处理改变了游戏。它使存储系统可以左右逢源:大页面上极高的区块利用率、极低的写入放大,加上尽可能低的延时。
由于意外停电,写入被提交到SSD或者HDD介质之前,高速缓存中的数据丢失,确保具有这种功能的系统不受此影响是至关重要的。使用NVRAM没有这个问题。NVRAM是具有为高速缓存提供足够电量以完成对SSD或者HDD写入的超级电容器(supercap)或者电池备份的DRAM。
精明地使用DRAM/NVRAM高速缓存可以为固态驱动器存储系统提供更好的性能、更长的闪存SSD耗损寿命以及更好的用户体验。