初识SPDK

* 内容速览 *

本文在存储的大背景下,对SPDK加速NVMe SSD后端存储应用的原理进行了简单分析,并对其主要应用场景进行了总结。同时,本文给出了SPDK相关的性能测试、项目开发、论坛交流等介绍,适宜初学者快速了解SPDK项目。

1

从hello world开始

Hello world基本是大部分程序员写下的第一个小程序。

#include <stdio.h>

int main()    

{    

      FILE *fp = NULL;    

      fp = fopen("/home/test.txt","w");    

      if(fp)    

      {    

           fprintf(fp, "hello world\n");    

      }    

      fclose(fp);    

      return 0;    

}

上述程序会在/home/目录下创建test.txt文件,并写入hello world字符,那么程序是怎样完成这一工作的。

我们知道home目录本质是我们挂载到计算机中的一种存储设备,这种文件目录的层次结构存储,称为文件存储。操作系统中的文件系统会负责把用户文件持久化地保存在磁盘中,即使断电,存储的内容也不会丢失,实际上文件系统可以理解为对存储设备中的文件进行组织管理,组织的方式不同就会存在有不同的文件系统。为了完成对数据的管理,文件系统分配了两个数据结构:索引节点(index node)以及目录项(directory)。索引节点记录了inode编号、数据的大小、权限、位置等信息,称之为元数据(metadata);目录项则用来存储索引节点指针、目录的层级关系,多个目录项关联起来就形成了文件系统。

需要指出的是,元数据持久化存储在磁盘中,占据一定的存储空间。在Linux系统中,基于一切皆文件的设计理念,不仅仅是普通文件受到文件系统的管理,其他例如socket,块设备等也是交由文件系统进行管理,因此在Linux系统中存储系统可以简单地分为本地存储系统和基于网络的远程存储系统,因为远程存储系统本质是通过socket,返回了一个文件描述符。

737bd1dd0c9be74f9e5deb4720b4c613.png

图1. 远程存储系统

在现代操作系统框架下,程序运行在目态和管态,也就是用户态和内核态,显而易见,我们编写的用户程序运行在用户态,而挂载在计算机中的存储设备属于外设的一种,操作存储设备的行为则需要进入到内核态,因此运行在用户态的程序本身不具备操作外设的条件,尽管某些技术会提供直接操作的接口,但一般说来,为了访问到外设进行读写操作(I/O),用户态程序需要通过系统调用(system  call)进入到内核中,上述代码中,fopen(),fclose()是C库函数暴露给用户的接口,在打开了一个文件以后,返回了文件描述符。

bc8690e6bc9cfbd6802b21ed49b1ba97.png

图2. 系统调用过程

用户程序通过系统调用进入到内核中的虚拟文件系统(v

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、付费专栏及课程。

余额充值