computational storage计算存储

感觉这年头干啥芯片的都想把计算绑定在一起,之前有网卡把计算绑一起,现在也有把存储和计算绑一起。

什么是计算存储

其实这要从NVME说起,从NVME 1.2规范引入CMB(Controller Memory Buffer)这个概念起,就慢慢有了变革的火种。
CMB是一段放在NVME卡上的内存,有点类似于独显的显存的概念,也是通过PCIe BAR空间对CPU可见,一开始主要是
把NVME涉及到的SQ和CQ放在这个内存区域,避免访问系统DDR,而起到减小延迟的效果。

那现在有了内存,为什么不参考下GPU,把计算core放进去呢,这样就有了computational storage的概念。
借用下SNIA组织的图,更形象的说明下什么是computational storage:

compute storage

代表公司和产品

推动computational storage的主要有三家初创公司: Eideticom, NGD和scaleflux。
当然还有传统的nvme存储公司比如美光和三星,这几家里面我认为软件生态做的最好的是Eideticom。
它的CTO Stephen Bates在2015年就提出了Donard系统的概念,这个系统当时就把GPGPU、NVMe SSD和RDMA串在了一起,
旁路了CPU,可以认为这是Eideticom的起源之一,感兴趣的朋友可以看看本文的参考资料。

为了对这种产品形态有更直观的感受,放个Eideticom卡的图

compute storage

典型的用户场景是通过减少数据移动,把一些原先要在cpu和nvme路径上执行的任务,直接卸载到computational storage processor里面来,提升效率。比如:

  • 数据库场景中数据的压缩计算
  • 网络数据的存储,这个有点类似于nvme over rdma,且把计算也offload到nvme卡上,具体示意如下:

compute storage

p2pdma

为了让NMVE卡上的这块内存可以被使用,就不得不提p2pdma这个上了linux和qemu主线的方案,
前面也介绍过mlx 的peer to peer direct技术,也介绍过nvidia的 gpudirect技术,但是它们目前都没上linux主线。

p2pdma在内核的pci驱动目录中的p2pdma.c中,从4.20开始被支持,想了解历史的看看这组patch和相关作者的一个总结:

在这个总结中,作者有提到在arm64上还需要加上ioremap相关的patch才能正常工作,不知道现状如何了。

卡上的内存暴露出来之后,下一步就是怎么把这块内存给用起来。
当前能直接使用p2pdma技术的主要有SPDK,以及Eideticom自家的libnoload。

compute storage

SPDK

这里以SPDK为例,由于spdk是用户态的,所以kernel把bar空间映射到用户态以后,主要是bar,doorbell的操作。
感兴趣的可以直接看spdk中的 cmb_copy.c,感觉用起来还是很简单的。

spdk_nvme_ctrlr_map_cmb
 nvme_transport_ctrlr_map_cmb
  spdk_nvme_transport_ops.ctrlr_map_cmb
   nvme_pcie_ctrlr_map_io_cmb
    nvme_pcie_ctrlr_get_cmbsz
     spdk_mmio_read
    根据暴露出来的bar_va, 计算buf
    spdk_mem_register(buf)

spdk_nvme_ns_cmd_read
 nvme_qpair_submit_request
  nvme_transport_qpair_submit_request
   spdk_nvme_transport_ops.qpair_submit_request
    nvme_pcie_qpair_submit_request
     nvme_pcie_qpair_submit_tracker
      nvme_pcie_qpair_ring_sq_doorbell
       nvme_pcie_qpair_update_mmio_required

把算力用起来

要把算力用起来,就要借助一个其它的PCIe 设备,比如网卡,可以参考下面的仓库,看看怎么用起来的,主要是把网卡的收到的NVMe包,直接放到NVME卡的CMB中:

参考

知道是不会有人点的,但万一有人呢:)