SPDK软件栈基础概念

SPDK软件架构

在这里插入图片描述

SSD和SPDK中controller和ns

在 NVMe SSD 中,一个 Controller 和多个 Namespace 的概念与 SPDK 中的 Controller 和 Namespace 概念基本相同,但是在细节上有一些区别。

  1. Namespace 的定义:在 NVMe SSD 中,Namespace 是一个虚拟的存储设备,由控制器(Controller)和对应的命名空间标识符(Namespace Identifier)组成。而在 SPDK 中,Namespace 也是一个虚拟的存储设备,但是它只由命名空间标识符(Namespace Identifier)表示,没有控制器的概念。

  2. 命名空间的数量:在 NVMe SSD 中,一个控制器(Controller)可以管理多个 Namespace。而在 SPDK 中,每个 Namespace 都是独立的,不会被分配到多个控制器中,每个命名空间只会被一个控制器管理。

  3. 接口实现:NVMe SSD 是一种硬件设备,因此其控制器(Controller)和命名空间(Namespace)都是由硬件实现的。而 SPDK 是一个软件库,其中的控制器(Controller)和命名空间(Namespace)都是由软件接口实现的,可以在任意支持 SPDK 的硬件平台上运行。

总之,在 NVMe SSD 和 SPDK 中,Controller 和 Namespace 这两个概念都是用来描述存储设备的逻辑组件,其中 Controller 负责管理 Namespace,并提供读写、擦除等操作。但是两者在实现方式和功能方面有所不同,需要根据具体的应用场景进行选择。

SPDK RPC

SPDK (Storage Performance Development Kit) 中的 RPC (Remote Procedure Call) 命令是用于远程管理 SPDK 的命令行工具。以下是一些常用的 SPDK RPC 命令:

  1. bdev_malloc_create:创建一个基于 malloc 的块设备。

  2. bdev_null_create:创建一个基于 null 的块设备。

  3. bdev_nvme_attach_controller:将 NVMe SSD 控制器附加到 SPDK 上下文中。

  4. bdev_nvme_detach_controller:从 SPDK 上下文中分离 NVMe SSD 控制器。

  5. bdev_nvme_attach_ns:将 NVMe SSD 资源暴露为块设备。

  6. bdev_nvme_detach_ns:从 SPDK 上下文中分离 NVMe SSD 块设备。

  7. nvmf_create_transport:创建一个 NVMe over Fabrics 传输对象。

  8. nvmf_create_subsystem:创建一个 NVMe over Fabrics 的子系统,该子系统可以包含多个命名空间和控制器。

  9. nvmf_subsystem_add_listener:将 NVMe over Fabrics 子系统绑定到传输层监听地址。

  10. nvmf_subsystem_remove_listener:从 NVMe over Fabrics 子系统中移除传输层监听地址。

这些 RPC 命令可以通过 SPDK 提供的 CLI 工具(如 spdkcli)或者 JSON-RPC API 进行调用。用户可以使用这些命令来管理 SPDK 中的各种资源,包括块设备、NVMe SSD 控制器和 NVMe over Fabrics 子系统等。

(一)driver

SPDK virtio-PCIe 和 vhost-user

1、virtio-PCIe是一种基于PCI Express总线的虚拟化设备标准,并且是virtio的一个扩展。它通过在物理PCIe设备上实现虚拟化,使得虚拟机可以直接访问物理PCIe设备。SPDK在virtio-PCIe上实现了块设备、网络设备和其他类型的设备,从而提供更高效的I/O操作。

2、 相比之下,vhost-user则是一种用户空间网络设备虚拟化技术,它允许用户空间应用程序直接管理虚拟机的网络设备。SPDK使用vhost-user来实现用户空间网络功能,这样可以避免虚拟机和主机之间的数据复制,从而提高网络性能并降低延迟。

总体来说,SPDK使用virtio-PCIe和vhost-user等虚拟化技术来优化存储和网络性能,并提高整个系统的效率和吞吐量。
3、Intel QuickData Technology:也称为Intel I/O Acceleration Technology(Inter IOAT,英特尔I/O加速技术),这是一种基于Xeon处理器平台上的copy offload引擎。通过提供用户空间访问,减少了DMA数据移动的阈值,允许对小尺寸I/O或NTB的更好利用。

(二)Storage Services(存储设备)

对象存储

对象存储是一种数据存储技术,用于将数据以对象(Object)的形式进行管理和存储。与传统的文件系统不同,对象存储不使用层次目录结构来组织数据,而是将每个数据项都视为一个独立的对象,并为其分配唯一的标识符(或者称为键)。这些对象可以是任意大小的二进制数据,可以包含多种类型的元数据(例如创建时间、修改时间、拥有者等),并可以通过网络协议(如HTTP、S3)进行访问。

由于对象存储不需要对数据进行分块或者组织成文件夹和文件等结构,它具有很强的可扩展性和灵活性。在大规模数据集的场景下,对象存储可以处理海量的数据,并提供高可靠性、高可用性和高性能的数据访问服务。同时,对象存储还支持复杂的数据管理功能,例如版本控制、数据备份、数据恢复、数据加密等。

基于对象存储技术的应用非常广泛,例如云计算、物联网、大数据分析、视频监控等领域。常见的对象存储系统包括Amazon S3、OpenStack Swift、Ceph、Scality、Hadoop HDFS等。近年来,越来越多的企业和组织开始使用对象存储替代传统的文件系统和数据库,以应对大数据时代带来的挑战。

SPDK BlobStore&BlobFS

SPDK中的BlobFS和Blobstore是两个不同的库,但它们之间存在着一定的联系。

Blobstore是一个基于SPDK的对象存储引擎,提供了高性能、低延迟的对象存储接口。它支持各种数据类型(包括二进制、文本、图像等),并可以处理大规模数据集的存储和访问。Blobstore使用了多线程和异步IO等技术来实现高性能和可扩展性,支持多种协议(如NVMe-oF、RDMA、TCP等)进行对象读写。

而BlobFS则是在Blobstore的基础上开发的一个文件系统。它将Blobstore中的对象组织成类似于层次目录结构的文件和文件夹,并提供了标准的POSIX文件系统接口。这使得使用BlobFS的应用程序可以像使用传统文件系统一样访问和管理数据。BlobFS还提供了一些高级功能,例如快照管理、事务支持、压缩、加密等。与Blobstore不同,BlobFS支持多种文件系统分布式架构(如分布式元数据存储、多副本等)以及强一致性模型保证。

因此,Blobstore主要是一个对象存储引擎,用于处理大规模数据集的存储和访问;而BlobFS则是一个基于Blobstore的文件系统,用于为应用程序提供标准的文件系统接口和高级功能。

SPDK 块设备驱动

SPDK(Storage Performance Development Kit)提供了多个块设备驱动,用于支持不同类型的块设备接口。以下是SPDK中一些常用的块设备驱动:

  1. bdev_aio:使用Linux AIO库进行异步文件IO操作。
  2. bdev_uring:使用Linux io_uring库进行异步文件IO操作。
  3. bdev_malloc:使用内存模拟块设备。
  4. bdev_null:使用内存模拟空块设备。
  5. bdev_nvme:使用NVMe SSD进行块设备IO操作。
  6. bdev_rbd:使用Ceph RBD(Rados Block Device)进行分布式块设备IO操作。
  7. bdev_virtio:在虚拟环境中使用virtio协议进行块设备IO操作。

此外,SPDK还提供了其他一些块设备驱动,如bdev_iscsi(使用iSCSI协议进行块设备IO操作)、bdev_pmem(使用持久内存进行块设备IO操作)等。用户可以根据实际需求选择合适的驱动程序。
SPDK(Storage Performance Development Kit)提供了多种方式将底层物理设备抽象成块设备,以下是其中一些常见的方法:

  1. 使用NVMe SSD进行块设备IO操作:SPDK提供了bdev_nvme驱动程序,将NVMe SSD设备暴露给SPDK框架,并将其抽象成块设备。用户可以通过配置文件或命令行参数等方式指定NVMe SSD设备的PCI地址、分区信息等,从而让SPDK能够正确地识别和管理该设备。
  2. 使用Linux AIO进行异步文件IO操作:SPDK提供了bdev_aio驱动程序,使用Linux AIO库进行异步文件IO操作。用户可以通过配置文件或命令行参数等方式指定要管理的文件路径等信息。
  3. 使用Ceph RBD进行分布式块设备IO操作:SPDK提供了bdev_rbd驱动程序,使用Ceph RBD(Rados Block Device)进行块设备IO操作。用户可以通过配置文件或命令行参数等方式指定Ceph集群的IP地址、端口号、认证信息等参数,从而实现对Ceph RBD的访问。
  4. 在虚拟化环境中使用virtio协议进行块设备IO操作:SPDK提供了bdev_virtio驱动程序,支持在虚拟环境中使用virtio协议进行块设备IO操作。用户可以通过配置文件或命令行参数等方式指定virtio-blk-pci设备的信息,从而让SPDK能够正确地识别和管理该设备。
    除了上述方法外,SPDK还提供了其他一些块设备驱动程序,如bdev_pmem(使用持久内存进行块设备IO操作)等。用户可以根据实际需求选择合适的方式,并使用SPDK提供的相应驱动程序进行配置和管理。

块设备驱动层的其他模块

  1. Party:Party 是 SPDK 中的一个基础库,它为用户空间的异步事件驱动编程模型提供了支持。

  2. Logical Volumes:Logical Volume 是逻辑卷的意思,SPDK 的逻辑卷管理器提供了一组 API,用于动态管理逻辑卷和卷组。

  3. Crypto:Crypto 模块提供了加密和解密操作的支持。它可以通过多个后端实现,包括 Intel QAT 硬件加速、OpenSSL 和 AESNI 等。

  4. Open Channel SSD FTL:Open Channel SSD FTL 是一种特殊类型的 SSD,它通过将控制器中的一些功能暴露给主机来提高性能。SPDK 提供了一组 API,允许用户直接在主机上使用 Open Channel SSD。

  5. OCF Cache:OCF Cache 是 SPDK 的一个缓存管理框架,它将缓存数据存储在系统内存中以提高性能。

  6. Compression:Compression 模块提供了压缩和解压缩数据的支持。 它可以通过多个后端实现,包括 zlib 和 Intel QuickAssist Technology (QAT)。

  7. QoS(服务质量)框架:框架允许用户设置存储设备可以消耗的带宽、IOPS(每秒输入/输出操作次数)或延迟的限制。通过设置这些限制,用户可以确保他们的存储设备不会超过某些阈值,从而有助于预防性能问题并改善整个系统的稳定性。 SPDK中的QoS框架被设计为灵活且可扩展,可以用于各种应用程序。
    SPDK QoS框架的一些关键特点包括支持多个QoS策略,动态调整QoS参数以及实时监测设备性能。

(三)存储协议(Storage Protocols)

SPDK中的Target

在SPDK中,Target是指向存储设备的逻辑地址空间,它可以是一个磁盘驱动器、SSD、NVMe设备或者任何其他类型的存储设备。Target通常由两个组件组成:前端和后端。前端负责处理来自应用程序的请求,将这些请求转换为SPDK所需的格式并将其发送到后端处理。后端负责实际的I/O操作,包括数据传输和数据处理。前端和后端之间通过SPDK框架提供的API进行通信。一个Target可能有多个前端和多个后端。例如,一个NVMe设备可以拥有多个命名空间,每个命名空间都可以看作是一个独立的Target,但是这些Target共享相同的后端。这种设计使得SPDK可以支持高并发的I/O操作,并提供更好的性能和可扩展性。

1、vhost-nvme target & vhost-blk target

1、 vhost-blk target允许虚拟机通过网络连接访问主机上的块设备。它提供了一个轻量级的虚拟接口,将块设备公开给虚拟机,并支持多个虚拟机同时访问同一块设备。该技术通常用于构建基于共享存储的虚拟化环境,可以帮助提高资源利用率和管理效率。

2、vhost-nvme target则是针对NVMe存储设备的虚拟化技术。它允许虚拟机通过vhost-nvme接口直接访问主机上的NVMe设备。与vhost-blk target不同的是,vhost-nvme target提供了更高的性能和更低的延迟,适用于需要超高性能的应用场景,例如人工智能、大数据分析等。

总之,vhost-blk target和vhost-nvme target都是SPDK中提供的虚拟化块设备技术,但面向不同的应用场景和需求。vhost-blk target适用于一般虚拟化环境,而vhost-nvme target则适用于需要超高性能的应用场景。

2、Linux nbd 和 NVMeoF Target

1、Linux nbd基于TCP/IP网络协议实现,允许客户端通过网络连接访问主机上的块设备。它通过将块设备封装在网络数据包中来实现块设备级别的网络传输。这种方法简单有效,因此nbd被广泛应用于云计算、虚拟化等场景,以提高资源利用率和管理效率。

2、NVMe-oF target则是一种专门针对NVMe存储设备的远程访问协议,它允许远程客户端通过标准网络协议(如TCP/IP、InfiniBand)访问本地NVMe存储设备。NVMe-oF target比nbd更适合需要超高性能、低延迟的应用场景,例如分布式数据库、大规模机器学习等。

总之,Linux nbd和NVMe-oF target都是实现块设备级别的远程访问的技术,但面向不同的应用场景和需求。nbd基于TCP/IP网络协议实现,适合于一般的云计算、虚拟化等场景,而NVMe-oF target则适合需要超高性能、低延迟的分布式存储、大规模机器学习等应用场景。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SPDK(存储性能开发套件)官方文档中文版。 第一章 简介 1 1.1.什么是SPDK? 1 1.2.入门 1 1.3. Vagrant开发环境 3 1.4.更新日志(略) 6 第二章 概念 6 2.1. 用户空间驱动程序** 6 2.2. 来自用户空间的DMA** 7 2.3. 消息传递和并发** 9 2.4. NAND Flash SSD内部 13 2.5. 将I / O提交到NVMe设备** 15 2.5.1 NVMe规范 15 2.5.2 SPDK NVMe驱动程序I / O路径 15 2.6. 使用Vhost-user进行虚拟化I / O. 16 2.6.1 介绍 16 2.6.2 QEMU 17 2.6.3 设备初始化 18 2.6.4 I / O路径 19 2.6.5 SPDK优化 20 2.7. SPDK目录结构概述 20 2.8. SPDK移植指南 22 第三章 用户指南 22 3.1. 系统配置用户指南 22 3.1.1 IOMMU配置 22 3.2. SPDK应用程序概述 23 3.2.1 配置SPDK应用程序 23 3.3. iSCSI Target 26 3.3.1. iSCSI Target入门指南 26 3.3.2. 通过配置文件配置iSCSI Target 27 3.3.3. 通过RPC方法配置iSCSI Target 28 3.3.4. 配置iSCSI启动器 29 3.3.5. rpc配置示例*** 30 3.3.6. iSCSI 热插拔 32 3.4. NVMe over Fabrics Target 32 3.5. Vhost Target(略) 37 3.6 块设备用户指南 38 3.6.1 bdev介绍 38 3.6.2 通用RPC命令 38 3.6.3 Ceph RBD 39 3.6.4 压缩虚拟Bdev模块 40 3.6.5 加密虚拟Bdev模块 41 3.6.6 延迟vbdev模块 41 3.6.7 GPT(GUID分区表) 42 3.6.8 iSCSI bdev 43 3.6.9 Linux AIO bdev 43 3.6.10 OCF虚拟bdev 43 3.6.11 Malloc bdev 44 3.6.12 NULL bdev 44 3.6.13 NVMe bdev 44 3.6.14 逻辑卷Lvol 45 3.6.15 RAID 46 3.6.16 Passthru 46 3.6.17 Pmem 46 3.6.18 Virtio Block 47 3.6.19 Virtio SCSI 47 3.7 BlobFS(Blobstore文件系统) 48 3.7.1 RocksDB集成 48 3.7.2 FUSE插件 49 3.8 JSON-RPC方法(略) 49 第四章 程序员指南 49 4.1. Blobstore程序员指南 49 4.1.1 介绍 50 4.1.2 运作理论 50 4.1.3 设计注意事项 52 4.1.4 例子 54 4.1.5配置 54 4.1.6 组件细节 54 4.2. 块设备层编程指南 56 4.3 编写自定义块设备模块 58 4.3.1 介绍 58 4.3.2 创建一个新模块 59 4.3.3创建虚拟Bdev 60 4.4 NVMe over Fabrics目标编程指南 61 4.4.1 介绍 61 4.4.2 原语结构体 61 4.4.3 基础函数 62 4.4.4访问控制 62 4.4.5发现子系统 62 4.4.6 传输 63 4.4.7选择线程模型 63 4.4.8 跨CPU核心扩展 63 4.4.9 零拷贝支持 63 4.4.10 RDMA 63 4.5 Flash传输层 64 4.5.1 术语 64 4.5.2 使用方法 67 4.6 GDB宏用户指南 69 4.6.1 介绍 69 4.6.2 加载gdb宏 71 4.6.3 使用gdb数据目录 72 4.6.4 使用.gdbinit加载宏 72 4.6.5 为什么我们需要显式调用spdk_load_macros 72 4.6.6 以上可用的宏总结 73 4.6.7 添加新宏 73 4.7 SPDK “Reduce”块压缩算法 73 4.7.1 介绍 73 4.7.2 例子 74 4.8 通知库 78 第五章 基本信息 79 5.1 事件框架 79 5.1.1 事件框架设计注意事项 80 5.1.2 SPDK事件框架组件 80 5.1.3 应用框架 80 5.2 逻辑卷 81 5.2.1 术语 81 5.2.2 配置逻辑卷 84 5.3 矢量数据包处理(略) 86 第六章 杂项 86 6.1 介绍 86 6.2 NVMe的P2P API 86 6.3 确定设备支持 87 6.4 P2P问题 87 第七章 驱动程序 88 7.1 NVMe驱动程序*** 88 7.1.1 介绍 88 7.1.2 例子 88 7.1.3 公共接口 89 7.1.4 NVMe驱动程序设计 89 7.1.5 NVMe over Fabrics主机支持 91 7.1.6 NVMe多进程 91 7.1.7 NVMe Hotplug 92 7.2 I/OAT驱动程序 93 7.2.1 公共接口 93 7.2.2 关键功能 93 7.3 Virtio驱动程序 93 7.3.1 介绍 93 7.3.2 2MB大页面 93 第八章 工具 94 8.1 SPDK CLI 94 8.1.1 安装所需的依赖项 94 8.1.2 运行SPDK应用程序实例 94 8.1.3 运行SPDK CLI 94 8.1.4 可选 - 创建Python虚拟环境 94 8.2 nvme-CLI 95 8.2.1 nvme-cli with SPDK入门指南 95 8.2.2 使用场景 95 第九章 性能测试报告(略) 96 第十章NVMe-oF Target跟踪点*** 96 10.1 介绍 96 10.2 启用跟踪点 97 10.3 捕获事件的快照 97 10.4 捕获足够的跟踪事件 98 10.5 添加新的跟踪点 99

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值