SSD讲解

在NVMe SSD内部,处理I/O请求有四个主要过程。
- HIL从主机端的提交队列中获取请求,将请求插入设备级队列;
- HIL首先要对每个请求进行粒度分割。将请求分为多个事务(transaction),每个事务的大小是闪存页的大小(flash page size)。
- 在FTL层,固件判断请求是写请求还是读请求。若为写请求且SSD支持写缓存,则由FTL内的Cache Management单元将每个事务的数据保存在DRAM的写缓存区中,并通知HIL准备回送响应数据;若非以上情况,则FTL通过Address Translation单元将每个事务的LPA转换为PPA,并将事务插入芯片级别的队列。之后transaction scheduling单元来解决事务之间的资源争用,将可以执行的事务发送到闪存芯片的控制器(Flash Chip Controller)。
最后,当一个请求对应对的所有事务都完成了,FTL通知HIL回送响应。
在Flash存储器中,I/O请求的操作单位是页(page);擦除的操作单位是块(block)。
在SSD使用一段时间后,一个块内将同时有有效页面和无效页面。
由于闪存的颗粒的物理特点,颗粒被写入数据不能覆盖数据,再次写入数据只能先擦除再写入。
写操作中的擦除操作包括三个步骤:
- FTL将更新的逻辑页对应的物理页面(不再使用)标为无效页;
- 将原块中剩下的有效页的数据转写到其他空闲的块中;
- 将此块上的数据删除。
这个步骤也是SSD中垃圾回收(Garbage Collection, GC)机制的工作内容。
这样,SSD在写操作中,执行了一次垃圾回收,显然会影响写操作时延性能。
现代的SSD中采用异地更新 (out-of-palce update) 策略来更新物理页。
在要更新一个闪存页的数据时,不执行擦除操作,而是由FTL中的Address Translation单元为I/O事务分配一个新的空闲块上的空闲物理页地址,并更新缓存地址映射表。
然后将原来的闪存块中对应物理页的数据标记为无效,等待垃圾回收机制(GC)被触发时统一回收该闪存块。
这样新数据能够较快地写入新数据块。
稳态是在SSD中所有的闪存页/地址都被至少写入一次之后,SSD写入带宽趋于稳定的一种状态。对于实体SSD,快速进入稳态的方式是:先对SSD的所有地址进行顺序写操作,然后再进行随机写操作,能够将SSD中的所有地址都至少写过一次。
稳态对SSD性能的影响如下:
- 在稳态下,SSD固件中的维护方法,比如垃圾回收(Garbage Collection)方法才会发挥作用。GC方法的执行会干涉用户的I/O请求的执行,并且会显著影响SSD设备的持久性能。
- 在稳态下,写缓存空间不足,影响写操作的性能。进入稳态后,写缓存的空间不足,在新写操作到来时会导致缓存回收(cache evictions);还会使Flash后端的写流量增大。
- (当前应用程序的物理数据放置,高度依赖于SSD的使用历史和之前进程的数据放置。)在稳态下,SSD flash芯片中空闲的物理页面较少。在新的I/O请求到来时,还有哪些空闲物理页可以使用,取决于在此前I/O操作是如何使用物理页的。因此,从闪存芯片层级来讲,I/O请求此时并不能完全利用闪存芯片之间的并行性。
综上,也就是说在稳态下,SSD的性能指标几乎会到达一个最低点,也是设备性能的下限。
对于业界的测试工作来说,稳态下的测试结果才能真正说明设备的性能水平。