上篇文章介绍了一系列的基础概念,并对Multiple namespaces的一些基本使用方法进行了介绍。这篇文章将继续讨论Multiple namespaces的优势,并以PBlaze5为例解读Multiple namespaces的使用和配置。
为什么要用 Multiple Namespaces
看起来用法并不难,那么使用Multiple Namespaces有什么好处呢?简单罗列几个场景:
- 控制逻辑范围
可以在创建namespace时,确定利用的逻辑块的范围,有效控制用户空间大小,甚至达到扩大OP,增加寿命的效果。 - 独立无扰
多个namespace之间的format格式、逻辑地址、IO路径都是相互独立的。比如,
nvme0n1 format成512B的,nvme0n2 format成4096B的完全没问题;
nvme0n3支持数据保护,nvme0n4不支持数据保护,OK;
nvme0n5做共享namespace,nvme0n6做私有namespace,也OK;
…
IO在每个namespace上都是相对独立,互不干扰的,每个namespace的使用者都可以从0开始读写,但之间没有任何干扰,数据没有交集。放心大胆的trim一个namespace,另一个namespace继续读写,高枕无忧。 - Dual Port
multiple namespaces的private/shared namespace可以和双端口结合,成为双端口+多命名空间应用场景,给上层应用提供更多可能。这也是PBlaze5的一个重要的功能。
multiple namespaces的private/shared namespace可以和双端口结合,成为双端口+多命名空间应用场景,给上层应用提供更多可能。这也是PBlaze5的一个功能。如下图所示,NS A是portx的private namespace,NS C是porty的private namespace, NS B是portx和porty的shared namespace。
双端口 + Multiple namespaces
双端口与 Multiple namespace 结合之后,portx 可以访问 NS A 和 NS B,porty 可以访问 NS B 和 NS C,同时,portx 可以看到 NS C 但是不能访问它,porty 可以看到 NS A 但是不能访问它。可以说,我们从分开端口的角度对 MNS 多了一层保护和控制,我们从 MNS 的角度对端口多了一层扩展和保护,基于这两个功能的强强联合,为上层应用创造了更多高效安全的可能。
如何使用PBlaze5的multiple namespaces
既然 Multiple Namespaces 好处多多,让我们用起来吧,用法也不难,以 PBlaze5 为例,慢慢道来。
让我们先了解一下 NVMe 协议里关于 Multiple Namespaces 的几个概念。
- NSID
-每个 namespace 都拥有自己唯一的 NSID。NSID 有效范围:
1 ~ NN。注:0无效。NN+1 ~ FFFFFFFEh无效。FFFFFFFFh表示广播。
如下图所示:
- Active、Inactive、Allocated、Unallocated
不要蒙圈,这跟 namespace 的创建和使用有关。当使用 Namespace Management command 成功创建了namespace 之后,namespace 就是 Allocated 状态,表示这些逻辑块已经划给这个 NSID 的 namespace 了;那些没有创建没有分配的逻辑块和 NSID 就是 Unallocated,很好理解。
但是 Allocated namespace 还不能IO,还需要使用 Namespace Attachment command 挂到某个 controller 上,成为 Active namespace 才可以。所以,Active NSID 就是已经创建并且已经挂到某个 controller 上的 namespace 的NSID。 - Namespace Management command 和Namespace Attachment command
NVMe协议规定了两个admin命令,Namespace Management和Namespace Attachment,用以创建、管理namespace等操作。另外,Identify命令中也有对namespace的支持,比如获取NSID列表、controller ID列表等。
图 3 - NVMe 1.3协议中两个admin命令
拿到一块支持multiple namespace的SSD,比如PBlaze5,用支持这两个admin命令的的工具,比如nvme-cli,就可以create、delete、list、attach、detach一个namespace了:
图 4 - nvme-cli中namespace命令
命令不多,支持的内容还是很丰富的。比如create-ns命令,可以设置这个namespace的大小、格式化格式、数据保护能力、共享能力等。又比如list-ns命令,可以列出某个NSID之后所有有效的NSID,并可以分别列出Active、Inactive的namespace,方便用户使用。再次声明,经过细致有效的测试,PBlaze5系列产品完全符合NVMe1.3协议之规定。
再用PBlaze5举个例子 —— 创建namespace举例
下面以在PBlaze5 U.2 4T上使用nvme-cli工具创建一个500GB的namespace为例。
第一步,检查SSD上剩余空间是否足够创建目标namespace。使用Identify命令查看unvmcap的值可知剩余可分配容量,单位是Byte。
图 5 - 使用Identify查询unvmcap
第二步:计算创建 500GB 的 namespace,是多少个LBA。执行create-ns命令时,NSZE和NCAP的单位都是指 LBA的个数,lba count和user capacity的关系符合JEDEC218A,公式如下:
user capacity = (lbacount- 21168) / 1953504 当LBA size是512B
user capacity = (lbacount- 2646) / 244188 当LBA size是4096B
那么,当想创建500GB的namespace,并且该namespace格式化为512B的sector size的话,size参数就设置为:21168 + 1953504 * 500 = 976773168。
第三步:执行nvme create-ns /dev/nvme0 –s 976773168 –c 976773168 –f 0 –d 0 –m 1即可创建一个namespace。其中,-f 0设定了一个逻辑块的大小是512Byte,PBlaze5还支持4096B等。
第四步:执行nvme attach-ns /dev/nvme0 –n 1 –c 1即可将这500GB的namespace挂到controller 1上,这是执行IO的先决条件。
第五步:如果操作系统支持Namespace Attribute Notices,那么此时已经可以在系统中看到这个namespace并使用它了。
图 6 - 创建500GB namespace举例
经过两篇文章的讨论,可以发现Multiple namespaces是NVMe SSD一个非常基础而重要的功能,是对SSD不同存储单元进行差异化策略设置和操作的基础。现在PBlaze5已经开始全面支持Multiple namespaces功能,用户可以对不同的namespaces分别执行格式化等操作。未来基于Multiple namespaces还将有更多新的特性加入,用户管理NVMe SSD也更加方便。
下面是Memblaze的技术文章合集: