SPDK软件栈基础概念

news2024/7/4 6:18:42

SPDK

  • SPDK软件架构
    • SSD和SPDK中controller和ns
    • SPDK RPC
  • (一)driver
    • SPDK virtio-PCIe 和 vhost-user
  • (二)Storage Services(存储设备)
    • 对象存储
      • SPDK BlobStore&BlobFS
    • SPDK 块设备驱动
      • 块设备驱动层的其他模块
  • (三)存储协议(Storage Protocols)
    • SPDK中的Target
      • 1、vhost-nvme target & vhost-blk target
      • 2、Linux nbd 和 NVMeoF Target

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则适合需要超高性能、低延迟的分布式存储、大规模机器学习等应用场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/450565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KMP字符串匹配算法详解

目录 简单的暴力匹配算法KMP算法next数组next数组的优化 简单的暴力匹配算法 对于字符串的匹配通常是给出一个主串str和一个模式串sub,然后在主串pos位置开始匹配,如果能在str中找到sub那么就返回sub在str中首次出现的首个字符的下标,否则返…

地球系统模式(CESM)

目前通用地球系统模式(Community Earth System Model,CESM)在研究地球的过去、现在和未来的气候状况中具有越来越普遍的应用。CESM由美国NCAR于2010年07月推出以来,一直受到气候学界的密切关注。近年升级的CESM2.0在大气、陆地、海…

【论文笔记】VideoGPT: Video Generation using VQ-VAE and Transformers

论文标题:VideoGPT: Video Generation using VQ-VAE and Transformers 论文代码:https://wilson1yan. github.io/videogpt/index.html. 论文链接:https://arxiv.org/abs/2104.10157 发表时间: 2021年9月 Abstract 作者提出了…

git 常用命令及遇到问题

自己没事,把git常用命令做个记录总结。方便自己和初学者查看,本文针对初学者,如果你已经是工作多年高手,请跳过。 git的几个区认识,分别为工作区,缓存区,版本库。 工作区:包含.git…

靶机精讲:BNE0x03Simple

主机发现 nmap扫描 端口扫描 服务扫描 脚本扫描 第二十页路径有目录 web渗透 搜索该版本漏洞 CuteCMS漏洞利用 下载下来 查看文件,发现是远程文件上传漏洞 按步骤进行注册 点进去 构造利用文件,反弹shell 最后语法错误应为0>1 尝试上传 根据漏洞扫…

实验04:图像压缩(DP算法)

1.实验目的: 掌握动态规划算法的基本思想以及用它解决问题的一般技巧。运用所熟悉的编程工具,运用动态规划的思想来求解图像压缩问题。 2.实验内容: 给定一幅图像,求解最佳压缩,使得压缩后的文件最小。 3.实验要求…

容易忽视的细节:Log4j 配置导致的零点接口严重超时

作者:vivo 互联网服务器团队- Jiang Ye 本文详细的记录了一次0点接口严重超时的问题排查经历。本文以作者自身视角极具代入感的描绘了从问题定位到具体的问题排查过程,并通过根因分析并最终解决问题。整个过程需要清晰的问题排查思路和丰富的问题处理经验…

大话数据结构-查找

1 查找概论 查找表(Search Table)是由同一类型的数据元素(或记录)构成的集合,如下所示:   关键字(Key)是数据元素中某个数据项的值,又称为键值,用它可以标…

LiteFlow规则引擎的入门

文章目录 1、LiteFlow简介2、解决的痛点3、快速开始3.1 引入依赖3.2 配置规则文件的位置3.3 定义组件3.4 指定规则3.5 编写客户端3.6 运行以及说明3.7 其他的组件 4、对于快速开始的思考5、LiteFlow的脚本组件5.1 脚本的定义5.2 脚本的使用5.3 关于脚本使用的思考 6、规则引擎的…

开源Qt Ribbon控件——SARibbon的布局思路及介绍

开源Qt Ribbon控件——SARibbon的布局思路及介绍 SARibbon的布局SARibbon名词定义Office布局模式——SARibbonBar::OfficeStyleWPS布局模式——SARibbonBar::WpsLiteStylepannel的布局行数3行模式2行模式 原文链接:https://blog.csdn.net/czyt1988/article/details/…

scala之基础面向对象

scala 既是面向对象 也是函数式编程 从Java 发展而来,依赖JVM环境 一、 scala 在linux中运行 scala 模式中直接编写运行 scala文件,load执行 scala编译程序 编译 运行 scala java 二、scala 数据类型 基础数据类型 val 不可变变量 函数式编程 …

Excel使用频率超高的20个函数,90%你没用过

上班必学必会的Excel函数,不仅是使用频率最大的,还是告别加班的利器。你会的函数越多,解决问题的思路越广,不再束手束脚。态度决定高度,细节决定成败。要想比别人更优秀,只有在每一件小事上比功夫。 组合、…

json-c交叉编译及库移植

编译后的文件 json-c交叉编译及库移植资源-CSDN文库 json-c开源库是一个用c实现的解析json字段的库,嵌入式领域比较实用的库。 由于应用程序需要,需要找移植这个json-c库,所以这里对该库的移植做个简单说明 json-c开源库是一个用c实现的解…

python基于机器学习模型开发实践kaggle旧金山犯罪案件分类预测模型

旧金山犯罪案件分类本质是一个文本的多分类任务,kaggle官网地址在这里,如下所示: 本文主要是以kaggle比赛数据集为基准,开发实践文本多分类任务。 比赛背景 从 1934 年到 1963 年,旧金山因高犯罪率而臭名昭著。时至今…

opengl绘制三角形

1.绘制两个三角形 GLfloat vertices1[] { 0.5f, 0.5f, 0.0f, 0.5f, -0.5f, 0.0f, -0.5f, 0.5f, 0.0f } GLfloat vertices2[] { 0.5f, -0.5f, 0.0f, -0.5f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f } 也可以用索引的方式: GLfloat vertices[] { 0.5f, 0.5f, 0…

并发编程常见问题复盘

并发编程常见问题复盘 大家好,我是易安! 并发编程在计算机科学领域占有举足轻重的地位,它使得程序能够在多个处理器核心上同时执行,从而显著提升程序的性能。然而,并发编程也伴随着许多挑战和问题。这些年来&#xff0…

eacharjs饼状图带百分比

var myChart1 echarts.init(document.getElementById(main1)); myChart1.setOption({title:{text:近30天异常停机的类型TOP5,x:center,y:10px,// textStyle:{// fontSize:12// }},tooltip: {trigger: item//提示 鼠标移动上去},// legend: { // 上面的提示// top: 25%…

端口映射工具PortTunnel

PortTunnel应该是目前最好的端口转发器、端口映射工具(它解决了内外网访问的问题) 可以在我的资源中下载:https://download.csdn.net/download/qq_39569480/87717704 使用该工具前应该保证双方机器网络互通 下面我们模拟一下环境 比如现在有三台机器 A&#xff1a…

Mac环境SpringBoot项目Docker部署(独家完整版)

一、Docker 简介 Docker 是一种开源的容器化平台,允许开发人员将应用程序和所有其依赖项打包成轻量级、可移植的容器,以便在任何地方运行。Docker 的优势和劣势分析如下: 优势: 轻量级:Docker 容器仅包含应用程序及其依赖项,因…

家庭智能吸顶灯一Homekit智能

买灯要看什么因素 好灯具的灯光可以说是家居的“魔术师”,除了实用的照明功能外,对细节的把控也非常到位。那么该如何选到一款各方面合适的灯呢? 照度 可以简单理解为清晰度,复杂点套公式来说照度光通量(亮度&#x…