资讯详情

NVMe之SSD 控制器

NVMe协议是在PCIe SSD由于各厂家的私有协议不兼容,无法与现有操作系统无缝衔接,开始在市场上大量出现后,INTEL2011年发布了生态系统接口协议NVMe协议。

NVMe采用多命令队列 (最大65536个命令队列)每个命令的可变数据长度(512B到2MB),同时数据在host端内存支持Physical Region Page和Scatter Gather List。NVMe协议支持命令间的乱序执行,也支持命令内数据块的乱序传输,同时支持命令队列间的可变权重处理。

和基于传统ATA(基于PC时代硬盘的界面协议)SATA协议相比,NVME多核协议做了很多host以及NAND协议优化存储介质。

因为PCIE界面高带宽,NVMe协议带来SSD高效的访问也带来了SSD控制器端NMVe协议栈的难度和挑战。这一挑战主要是1)多权重命令队列的管理和命令抓取,2)命令的分析和分解,3)数据的传输。

在讨论解决方案之前,让我们先了解一下SSD控制器的基本架构。

典型的SSD控制器架构如下:

主机接口控制器:

主机接口负责进行主机与固态盘之间的通信和数据传输,接受和解析I/O并维护一个或多个请求队列。目前主流使用的物理接口包括SATA、SAS、PCIe、M.2等。其中,SATA是低成本的硬盘接口,SATA 3.理论带宽为6000MB/s;SAS向下兼容SATA,可提供更高的传输速率、可靠性和可用性,SAS3.理论带宽为1.2GB/s;PCIe是连接外围设备和主机处理器的主要接口,SATA和SAS接口是通过的PCIe接口连接到主机处理器和内存,PCIe SSD它不仅缩短了从主机处理器到存储介质的路径和响应延迟,而且提供了更大的带宽,PCIe 3.0×4和x8理论带宽分别为4GB/s和8GB/s;M.2分为新一代接口标准PCIe通道和SATA有两种通道,它具有更灵活的物理规格,在传输带宽、容量和轻度方面优于SATA接口。主要采用消费级固态盘SATA接口和M.2接口,企业级固态盘主要采用SAS接口和PCIe接口。主要采用消费级固态盘SATA接口和M.2接口,企业级固态盘主要采用SAS接口和PCIe接口。这些物理接口的逻辑接口协议通常是AHCI或者NVMe,它们规定了主机和存储设备之间的通信和数据传输。AHCI协议主要针对高延迟SATA虽然界面的机械硬盘可以应用于SATA接口固态板,但成为高性能固态板的瓶颈;NVMe该协议于2011年由英特尔等公司领导PCIe定制界面的非易失性存储器标准,不仅具有跨平台兼容性(目前Windows、Linux和VMware与主流平台相比,已经支持等)AHCI协议延迟更低,延迟更高IOPS功耗较低。比如,AHCI只能支持最大深度为32的命令队列,NVMe最多支持6.4万条最大深度为6.4万的命令队列,可以充分利用固态盘内的并行性。比如,AHCI只能支持最大深度为32的命令队列,NVMe最多支持6.4万条最大深度为6.4万的命令队列,可以充分利用固态盘的并行性。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发动机、数据压缩发动机、加密发动机等。但上述模块的介绍可以说明固态盘内部的主要结构。

一般来说NMVe主机接口控制器包括以下几个部分:

Admin命令和completion队列处理模块,IO命令队列处理模块,IO completion队列处理模块,IO编写数据处理模块,IO读取数据处理模块,中断处理模块。

回到NVMe协议栈面临的挑战:1)多权重命令队列的管理和命令抓取,2)命令的解析,分解,分发,3)数据的传输。

NVMe协议的命令队列分为两类,admin命令队列和IO命令队列。

Admin命令队列负责协议的初始化和管理,不负责用户数据传输,不需要带宽和响应速度,一般可以使用前端协议CPU固件处理,即固件处理admin命令队列的doorbell,从hostmemory根据命令字段,抓取命令,分析命令;返回或抓取admin命令的数据段;然后发回completion队列的completion字段。

IO命令队列用于数据传输,支持多达65536个命令队列(一般基于hostcore数据传输对命令队列的处理要求较高,SSD控制器的接口控制器需要有效地处理命令在不同权重的命令队列中的捕获、分析和分发。主机接口控制器的设计挑战很大。对IO命令队列一般有三种设计思路:1)硬件逻辑处理;2)多核CPU并行固件处理;3)硬件逻辑 CPU固件处理

我们可以比较三种想法的优缺点

因为NVMe不建议使用纯硬件逻辑处理协议的复杂性。思路2)和思路3)更可行。

命令队列的管理需要解决几个难题,1)是多权重队列的轮询顺序和优先级 2)分析分解命令字段。IO读写命令 PRP list处理 4)IO读写命令Scatter Gather list处理。

1)是多权重队列的轮询顺序和优先级问题

IO轮询和抓取命令队列需要doorbell持续轮询寄存器,还需要频繁启动命令抓取PCIE IP,不太适合CPU固件完成会严重影响命令的处理效率,每个命令字段固定为64B,建议进行硬件逻辑处理,但需要非常复杂的硬件逻辑来处理不同权重的命令轮询,这对设计非常困难。

2)命令字段的分析和分解

NVMe IO 命令的字段如下。

每个IO命令都由64B组成,DWORD0-9字段有固定定义,其他字段根据不同而定义IO命令意义不同。随着协议的发展,可能会引入一些新的命令和参数。因此,需要分析协议CPU完成固件可以增加灵活性。

IO在主机侧内存中存储命令对应的数据块有两种方式:PRP list 和SGL

PRP list如下图

Physical Region Page

SGL 如下图:

Scatter Gather List

数据在主机侧的内存中,一般以4KB为单位颗粒存放,但颗粒之间物理地址并不连续,而且起始颗粒的offset并不是4KB对齐的。如下图

主机控制器在启动PCIE DMA访问主机内存时要注意4K不对齐带来的细节问题,起始块的非4K对其和块大小,结尾块的块大小,这些块需要非4K的PCIE DMA传输。在处理主机内存访问时,CPU固件处理能带来足够的灵活性,但考虑到主机数据传输带宽性能的高要求,需要硬件做协助或者由硬件处理。比如在PCIE DMA加入PIPE-LINE机制,充分利用PCIE带宽。

因为每个IO命令的数据传输大小从512B 到256MB不等,对于SSD中央控制器(FTL管理模块)来说,管理的NAND测数据单元一般是4KB。

如果主机测IO数据块大于4KB,每个IO数据块的传输都涉及到数据块分解的问题,即需要把主机端数据块分解成FTL管理模块的4KB颗粒单位。从模块化分层设计的角度,数据分割功能不太适合放到FTL管理模块完成,而应该由主机控制模块完成,NVMe协议部分对FTL控制模块是透明的。同样,主机侧协议也应该对FTL管理模块透明。

对于4KB模式LBA,因为数据的offset是4KB对齐的,主机侧数据分解较简单。

对于LBA非4KB模式(512B,1KB,2KB),主机测数据块分解为FTL控制模块需要的4KB单位情况较为复杂,case也比较多。每个IO命令的SLBA(Start Logic Address)不一定是4KB对齐的,Logic Block Number也不一定4KB的倍数。所以数据块分解后的起始第一个块和最后一个块有可能不是完整4KB,主机侧数据分解后的4K块数量要同时考虑Logic Block Number 和SLBA不对齐的情况。例如一个12KB(12KB/4KB=3)的主机侧数据块,分解后在FTL NAND侧可能会分布到4个FTL NAND侧4KB数据块。

Host内存4KB不对齐,SLBA=4KB对齐,Logic Block Number=4KB整数倍

Host内存4KB不对齐,SLBA 4KB不对齐,Logic Block Number=4KB整数倍

从上面两张图可以看出,数据块在主机侧内存是否4KB对齐,SLBA是否4KB对齐,Logic Block Number是否是4KB的倍数,会组成很多复杂的情况。比如:数据块主机侧内存4KB不对齐,那么FTL侧看到的4KB在主机侧内存会分布在两个主机侧内存块里。

读者有兴趣可以把所有组合整理处来,每种情况数据的分解情况都有不同。

如果分解后的IO数据块小于4KB(如:512B,1KB,1.5KB,2KB… ….),对写IO数据,则涉及到不完整部分数据和FTL 4KB数据块中其他原有背景数据拼接的问题。

NVMe协议是命令控制通路和数据通路分离的,支持多个命令队列,而且支持命令之间的执行和数据传输乱序,命令内分解后的4KB数据块乱序, 所以关于命令之间和命令内控制流数据流的控制也是个很好的话题,技术上也有很多难度

参考链接:

NVME CLI -- nvme 命令查看NVME设备内部状态_天行健,地势坤-CSDN博客1. 基于PCIe 的NVMe 和 基于SATA的 AHCI ssd比较。2. NVME的命令行工具nvme-cli介绍。https://blog.csdn.net/Z_Stand/article/details/111415236

转载链接:

NVMe协议SSD 控制器端实现浅析(一)-存储在线一.NVMe 协议 NVMe协议是在PCIe SSD开始大量出现在市场上后,因为各个厂家的私有协议不具有兼容性,无法和现有操作系统无缝衔接,INTEL为了统一接口协议建立生态,而在2011年发布了NVMe协议。 NVMe采用了多命令队列 (最大65536个命令队列),每个命令可变数据长度(512B到2MB),同时数据在host端内存支持Physical Region Page和Scattehttp://www.dostor.com/p/48121.html

标签: 1x8p连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台