1、背景
可计算存储,一直以来都是存储发展的一个分支,SSD是一种大量使用且大量消耗的电子产品,如果能在这个产品里面加上一点点附加功能,offload CPU的压力或者赋能一下AI大模型,都能极大的节省服务器本身的资源消耗,提高SSD设备的溢价。不少公司都按照自己的思路做了一些私有的解决方案。为了统一可计算存储的发展方向,NVMe协议组织在2024年初正式发布了计算存储的两份spec
computational-programs-command-set
subsystem-local-memory-command-set
这两份spec引入了两种新的namespace类型和与之相对于的两个新的command set,并在Base spec中引入了Reachability的特性,本文主要介绍subsystem local memory command set (SLM)
1.1 SLM 和计算存储 这两份command set的关系
SSD是一种存储数据的设备,有多少存储颗粒就能提供多少存储容量。而计算除了需要处理器(CPU、FPGA等任何可计算设备)之外,还需要内存,SLM主要是约定对内存的使用。
SLM命令集除了可以支持计算之外,还可以支持主机来访问这段内存,假设有一个设备只支持SLM命令集,那么他也可以是一个插在存储接口上的内存增容盘,只是这个内存增容盘只能由SLM命令集来访问,不能映射到主机的内存地址区域(这种用法可能CXL会需要?)
1.2 SLM和CMB、PMR的关系?
PMR(Persistent memory region)是一段存储设备提供的内存,可以映射到pcie bar空间,直接被主机按照byte颗粒度访问,并且是非易失的,掉电后数据不会丢,如果SSD里面集成了NVDIMM这样的设备,就可以将NVMDIMM的能力通过PMR的方式暴露给Host
CMB(controller memory buffer)是一段存储主控内部的内存,通常容量较小,速度快,可以映射到pcie bar空间,指直接被主机按照byte颗粒度访问,是易失的掉电后数据丢失。
SLM 与上面两种有所不同,SLM是易失的,不能被映射到pcie bar空间的内存,只能通过本文介绍的command set来访问,host可以访问,其他computational namespace或者NVM namespace都可以访问其中的数据(参考 reachability和copy命令),因此SLM实际上可以提供一个比较大的内容容量
1.3 NVM namespace和SLM/Computational namepsace关系
在nvme 协议重构之后,分出了三种不同的存储command set,NVMe Block、ZNS,KV,这三种command set分别对应三种不同的namespace,他们都是存储数据且掉电之后不会丢数据的namespace。
computational command set和SLM command set对应两种新的namespace,他们不是NVM namespace,掉电之后会丢数据,或者不存储数据
- Block/ZNS/KV : NVM namespace
- computational/SLM : 非NVM namespace
NVMe协议中namespace的定义
Namespaces divide an NVMe SSD into logically separate and individually addressable storage spaces where each namespace has its own I/O queue. Namespaces appear as a separate SSD to the connected host who interacts with them as it would with local or shared NVMe targets.
2、SLM command set
在厘清SLM和其他command set的关系之后,实际上SLM很简单,他包含
- 4个I/O 命令(memory read、write、fill、copy)
- 2个LogPage(Reachability Group、Reachability Association)
- 2个Identify命令(CNS 0x5、CNS 0x6)
2.1、 I/O命令
memory read/write/fill/copy这四个命令都是提供给主机使用,使得主机可以获取memory namespace中的数据,这里主要讲一下copy命令,SLM可以被理解成是一个2 port memory,host可以访问,其他namepace也可以访问,如果是computational namespace访问memory namespace主要是做运算过程中的数据获取和结果产生,如果是NVM namespace去访问memory namespace,那么主要是通过copy命令,可以实现运算数据的准备,运算结果的持久化保存。
- 从NVM->SLM or SLM->NVM,走copy命令
- 需要考虑block和byte之间互相转化,length必须是lba的整数倍,例如从SLM->NVM必须是512字节或者4k字节的整数倍
- SLM->SLM,走copy命令
- Dword对齐
- SLM->Host,走SLM的I/O命令
- Dword对齐,读写长度的颗粒度也是Dword
- Computational -> SLM
- Byte级别颗粒度的访问
2.2、Admin命令
SLM命令集中的identify getlogpage没有太多介绍,SLM不支持namespace management命令,也就是说memory ns不支持修改属性
网友评论