Multi-stream write(多流写)技术是什么?
在企业级存储中经常提到一个关键性的词语"冷热数据分区"。把相同生命周期的数据打上标签,告诉SSD盘,SSD盘放置数据的时候,就可以分区存放,会大大减少垃圾回收的工作量。要实现这个功能,阵列软件必须有接口和SSD控制器通讯。除了自研SSD之外,还有一个办法,采用支持Multi-stream write(多流写)技术的SSD。
Multi-stream write(多流写)技术可以使SSD根据主机端提供的Stream ID,将具有相同或相似生命周期的数据写入到相同的擦除单元中去,大大提高了GC时的效率,减少了写放大,使得SSD的性能和寿命都有了较大的提升。
NVMe协议里面有两种方法可以对数据进行分类,其中一个是通过 Dataset Management,另一个就是 Multi-Streams。
Dataset Management 把 SSD 的逻辑容量分成不同的 Range,不同的 Range 有不同的属性,包括 Sequential Write,Sequential Read,Access Latency,Access Frequency 等,如何利用这些属性来优化数据写入NAND的方式,由SSD内部决定。而 Multi-Streams 则是由 Host 明确告诉SSD,当前的数据属于哪个 Stream ID,SSD 会把对应不同 Stream ID 的数据写入不同的 NAND块。
下图是Multi-Streams在SSD内部的使用方式
如下图,采用多流写技术后,在不同workload情况下,SSD的写放大都会降低到接近1,效果非常理想。
(注:数据来自三星官网公布内容)
我们知道写入放大数值越小,越能提升固态使用寿命。多流写技术让NVMe SSD的寿命得到了2倍的提升,如下图。
(注:数据来自三星官网公布内容)
同时,多流写技术对NVMe SSD的IOPS有显著的提升,如下图。最大IOPS是传统SSD IOPS的9倍,这真的是飞一般的感觉~~~
(注:数据来自三星官网公布内容)
NVMe Directive 应用:
从 SSD firmware 架构来看,Directive streams 会增加不小冲击,原因是host会给不同的数据打上不同的 stream id,hot ? cold?large?small?,而且会贯穿 Firmware 前中后 partition,并且给 FTL 的处理增加巨大难度;那么如何设计 NVMe Directive streams 才合理呢?
首先要支持 streams,最后 host 与 device 达成一致,即 stream id 定义一致,stream id count一致,不宜复杂。
比如只支持2个stream,id = 1表示 small data,id = 2表示 large data,那么后端可以开辟两个super block 去分别存储 small data or large data。
再比如只支持2个stream,id = 1表示 hot data,id = 2 表示 cold data,那么后端可以把 super block 分成两类分别用来存储 hot data or cold data。
NVMe Directive 协议相关:
首先 Directive 分为 Directive Receive command 和 Directive Send command, 顾名思义Directive Send command 用于从 host trans data 到 device,Directive Receive command 反之。
NVMe 2.0 只支持两种 Directive Type 即 00h Identify 和 01h Streams,在使用 Streams 特性前,需要先通过 Identify Directives 使能 Streams,其中 00h Identify 是默认必须支持的。
Directive 传送的数据主要分两种类型,Identify 和 Streams。
Identify Directive Directive 相关信息(包含Streams Directive support相关,Directive/Streams enable之类的)。
Host 可以通过 Return Parameters 操作读取 SSD 支持的 Directive Type (NVMe2.0 只支持Streams 01h)和当前的 Enable 状态,也可以通过 Enable Directive 操作使能某个 Directive Type(例如 Stream)。
Streams类型,
- Directive Receive command, 包含Return Parameters、Get Status、Allocate Resources。
- Return Parameters: 操作可以获取 SSD 支持的Streams能力, 包括 Stream Write Size,Stream Granularity Size,Stream resources,Max Streams Limit,NVM Subsystem Streams Available、NVM Subsystem Streams Open 等等。
- Get Status:操作可以获取 Hos t当前的 Streams 状态,包括哪些 stream 是 open 的, Open Stream Count, open stream id 等。
- Allocate Resources:操作申请 Streams 并返回当前可以分配的 Streams 数量。指定host 分配给 namespace 独占 stream numbers,及共享 stream numbers。
- Directive Send command,包含 Release Identifier、Release Resources。
-
Release Identifier 允许 Host 释放某个 Streams。
-
Release Resources 允许 Host 释放所有申请的 Streams。
-
使用Multi-Streams
Write 命令通过在命令参数中设置 Directive Type 字段为 01h,Directive Specific 字段为对应Stream Id 使用 Multi-Streams。
Write命令参数如下图:
浅谈SSD之SRIOV、NAMESPACE、NVM SET ingram14 2022-04-06 20:31 阅读:946 评论:0 推荐:0 编辑
NVMe冷知识之Directive(NVMe stream) ingram14 2022-01-22 22:08 阅读:995 评论:0 推荐:0 编辑
SSD FTL---浅谈GC选块策略 ingram14 2022-01-08 17:51 阅读:276 评论:0 推荐:0 编辑
NVMe冷知识之CFS ingram14 2022-01-08 17:36 阅读:211 评论:0 推荐:0 编辑
FTL 算法之Arbiter ingram14 2021-07-06 18:10 阅读:146 评论:0 推荐:0 编辑
SSD NVMe核心之PRP算法 ingram14 2021-07-06 11:52 阅读:349 评论:0 推荐:0 编辑
SSD Internal Flow Control设计 ingram14 2021-07-05 18:12 阅读:71 评论:0 推荐:0 编辑
透过协议看PCIe ASPM L1.2 ingram14 2021-01-02 20:56 阅读:312 评论:0 推荐:0 编辑
PCIe设备Link Training调试心得----之PERST是否使用 ingram14 2021-01-01 08:56 阅读:125 评论:0 推荐:0 编辑
浅谈NAND FLASH的两种编程方式 ingram14 2020-11-25 21:46 阅读:117 评论:0 推荐:0 编辑