大家好,欢迎来到IT知识分享网。
在NVMe 2.0的协议中,能看到一个重磅特性——ZNS。ZNS的全程为Zoned Namespace,ZNS SSD是指实现了ZNS协议的SSD。为了更好阐述ZNS,先从Open-Channel说起。
1.Open-Channel
随着SSD容量的不断变大,单块SSD只服务于一种业务的场景正在逐渐减少,取而代之的是,更多不同业务的数据,比如数据库中的数据、传感器数据、视频数据、云服务器中虚拟机里的用户数据等,会存在于同一块大容量SSD上。然而不同业务数据混在一起,带来了一些问题,具体如下:
1.SSD的写放大收到影响
拿两个顺序写入的业务数据举例:如果这些数据分别存储在两块SSD上,数据在SSD内部都是顺序写入,它们往往也会一起失效(被重新写入或者删除),这样不需要垃圾回收,所以几乎是没有写放大的。然而两种数据混在一起后,可能分布在SSD内部的同一个物理闪存块上,这样就算其中一种数据作废,依然无法直接擦除这个闪存块,仍然需要垃圾回收,从而引入写放大。
2.不同业务的数据访问影响彼此的延时
先看读取过程碰到读取过程的场景。分布在同一个闪存Die上的两种数据不可以同时访问,要依次访问。比如,一种业务是频繁顺序读取513KB数据,一种业务是低频率随机读取4KB数据,显然后者很大概率每一次访问都会碰上前者访问同一片闪存Die,这样它的延时就会变差。
再看读取过程碰到写入过程的场景。若一个业务正在写某个闪存Die里面的某个闪存页,此时另外一个只读的业务正好也要访问该闪存Die的数据,那么读的业务就要等待闪存页写完。我们知道闪存页写入时间(毫秒级别)相对于闪存读取时间(几十微妙级别)来说要漫长的多,这会导致读业务被写业务引入延时。如果读取操作碰到擦除操作,引入的延时会更长。
3.数据稳定性相互影响
假如一个业务A会高频访问数据,在同一个闪存块中业务B的数据就会收到读干扰的影响,甚至可能出现较多位翻转,B业务读取数据时就需要固件额外进行纠错处理。
如何才能解决上述问题呢?答案就是将不同的数据在SSD内部进行物理隔离。这里的物理隔离严格上来说指的是两种数据在SSD中(闪存上),数据的存入以及读出过程完全独立。具体来说是写入和读取闪存的带宽独立且不共享,不存在相互干扰,且具有独立的延时。SSD如何区分不同的业务数据,并且知道哪些数据该放哪里呢?这就要借助Open-Channel SSD了。
Open-Channel的字面意思是把SSD内部的物理通道等拓扑信息以某种方式通知主机端。让最懂业务数据特点的主机端来决定该数据如何在SSD内摆放。其核心思想是把SSD内部的FTL层上移到主机端(主机端需要一个FTL),把SSD的后端(backend,负责管理闪存的接口封装)暴露给主机端。主机端可以直接操控数据存入的物理位置,由于FTL由主机端接管,所以垃圾回收也由主机端负责。下面介绍Open-Chanel的两个核心概念。
1) Chunk:指一系列连续的逻辑块。在一个Chunk内,主机端只能按照逻辑块地址顺序写入,如果要重新写入前面写过的某个逻辑块,需要重启该逻辑块所在的Chunk。
2)并行单元(Parallel Unit,PU):SSD是通过并行操控闪存来实现高速读写的。PU是SSD内部并行资源的一个单位,主机端可以指定数据写到哪一个PU上。一个PU是可能包含一个或多个闪存Die内所有的Chunk。不同的PU可以完全做到物理隔离。在最新的NVMe协议中,I/O determinism(I/O确定性)已经解决了物理隔离的问题,而在Open-Channel提出时,尚没有标准解决方案,这也是Open-Channel的价值所在。
Chunk的概念:整个逻辑地址空间分成很多大小相同的Chunk
Open-Channel SSD实现了把大部分传统NVMe SSD FTL功能从SSD Firmware内部迁移到上层的主机端,迁移的功能有Date Placement,Garbage Collection,L2P table,I/O Scheduling,Wear Leveling等,实现逻辑拓扑图如下:
这个Open-Channel的逻辑拓扑图如下:
说明:
1)很多Chunk组成了PU
2)很多PU组成了Group
3)很多Group组成了SSD
OC SSD中的逻辑地址的概念被重新定义,它包含了PU、Chunk和Group的信息,编码格式如下:
为了规避上述问题,有没有可能既允许主机端尽量自由摆放数据,又有标准的软件生态呢?就是ZNS,它作为Open-Channel的下一代协议被提出,ZNS协议由NVMe工作组提出,旨在达到以下目的。
1)标准化Zone接口
2)减少设备端的写放大问题
3)更好地配合上层软件生态
4)减少OP,节省客户成本
5)减少DRAM使用,毕竟DRAM在SSD中的成本不可忽略
6)增加带宽,减少延时
2.ZNS的核心概念
先介绍几个与ZNS相关的核心概念,再对其他方面展开介绍
2.1 Zone 存储模型
在传统硬盘上,由于读磁头和写磁头所需磁场强度不同,所操作的对应的磁道数目(记作磁头宽度)也不同。写磁头宽度大于读磁头宽度,有效数据磁头宽度和读磁头宽度一致,这是为了保证每次重写这些有效数据时,不影响其他有效数据。有效数据的周边被无效数据包围,并且写磁头宽度内只有一个读磁头宽度的的有效数据,浪费了很多空间。
补充:
HDD(硬盘驱动器)的写磁头宽度通常大于读磁头宽度,这是因为写磁头需要将磁场在磁盘上转变为磁性颗粒的磁化方向,而读磁头则需要读取已被磁化的磁性颗粒的方向。写入数据时,写磁头需要生成一个较大的磁场来改变磁盘上的磁性颗粒,因此写磁头的宽度较大。读取数据时,读磁头只需要检测磁盘上已经存在的磁场的方向,因此读磁头的宽度可以较小。这种设计有助于提高HDD的写入效率和读取准确性。
为什么不在写磁头宽度放满有效数据呢?叠瓦式磁盘(Shingled Magnetic Recording,SMR)就是在写磁头宽度内放了更多的有效信息。
叠瓦式的原理,如下图所示。每次写入的有效数据磁头宽度仍然为读磁头宽度,但相邻两次写入的磁头范围有重合:第一次写入的数据除了有效数据外,其他无效的数据将会被第二次写入的数据覆盖,第三次写入时会覆盖第二次写入的无效数据。以此类推,每一次写入都会存储新的有效数据,同时覆盖上一次写入的无效数据,如同叠瓦,这就是叠瓦式硬盘名字的有来。
传统磁盘支持按照读磁头宽度进行顺序写入和随机写入,叠瓦式硬盘比较麻烦:顺序写入没有问题,但随机写入会覆盖周围的有效数据。叠瓦式硬盘如果支持随机写,就要经过读->改->写操作,这大大降低了随机写入的速度并带来了写入延迟。另覆盖写也是比较困难。
叠瓦式硬盘虽然很大程度上利用了磁盘的空间,却不得不付出额外的代价。
所以叠瓦式硬盘对写入行为进行约束,尽量避免随机写入。具体来说包括以下几点。
1.把磁盘空间划分很多独立、不重合、容量相同的Zone,Zone之间完全隔离
2.在Zone内部,主机端必须严格按照顺序写入,一旦写入的数据乱序,就会发生有效数据被覆盖的情况
3.Zone也是磁盘空间回收的最小单位,即一个Zone内部的数据总是一起作废,可以从头被重写。
目前有两种类型的叠瓦式硬盘:一种是硬盘内部完成了上述写入约束的硬盘,它对外的接口与传统硬盘完全一致;一种是开放了内部Zone信息的硬盘,它与主机端进行协作完成写入约束。
对于第二种叠瓦式硬盘,主机端做了很多软件优化来保证其在Zone内部的顺序写入,包括块设备层的优化,以及采用ZBC(Zone Block Command set,Zone块命令集)和ZAC(Zoned-device ATA Command set,Zone设备ATA命令集)等。
Open-Channel SSD的chunk和SMR HDD中的Zone非常相似:
1)具有顺序写入的约束
2)都有数据间的隔离–Chunk与Chunk之间,Zone与Zone之间的数据隔离
Open-Channel协议的提出者希望能复用叠瓦式硬盘的成熟软件生态。Zone存储模型(Zone Storage Model)应运而生,它把ZBC/ZAC所定义的Zone接口从叠瓦式硬盘扩展到了SSD,使SSD可以无缝(或者做很少改动)使用与叠瓦式硬盘同样的软件栈。对NVMe SSD而言,Zone存储模型由ZNS协议定位。
2.2 Zone相关定义
Zone Namespace(Zoned命名空间)是指为运行ZNS协议定义的命令集合的命名空间。
把整个Zoned Namespace分化成的大小相同、连续、不重合的逻辑块(Logical Block)空间,这些逻辑块空间就是Zone。
每个Zone都拥有自己独立的属性,这些属性在Zone描述符的数据结构里定义,现摘取部分如下。
1)Zone大小(Zone Size):指一个Zone里面的逻辑块数目。根据定义,对一个命名空间而言,Zone Size是固定的
2)Zone类型(Zone Type):ZNS目前支持的是完全顺序写入的Zone类型——Sequential Write Required Zones。支持随机写入的Zones,尚在提议中,暂不介绍。
3)写指针(Write Pointer):记录了该Zone里面下一个可写的逻辑块地址。
4)Zone状态(Zone State):每个Zone都有自己的状态,且ZNS定义了一套完整的状态机。
5)Zone开始处逻辑块地址(Zone Start Logical Block Address,ZSLBA):指一个Zone里最小的逻辑块地址。
6)Zone容量(Zone Capacity):在Zone内并不是所有的逻辑块都可以被主机端使用,一个Zone里面能被主机端使用的逻辑块数目被称为Zone Capacity。Zone Capacity 小于等于Zone Size。
7)Zone Descriptor Extension Valid(Zone有效扩展描述符):这是一个标记,表明是否有一个额外的数据(Zone Extension data)与这个Zone关联。主机端可以为每一个Zone绑定特别的用户信息。
2.3 Zone相关的资源
由于所有的Zone都共享SSD内部的资源(包括硬件引擎或内部DRAM缓冲区)等,SSD可以并行接受写入命令的Zone个数也是有限的,其中可以同时写入的Zone个数也是有限的。
SSD把与Zone有关联的资源分为Active Resources和Open Resources,后者是前者的子集。与Zone相关联的资源是否充足会影响Zone的状态机切换。
Active Resources决定了主机端可以发写入命令的Zone个数。举例,假如主机端为每种业务数据分配一个Zone供其写入,那该资源决定了SSD可支持的最大业务数。
Open Resources决定了有多少个Zone可以被同时写入,假如主机端为每种业务数据分配一个Zone供其写入,那么该资源就决定了能同时发起写入的业务数。
2.4 Zone 状态和状态机
每个Zone的状态受到以下因素影响
1)与Zone相关联的资源
2)主机端通过显式发送Zone Management命令来指定Zone的状态机切换
3)收到的I/O命令
4)收到的Format命令
5)系统状态变化,比如NVM子系统重启和控制器关闭
对Zone State的取值列举如下:
1)ZSE:Empty,也就是空状态,往往在Zone初始化时(比如收到format指令)进入,没有写过的Zone大多数也是这个状态。
2) ZSIO(Zone State Implicitly Opened,隐式打开状态):主机端没有通过发送Zone Management命令来改变Zone状态,而是在Open Resource充足的情况下直接发起对该Zone的写入,这是Zone会自动切换为ZSIO状态。
3)ZSEO(Zone State Explicitly Opened,显示打开状态):在Open Resource充足的情况下通过主机端显式发送Zone Management命令,从而把Zone设置为ZSEO的状态。
4)ZSC(Zone State Closed,关闭状态):SSD没有足够Open Resource时,即同时Open(包括ZSIO/ZSEO状态)的Zone个数满了时,为了支持新的写入命令,SSD会把一些Open(包括ZSIO/ZSEO状态)的Zone切换出去,让它们不占据Open Resource,这些切换出去的Zone的状态标记未Zone State Closed.后续可通过对ZSC状态的Zone写入让它重新申请Open Resource,进而切换到ZSIO/ZSEO。
5)ZSF(Zone State Full,满状态):大多数时Zone被写满的状态,Zone进入写保护时也需要切换到这个状态。
6)ZSRO(Zone State Read Only,只读状态):通过Zone Management命令设置
7)ZSO(Offline,离线状态):通过Zone Management命令设置.
3. ZNS中的核心命令
这里介绍ZNS中几个关键的命令——Read、Write、Zone Append.
3.1 Read命令
跟NVM命令集中Read命令的定义并无区别.需注意的是,ZNS的Read命令需要根据填写的LBA范围定位到Zone。
3.2 Write命令
同样符合NVM命令集的定义,但ZNS协议要求Write命令要收到Zone类型的约束。目前暂时只支持一种Zone类型——顺序写入命令所需Zone。
ZNS对NVMe Write命令的约束导致了以下结果:因为NVMe支持乱序执行,同一个Zone内部,Write命令支持的队列深度只能为1(Queue Depth为1),队列深度一旦超过1,若同时SSD乱序执行那么就会出错。
如何解决这个问题呢?就要用到——Zone Append。
3.3 Zone Append
在传统SSD内部,FTL起到了把主机端数据的LBA空间映射到闪存的物理地址空间的作用。SSD可以同时接收很多命令,然后把这些命令的数据按照自己内部的调度排列好(可以和接收命令的顺序不一致)。写到闪存后,一笔写命令的逻辑块地址对应的物理位置才更新到FTL。
回到ZNS,Zone可以类比成闪存。主机端如果不指定具体写入的逻辑块地址,只给数据,那就由SSD担任主机端数据到逻辑块地址的映射,这样SSD就可以同时接收很多写入命令,并按照SSD内部的调度排列好(可以和接收命令顺序不一致),然后写入Zone,这时每一笔命令的数据才得到自己的逻辑块地址(由写入位置决定)。然后SSD把得到的逻辑块地址信息通过CQE返回给主机端。这就是Zone Append命令的核心思想。
主机端写入支持很深的队列深度,写入速度问题得到解决;
改动块设备层,原来是逻辑块地址和数据一起写入SSD,现在是先把数据写入SSD才会获得SSD分配的逻辑块地址。这部分操作可以复用现有的叠瓦式硬盘的软件栈。
总结:Zone Append命令让SSD采用了与FTL更新物理地址类似的方式,为主机端的数据分配Zone内部的逻辑块地址。
4.ZNS的优势
ZNS做到了如下内容.
1)提供标准化Zone接口。这里应用了叠瓦式硬盘中的Zone的概念
2)减少了设备端的写放大问题。ZNS对写做了约束,SSD内部不需要对Zone进行垃圾回收,设备端写放大系数接近1
3)减少OP,节省了客户成本。在传统SSD中需要OP来完成垃圾回收。ZNS由于不需要垃圾回收所以不需要很高的OP,同时由于减少了写放大系统,闪存的擦写次数也被减少,主机端可写入数据TBW变大,SSD寿命变长,客户成本降低。
4)减少了对DRAM的使用。在SSD内部实现ZNS不需要传统的FTL,ZNS仅需要维护所有与Zone相关的信息,而传统SSD需要1/1024容量的DRAM来存储映射表,所以ZNS SSD可以节省DRAM使用。
5)增加带宽,减少时延。垃圾回收会浪费掉大量写入带宽,相比之下ZNS没写放大,就会增减主机端写入带宽,同时减少垃圾回收引入的时延。对读命令,因为不同业务分配的Zone之间可以做到数据隔离,所以延时取决于底层闪存的拓扑结构,但因消除了相互之间的干扰,所以总体减少了。
6)更好配合上层软件生态。因为叠瓦式的存在,ZNS跟Open-Channel相比很大的优势是软件生态比较成熟。
5.ZNS SSD应用场景和软件生态
ZNS SSD的应用场景目前主要集中在大规模数据中心、全闪存阵列、存储系统、云服务业务等方面。ZNS特别适合具有顺序写入特性的场景,如流媒体、视频监控以及对数据隔离非常敏感的场景。
Linux kernel 4.10已开始支持Zoned Block Devices(包括NVMe ZNS SSD和ZBC/ZAC SMR HDD).
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/139125.html