在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实现了把大部分传统N