e-works数字化企业网  »  文章频道  »  基础信息化  »  存储

NVMe协议SSD 控制器端实现浅析

2018/2/24    来源:存储在线    作者:佚名      
关键字:NVMe协议  控制器  
NVMe协议是在PCIe SSD开始大量出现在市场上后,因为各个厂家的私有协议不具有兼容性,无法和现有操作系统无缝衔接,INTEL为了统一接口协议建立生态,而在2011年发布了NVMe协议。
    一.NVMe 协议
 
    NVMe协议是在PCIe SSD开始大量出现在市场上后,因为各个厂家的私有协议不具有兼容性,无法和现有操作系统无缝衔接,INTEL为了统一接口协议建立生态,而在2011年发布了NVMe协议。
 
NVMe协议SSD 控制器端实现浅析
 
    NVMe采用了多命令队列 (最大65536个命令队列),每个命令可变数据长度(512B到2MB),同时数据在host端内存支持Physical Region Page和Scatter Gather List。NVMe协议支持命令间的乱序执行,也支持命令内数据块的乱序传输,同时支持命令队列间的可变权重处理。
 
NVMe协议SSD 控制器端实现浅析
NVMe协议SSD 控制器端实现浅析
 
    和基于传统ATA(基于PC时代硬盘的接口协议)的SATA协议相比,NVME协议做了很多针对多核host以及NAND存储介质的协议优化。
 
NVMe协议SSD 控制器端实现浅析
 
    因为PCIE接口的高带宽,NVMe协议带来SSD访问的高效率,但也同时带来了SSD控制器端NMVe协议栈实现的难度和挑战。这个挑战主要是1)多权重命令队列的管理和命令抓取,2)命令的解析分解,分发,3)数据的传输。
 
    在开始讨论解决方法之前,我们先了解一下SSD控制器的基本架构。
 
    二.SSD控制器
 
    典型的SSD控制器架构如下:
 
NVMe协议SSD 控制器端实现浅析
 
    主机接口控制器:
 
    主机接口负责进行主机与固态盘之间的通信和数据传输,接受和解析I/O请求,并维护一条或者多条请求队列。目前主流使用的物理接口包括SATA、SAS、PCIe、M.2等。其中,SATA是低成本的硬盘接口,SATA 3.0的理论带宽是600MB/s;SAS向下兼容SATA,能提供更高的传输速率、可靠性和可用性,SAS3.0的理论带宽是1.2GB/s;PCIe是连接外围设备和主机处理器的主要接口,SATA和SAS接口就是通过PCIe接口连接到主机处理器和内存,PCIe SSD既缩短了主机处理器到存储介质的路径和响应延时,又能提供更大的带宽,PCIe 3.0x4和x8的理论带宽分别是4GB/s和8GB/s;M.2是新一代接口标准,分为支持PCIe通道和SATA通道两种,它具有更灵活的物理规范,在传输带宽、容量和轻薄特性等方面优于SATA接口。消费级固态盘主要采用SATA接口和M.2接口,企业级固态盘主要采用SAS接口和PCIe接口。这些物理接口采取的逻辑接口协议一般是AHCI或者NVMe,它们规定了主机与存储设备之间通信和传输数据的方式。AHCI协议主要是针对高延时的SATA接口的机械硬盘而设计的,虽然能够应用于SATA接口的固态盘,但是成为了高性能固态盘的瓶颈;NVMe协议是2011年由英特尔等公司领头,为闪存存储和PCIe接口量身定制的非易失性存储器标准,不仅具有跨平台的兼容性(目前Windows、Linux和VMware等主流平台都已经支持),而且相比于AHCI协议,具有更低的延时、更高的IOPS和更低的功耗。比如,AHCI只能支持一条最大深度为32的命令队列,而NVMe最多支持64000条最大深度为64000的命令队列,能充分利用固态盘内的并行性。因此,NVMe协议能够更好地发挥出固态盘的高性能优势,得到了越来越广泛的应用。
 
    ● 多核处理器:
 
    固态盘的管理需要处理诸多复杂的任务,比如主机接口协议、调度算法、FTL算法和缓存算法等,因此需要强有力的多核处理器来提高这些任务的处理效率,从而降低软件延时。比如,可以使用一个计算核心处理主机接口协议,而使用多个计算核心处理繁重的FTL算法。
 
    ● 缓存芯片:
 
    固态盘内置有缓存芯片,一般是DRAM,用于缓存用户数据和软件算法的元数据。缓存既能加快数据访问的速度,提高固态盘的性能,也能够减少对闪存的写入,延长固态盘的寿命。缓存用户数据的部分称之为数据缓存,缓存地址映射表的部分称之为映射缓存。为了防止突然掉电导致RAM中的数据丢失,固态盘一般会内置备用电容,并采用适当的数据保护技术,用于保证在突然掉电的情况下,将RAM中关键的脏数据刷回闪存。
 
    ● 中央控制器:
 
    中央控制器是整个固态盘控制器的核心,负责配置固态盘的工作模式,管理各个模块之间的通信和数据流。中央控制器内置有小容量的高速SRAM缓存,用于临时缓存数据。
 
    ● 纠错码引擎:
 
    纠错码引擎对要写入闪存的数据进行编码,所增加的纠错码冗余会被写到闪存页的额外存储区中;当需要从闪存中读取数据时,纠错码引擎会对数据和它的纠错码冗余进行解码。如果发生的比特错误数在纠错能力范围内,数据中的错误就会被纠正,从而得到正确的数据;否则,如果没有其它的数据恢复手段,存储的数据就会丢失。编码和解码位于访问闪存的关键路径上,因此纠错码引擎通常采用专用的硬件实现,以提高编码和解码的效率。为了降低硬件开销和解码延时,纠错码引擎会将数据划分为固定大小(一般是1KB、2KB或者4KB)的片段,作为编码和解码的单位。一个数据段和它的纠错码冗余称之为一个码字,数据片段的长度与码字长度的比值称之为纠错码的码率。码率越低,纠错码的纠错能力越强,但是开销也越大,比如冗余的存储开销和解码延时都会变大。为了增加编解码的并行性,纠错码引擎一般包含多个编码器和解码器。固态盘常用的纠错码算法包括BCH码和LDPC码,后者因为纠错能力更强而成为了优先的选择。
 
    ● 通道控制器:
 
    为了提高性能,固态盘将数量众多的闪存芯片安置在多个通道上,每个通道上的多个芯片共享一条I/O总线。每个通道包含一个独立的通道控制器,主要负责与中央控制器和本通道上的闪存芯片进行通信,并维护多条操作闪存的命令队列(比如为每个芯片维护一条单独的队列,外加一条总的高优先级队列),将命令发往目标芯片进行执行。所以,固态盘内部具有四个层次的并行结构:通道,芯片,晶圆,分组。高效地利用并行性是保证固态盘高性能的关键。
 
    ● 闪存芯片:
 
    闪存芯片上既存储用户数据,也存储需要持久化的元数据,比如地址映射表。固态盘提供的物理存储容量会比用户可见的容量要多(一般多7% ~ 28%),多余部分称之为过量供应(Over-provisioning, OP)空间,主要用于提高软件算法(比如垃圾回收操作)的效率和补偿因闪存坏块产生的容量损失。有的固态盘还会在闪存芯片之间组建RAID5,以加强存储的可靠性。
 
    ● DMA引擎:
 
    DMA引擎负责控制在两个RAM之间进行快速的数据传输,比如在中央控制器的SRAM和缓存芯片之间。
 
    不同的固态盘可能在模块设计上会有所不同,比如在每个通道控制器内配置一对纠错码的编码器和解码器,而不是配置一个集中的纠错码引擎;也可能会包含更多的模块,比如电源管理模块、RAID引擎、数据压缩引擎和加密引擎等等。但是,以上模块的介绍能够说明固态盘内部的主要架构。
 
    三. 本文主要针对NVMe主机接口控制器的实现
 
    一般来说NMVe主机接口控制器包括以下几个部分:
 
    Admin命令和completion队列处理模块,IO命令队列处理模块,IO completion队列处理模块,IO写数据处理模块,IO读数据处理模块,中断处理模块。
 
NVMe协议SSD 控制器端实现浅析
 
    回到NVMe协议栈面临的挑战:1)多权重命令队列的管理和命令抓取,2)命令的解析,分解,分发,3)数据的传输。
 
    命令队列的管理
 
NVMe协议SSD 控制器端实现浅析
 
    NVMe协议的命令队列分成两种,admin命令队列和IO命令队列。

责任编辑:李欢
本文为授权转载文章,任何人未经原授权方同意,不得复制、转载、摘编等任何方式进行使用,e-works不承担由此而产生的任何法律责任! 如有异议请及时告之,以便进行及时处理。联系方式:editor@e-works.net.cn tel:027-87592219/20/21。
e-works
官方微信
掌上
信息化
编辑推荐
新闻推荐
博客推荐
视频推荐