温馨提示
✦
由于英文函数名较长,为了获得更佳的阅读体验,建议在手机横屏或电脑网页阅读~
✦
✦
一、背景介绍
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函数