SPDK Delay Bdev 介绍及应用实例

本文介绍了SPDK的Delay Bdev模块,用于模拟IO延迟,适用于测试和调试。通过RPC命令创建、删除和更新delay_bdev,调整读写延迟和P99延迟。此外,还展示了如何结合SPDK和Kernel进行延迟测试,通过实例解释了如何在不同场景下使用Delay Bdev来模拟网络和设备延迟,以分析其对系统性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

温馨提示

由于英文函数名较长,为了获得更佳的阅读体验,建议在手机横屏或电脑网页阅读~

一、背景介绍

2019年3月,SPDK社区首次实现了Delay Bdev,如这个Bdev的名称,主要用来模拟IO的Delay,并在SPDK 19. 07版本中正式发布。本次发布添加了新的bdev 模块“延迟(Delay)”,delay_bdev基于base_bdev,用于模拟驱动设备的延迟,此模块更多用于测试和调试不同IO情况来使用。可以使用新的RPC命令‘bdev_delay_create’来创建delay_bdev。

该RPC测参数包括base_bdev的名称,读写操作的平均延迟和读写操作的P99延迟。平均延迟即性能测试工具比如fio提交到驱动程序的所有I/O的平均延迟。P99 延迟指的是所有I/O中最慢的1%的I/O的延迟。对于具有显著延迟的底层驱动程序来说,这个延迟是一个很好的附加。如果试图在nvme驱动程序或aio设备上实现人工延迟,应该考虑使用Delay Bdev。

二、SPDK为什么要使用Delay Bdev模块

Delay_bdev模块是基于底层的base_bdev之上预先定义的延迟。从而在SPDK应用程序的功能性测试及扩展性测试期间来模拟设备的延迟。例如,为了模拟处理I/O时驱动程序的时延的影响,我们可以基于NULL bdev配置一个delay_bdev来达到同样的效果。Delay Bdev模块不是为了提供特定NVMe驱动延迟的高度模拟,相反,其主要目的是从大的方向上了解我们一般来说的延迟对某些特定应用程序的影响。

三、SPDK Delay Bdev模块介绍

首先,我们介绍SPDK最新代码中几个和delay_bdev相关的函数。主要包括创建delay_bdev、删除delay_bdev和更新delay_bdev的延迟的函数。然后介绍通过使用bdev_nvme_set_options函数,设置spdk host端超时时间设置和超时操作等。

1.

Bdev_delay_create函数

使用bdev_delay_create RPC创建delay_bdev。这个rpc函数有6个参数,第一个表示delay_bdev的名称,第二个代表base_bdev的名称。其余四个参数表示以下延迟值:平均读延迟、平均写延迟、P99读延迟和P99写延迟。在delay_bdev的语境中,P99延迟表示在完成I/O并提交到上层协议之前,1%的I/O至少会达到P99延迟的值。这里所有的延迟都以微秒为单位。bdev_delay_create函数的返回值为新创建bdev的名称。示例命令如下:

rpc.py bdev_delay_create -b Null0 -d delay0 -r 10 --nine-nine-read-latency 50 -w 30 --nine-nine-write-latency 90

该命令将创建一个delay_bdev,平均读和写延迟分别为10微秒和30微秒,P99读和P99写延迟分别为50微秒和90微秒。

名字

可选参数

参数类型

描述

Base_bdev_name

Required

String

Bdev name

Avg_read_latency

Required

Number

平均读延迟(us)

P99_read_latency

Required

Number

P99读延迟(us)

Avg_write_latency

Required

Number

平均写延迟(us)

P99_write_latency

Required

Number

P99 写延迟(us)

表1 bdev_delay_create函数参数及说明

2.

Bdev_delay_delete函数

使用bdev_delay_delete RPC函数来删除delay bdev。示例命令如下:

rpc.py bdev_delay_delete delay0

此函数用于删除创建的delay_bdev,函数的返回值是 true 或者 false。

名字

可选参数

参数类型

描述

name

Required

String

Bdev name

表 2 bdev_delay_delete 函数参数和说明

3.

Bdev_delay_update_latency函数

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

余额充值