Fenglin1
4 Beryllium

Re: 专题:极致性能存储DSSD的故事

DSSD极致性能的秘密 – NVMe over PCIe

     已经有读者从之前的连载中了解到,DSSD D5 Rack-Scale存储阵列能提供在百TB数据级别的极致性能(1000万IOPS、100 GB/s、100 us延迟)。而实现这种极致性能的背后原因是一种全新的软硬件协同设计的成果,以及发布的视频( Video Link : 76546)中对DSSD D5的设计理念有了一个概略的介绍。

     在接下来的几篇文章中,楼主会逐个介绍这些实现极致性能的主要设计点。第一个,我们来看一下NVMe over PCIe Gen3

PCIe:

     PCIe读者们应该都非常熟悉了,它是目前主流的计算机系统总线接口,使用了双向序列的点对点的串行技术,PCIe规格已经发展到了第三代,PCIe GEN3的x1的带宽双向达到了2GB/s,最大16x的理论性能可以达到32GB/s。PCIe作为数据通道,在几年前的服务器端闪存加速卡中就已经开始使用了。PCIe有着高性能、高带宽、简化设备间的输入输出、分层架构、简单应用等有点。

     DSSD在设计的时候将原来只存在于计算机主板上PCIe – 系统总线 – 内存 – CPU的架构扩充到了整个机架。DSSD利用PCIe让CPU和主机内存中运行的程序与数据存储实现了最大的数据传输效率。DSSD系统当前使用的是PCIe Gen3 X4,传输带宽为8GB/s,如果将来升级到8x、16x,DSSD还存在进一步提升性能的可能。同时,通过DSSD硬件架构,将总共96个端口和主机端的PCIe板卡的端口组成了独有的PCIe Mesh Fabric。这种架构能够使阵列内任意一个闪存模块中的闪存芯片直接通过PCI的网络接入到主机的系统主线中,提供了极大的数据传输带宽和极低的访问延迟。可以看到, PCIe的使用为DSSD的数据吞吐量提供了巨大的容量和可扩展性。

DSSD_PCIe.png

NVMe:

     NVMe的也叫做NVMHCI全称是Non-Volatile Memory Host Controller Interface Specification。NVMe提供了一种能够让主机软件直接与非易失性内存介质(Non-Volatile Memory),也就是我们通常指的SSD,使用PCIe进行通讯的子系统。作为数据传输协议,NVMe与SATA/SCSI等协议一样的接口标准,但是它应用在闪存上的效率更高。

NVMe协议具有以下优点:

  • NVMe利用了SSD的优势,同时能够并行读写大量的数据,并且为将来的3D NAND以及3DXP提供了技术基础。
  • 针对企业与消费者的SSD进行优化,是专为SSD而生的协议
  • 支持65000个IO队列,可以同时执行达到65000个IO命令
  • CPU负载低

     从NVMe的特点可以看出,它是专门为闪存设计的数据传输协议,而DSSD D5作为业界首个Shared-storage NVMe存储平台,在设计的时候也是充分利用了NVMe的优势:

  • DSSD的IO Module是一种经过特殊设计的,高密度、热插拔、支持多路径NVMe的设备。
  • DSSD客户端面向应用的NVMe接口是经过高度虚拟化的,所有的客户端(主机上通过PCIe板卡访问DSSD数据的应用)都可以识别整个DSSD中由高密度闪存芯片所组成的存储池。
  • DSSD将每个闪存模块中高达18000个NAND Die通过多个NVMe虚拟端口与客户端进行并行的高速通讯。
  • DSSD的客户端软件可以允许应用直接从用户端执行NVMe IO命令,实现最大化并发IO处理性能。

DSSD_NVMe.png

     综合来看,PCIe over NVMe是DSSD实现高性能的主体,然后支持DSSD性能的因素还有很多,后面的文章中我们还会介绍DSSD的高密度闪存颗粒的设计与Flood Client API等等内容。

0 项奖励
Fenglin1
4 Beryllium

Re: 专题:极致性能存储DSSD的故事

DSSD极致性能的秘密 – 数据访问流程

     Flood是DSSD中软件集合的名称。Flood管理着所有客户端系统到DSSD D5存储阵列的链接,当然也包括核心的数据访问流程控制。本文总我们就来看一下DSSD D5的Flood软件是如何通过这几个简化了的步骤处理客户端数据请求,实现极低延迟数据访问的过程。

DSSD_IO_1.png

首先,先了解一下整个客户端与DSSD数据通讯的过程中会包括的几个组件,分别是:

  • Client Card – 安装在主机上的并且接入系统主线的PCIe板卡,它通过PCIe线路连接到DSSD阵列上。
  • Client Memory – 这个就是应用程序在使用的主机端内存,可以是一台物理机的内存,也可以是一台VM所使用的宿主机映射给她的内存,反正就是应用程序能够最快访问数据的地方。
  • Libflood API – DSSD D5 Flood软件的开放数据接口,只针对由应用来直接访问DSSD中的数据的时候进行的数据管理,控制流设置,IO Teardown等操作。
  • Client DSSD Block Device Driver – 这个是运行在客户端上的驱动程序,虽然DSSD中的数据以对象形式存储的,但是DSSD也能够通过Block Device Driver将数据以Block(块)的形式展现给应用,就像传统的Block Device一样。
  • Control Module(CM) – DSSD的IO控制模块,它在阵列中负责元数据查找,Cubic RAID计算等控制流的计算。
  • I/O Module – DSSD的数据模块,只负责数据流(Data Flow),是一个完整的software-free data path。
  • Flash Module(FM) – DSSD中的数据容器,包含闪存芯片的特制闪存卡。
  • DMA – Direct Memory Access 一种直接让计算机中的硬件子系统不经过CPU访问内存的技术。

当客户端通过libflood API读取DSSD中数据的时候经历了以下几个步骤:

  • 应用发起一个API Call通知CM需要访问的数据
  • CM确定数据所在的FM的位置
  • CM触发一个通过Client card - > DMA - > NVMe over PCIe - > FM读取数据,然后直接将数据写入到Client Memory的数据流过程
  • 这个过程中不任何经过客户端主机的OS Kernel

DSSD_IO_2.png

如果是写入,通过libflood API写入数据到DSSD中的步骤为:

  • 应用发起一个API Write Call
  • Client Card将应用数据生成一个DMA的传输,并同时写入到三个DSSD中的位置,一个到CM、两个FM
  • 写入在DSSD 中的PCIe Mesh Fabric中是以multicast进行的,没有额外的数据拷贝发生
  • 三处写入可以保证数据的高可用性,在任何组件出现问题的时候数据都可用
  • FM中的通过Cubic RAID进行保护

DSSD_IO_3.png

如果客户端系统使用到Block Device driver,那么IO过程是:

  • 应用与block device driver交互触发一个I/O请求
  • 然后Client Card直接从应用程序的内存将数据使用DMA与DSSD D5中的数据进行传输

DSSD_IO_4.png

     根据上述的DSSD I/O数据流的描述可以看出,当应用向DSSD发起数据读写请求的时候,DSSD的客户端与存储阵列间能够以最小的通讯开销,开启客户端内存 – DSSD数据容器之间的DMA传输,这种数据传输最大限度上利用了DSSD 的PCIe over NVMe和Mesh Fabric的高带宽,低延迟的优势,并将原本复杂的IO Stack简化到只有几个步骤,从而极大地提升了数据访问性能。

0 项奖励
liulei_it
4 Germanium

Re: 专题:极致性能存储DSSD的故事

闪存的发烧友

0 项奖励
Fenglin1
4 Beryllium

Re: 专题:极致性能存储DSSD的故事

DSSD数据结构 – 数据对象、卷与元数据

     从数据存储的角度来看,DSSD是一款以对象(Object)为基础的存储,对象可以是块(Block)、文件(File)、卷(Volume)、目录(Directory)以及键值配对(Key-Value)等各种类型。这些对象在DSSD中存储为对象池(object pool)。每个对象都拥有唯一的不可重用的编号(UDI,从一个2的64次方中获取)。DSSD D5由于目前的容量限制,可以最多存储10亿个对象。

    

     一个对象是由唯一标识符(Unique ID),分段大小(Fragment size)和一个或多个分段数据所组成的。一个数据分段在一次读写的数据传输中,从应用程序内存移动到DSSD的三个目标位置(一个控制模块的DRAM和两个闪存模块的DRAM中)。下图是DSSD D5中以4K-fragment长度的存储。

DSSD-5-1.png

     对象的容器是卷(卷是另外一种对象,但是逻辑上是对象的容器),每个对象只能属于一个卷。而整个系统中的卷的总数不受限制,卷可以被一个或者多个客户端系统访问。不过当一个卷被多个客户端系统的访问的时候,多个客户端系统是以线性的方式访问卷。通过适当的加锁机制保证客户端之间对于对象的访问隔离。下图显示了卷中的对象示例:

DSSD-5-2.png

     在一个卷中,目录(Directory)对象提供了卷中对象的继承管理。对象可以通过ID访问或者通过文件路径进行访问,下图为对象访问的图示:

DSSD-5-3.png

     所有的元数据,比如闪存转换层FTL,都会通过读取对象创建被保存在D5控制模块的主内存中。一个对象有关的所有元数据都会被包含在另外一个对象中,然后在对象需要的时候写入。元数据不会产生无关的I/O,在系统启动的时候,对象会被检测然后创建FTL。而和传统文件系统不一样的是,所有DSSD系统中的I/O都是对象数据管理或者分段数据管理,而不会有任何元数据的管理的I/O。

0 项奖励
Fenglin1
4 Beryllium

Re: 专题:极致性能存储DSSD的故事

首帖更新一批官方文档!

0 项奖励
liulei_it
4 Germanium

Re: 专题:极致性能存储DSSD的故事

听说 这个存储可以连接HPC机器使用耶,这么神呀~

0 项奖励
Yanhong1
3 Cadmium

Re: 专题:极致性能存储DSSD的故事

liu同学,有空查收下你阿里云的邮件

0 项奖励
liulei_it
4 Germanium

Re: 专题:极致性能存储DSSD的故事

yes, dear

0 项奖励
Fenglin1
4 Beryllium

Re: 专题:极致性能存储DSSD的故事

DSSD Flood结构化对象与数据对象

     在前一篇文章中,我们介绍了DSSD中的数据对象、对象的容器 -  卷以及元数据的概念。本篇中我们将从Flood操作数据对象的角度介绍DSSD中的几种数据对象类型。DSSD的对象包括以下几类:块(Block)、文件(File)、卷(Volume)、目录(Directory)以及键值配对(Key-Value)。如果按照数据类型划分,Flood中将对象定义为以下几种:

Flood结构化对象(卷与目录)

     卷(Volume)在DSSD是对象的容器,表示为一组在特定Flood应用情形下对象的集合。Flood会以单个存储池(Pool)展示DSSD系统中所有的卷,而且这种展示是以预先配置在所有可用的物理存储媒体之上的(闪存模块)。Flood中支持创建大量的附加卷(Additional Volume),允许对象在不同卷之间进行隔离,使Flood客户端在不同的情形下可以看到特定卷中的特定对象。用户可以通过管理命令、web应用或者管理API对卷进行管理。

     目录(Directories)DSSD中的目录是一种对象的类型,作用是映射其他Flood的对象类型。目录可以看作一种对目录中对象值和入口操作的接口。但是这种操作只限于同一个卷内的所有对象。Flood中每个卷中有一个特殊的目录,也就是Root。所有卷宗的已命名的对象都在这个目录中被访问。

Flood数据对象(文件、块与键值)

     文件(File)与块(Block):Flood中以字节存储的数据分为两类:文件和块。Flood存储这两类的数据的时候是以一种分散的、只分配实际包含数据空间的结构存储。即使一个对象长度非常长,但只包含了写入的很小一部分字节。它也只会占用很小的空间。Flood对读取对象长度中不包含数据的部分返回的是null值。Flood对数据对象的操作分为四种:读、写、清除(trim)、扩展(crop)。其中,得益于Flood的分散数据存储的结构,清除的效率会比传统的写零操作来得快很多。扩展是改变对象的大小,只支持变大,不支持变小。这些操作对文件和块在DSSD中的

主要区别是:

  • 块对象的数据IO需要与数据分段对齐,而文件数据IO则没有这样的限制。
  • 读取数据超过块对象的末端会出现报错。
  • 读取数据超过文件对象的末端不会报错。
  • 写入文件对象数据的末端会自动触发文件扩展
  • 块对象不能统括crop操作进行扩展

     键值对象(Key-Value):Flood中的键值对象(kv object)提供了一种高效的对键和相应值配对的机制。DSSD中的单个键大小可以达到64kb。值的存储以8KB为分段,最大存储可以达到1MiB。键值的操作可以通过Flood的标准路径进行。基本操作包括:插入、查找(lookup)、删除、迭代(keys)。

0 项奖励
Fenglin1
4 Beryllium

Re: 专题:极致性能存储DSSD的故事

信息图:DSSD – The Future of Flash

(点击放大或下载附件)

0 项奖励