SPDK vhost-user结合SPDK NVMe-oF RDMA性能调优参考

背景介绍

之前的文章我们有介绍过NVMe-oF RDMA以及vhost-user,在不同的场景下如何测试性能

(详细性能报告参考: https://spdk.io/doc/performance_reports.html),

这里我们主要介绍如何测试vhost-user使用本地bdev以及结合使用NVMe-oF RDMA使用远端bdev测试性能,并且对他们的性能进行比较。

SPDK中vhost-user主要模块及RPC

首先,我们介绍SPDK中几个和vhost-user相关的函数以及相应的rpc命令。

vhost_create_blk_controller函数

使用vhost_create_blk_controller RPC创建block控制器。这个rpc函数有7个参数,第一和第二个参数是必选参数,第一个参数是对应控制器的名字,第二个参数是对应Bdev设备的名字。第三个表示此block控制器使用的CPU mask,第四个是virtio blk使用的transport(默认是vhost_user_blk),第五个参数用于设置控制器为read-only,第六个参数用于设置控制器为packed ring模式,第七个参数用使能packed ring在线恢复。后面五个参数都是可选参数。示例命令如下:

./scripts/rpc.pyvhost_create_blk_controller --cpumask 0x1 vhost.1 null1

该命令将创建一个block控制器,指定的CPU mask是0x1(即第一个CPU),一般其它参数我们使用默认值,vhost.1是对应控制器的名字,null1是对应Bdev设备的名字。

fec10f1d6eeafdb8dd3cb8ae99969ce8.png

表1 vhost_create_blk_controller函数参数及说明

使用SPDK vhost-user测试本地bdev实例

SPDK Vhost-user本地Target和Initiator的拓扑图如下所示

Host Machine是标准的bare metal的服务器,上面运行vhost-target应用程序,并且配置本地的bdev作为后端。VM1,VM2和VMn即Initiator,由QEMU启动。在虚拟机VM1,VM2及VMn中跑fio来测试Vhost-Target使用本地bdev的性能。

cf5a6ed87bcfc9fa4bf26cc55d5c97cd.png

图1 SPDK Vhost-user本地Target和Initiator拓扑图

测试步骤如下

此测试旨在获得SPDK Vhost-Target在使用本地bdev时,在虚拟机上测试可以达到的性能指标。

  • SPDK Host端

在SPDK Host服务器端启动vhost应用程序,这里“-S”参数用于指定创建vhost socket的路径,“-s”参数用于指定内存的大小,单位是MB。“-m”参数用于指定CPU core mask。这里指定一个CPU core,需要提一下,一个vhost controller对应只能在一个SPDK vhost配置 的core上运行。

./build/bin/vhost -S /var/tmp -s 1024 -m 0x1

创建一个大小为100G的null bdev

./scripts/rpc.py bdev_null_create null1 102400 512

创建一个名为vhost.1的vhost controller,这里指定cpu mask为0x1,对应上面启动vhost时候的CPU core mask

./scripts/rpc.py vhost_create_blk_controller --cpumask 0x1 vhost.1 null1

启动qemu虚拟机,关键参数如下,smp代表CPU核的数量,num-queues表示queue的数量,建议配置成相同的值。

qemu-system-x86_64 \

  -cpu host -smp 16 \

  -chardev socket,id=spdk_vhost_blk0,path=/var/tmp/vhost.1 \

  -device vhost-user-blk-pci,chardev=spdk_vhost_blk0,num-queues=16 \

  • 虚拟VM端

通过ssh命令登录虚拟机

运行lsblk命令可以看到对应的vda设备,容量为100G

[root@fedora ~]# lsblk

NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS

sda                    8:0    0   11G  0 disk

├─sda1                   8:1    0    1G  0 part /boot

└─sda2                   8:2    0   10G  0 part

  └─fedora_fedora-root 253:0    0   10G  0 lvm  /

zram0                  251:0    0    8G  0 disk [SWAP]

vda                    252:0    0  100G  0 disk

运行fio命令测试IOPS

#fio fio.job

# cat fio.job

[global]

thread=1

direct=1

invalidate=1

ioengine=libaio

norandommap=1

group_reporting=1

bs=4k

rw=randread

iodepth=128

time_based=1

ramp_time=30

runtime=240

numjobs=1

[job0]

filename=/dev/vda

注:这里可以修改numjobs为2,4,8,16等来测试不同的numjobs数对应的fio的IOPS值,也可以通过创建多个null bdev来测试多个设备的对应的fio的IOPS值。

使用SPDK vhost-user测试

NVMe-oF远端bdev的实例

SPDK vhost-user结合NVMe-oF远端Target和Initiator的拓扑图如下所示

NVMe-oF Target Machine是标准的bare metal的服务器,上面运行SPDK nvmf_tgt应用程序,并且配置对应的local bdev。Host Machine也是标准的bare metal服务器,其上运行Vhost-target应用程序,通过QEMU启动虚拟机VM1,VM2,VMn等。通过在虚拟机VM1,VM2,VMn中跑fio来测试Vhost-Target通过NVMe-oF RDMA使用远端bdev的性能。

d263e2612238efba6ded0fdd10f549c8.png

图2 SPDK Vhost-user结合NVMe-oF远端Target和Initiator拓扑图

测试步骤如下

本测试旨在测试SPDK Vhost-user结合NVMe-oF远端Target的remote bdev,在虚拟机中测试fio的性能与SPDK Vhost-user使用本地bdev的性能对比。

  • NVMe-oF Target端

NVMe-oF Target连接Host Machine的IP地址为192.168.3.10,启动nvmf_tgt应用,指定CPU coremask

./build/bin/nvmf_tgt-i 0 -e 0xFFFF -m 0xF

创建transport,创建bdev,创建subsystem,添加namespace以及listener。

./scripts/rpc.py nvmf_create_transport -t rdma -u 8192

./scripts/rpc.py bdev_null_create Null1 102400 512

./scripts/rpc.py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001

./scripts/rpc.py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 Null1

./scripts/rpc.py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t rdma -a 192.168.3.10 -s 4420

  • Vhost-Target端

启动vhost应用程序,attach控制器,并创建名为vhost.1的vhost controller。

./build/bin/vhost -S /var/tmp -s 1024 -m 0x1

./scripts/rpc.py bdev_nvme_attach_controller -b Nvme0 -t rdma -f ipv4 -a 192.168.3.10 -s 4420 -n nqn.2016-06.io.spdk:cnode1

./scripts/rpc.py vhost_create_blk_controller --cpumask 0x1 vhost.1 Nvme0n1

启动虚拟机,关键参数如下,smp代表CPU核的数量,num-queues表示queue的数量,建议配置成相同的值。

qemu-system-x86_64 \

  -cpu host -smp 16 \

  -chardev socket,id=spdk_vhost_blk0,path=/var/tmp/vhost.1 \

  -device vhost-user-blk-pci,chardev=spdk_vhost_blk0,num-queues=16 \

  • 虚拟机VM端

通过ssh命令登录虚拟机

运行lsblk命令可以看到对应的vda设备,容量为100G

[root@fedora ~]# lsblk

NAME               MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS

sda                    8:0    0   11G  0 disk

├─sda1                   8:1    0    1G  0 part /boot

└─sda2                   8:2    0   10G  0 part

  └─fedora_fedora-root 253:0    0   10G  0 lvm  /

zram0                  251:0    0    8G  0 disk [SWAP]

vda                    252:0    0  100G  0 disk

运行fio命令测试IOPS

#fio fio.job

# cat fio.job

[global]

thread=1

direct=1

invalidate=1

ioengine=libaio

norandommap=1

group_reporting=1

bs=4k

rw=randread

iodepth=128

time_based=1

ramp_time=30

runtime=240

numjobs=1

[job0]

filename=/dev/vda

注:这里可以修改numjobs为2,4,8,16等来测试不同的numjobs数对应的fio的IOPS值,也可以通过创建多个nullbdev来测试多个设备的对应的fio的IOPS值。

结合以上两种测试场景,我们对比了不同的numjob情况下,vhost-user测试本地bdev对照NVMe-oF RDMA远端bdev的性能,可以看出来,IOPS基本没有损耗。

d8793c048ee98565192543ee5c3a2960.png

表2  vhost-user测试本地bdev对照NVMe-oF远端bdev的IOPS数据

注1:测试环境为Host:Intel(R) Xeon(R) Platinum 8280L CPU @ 2.70GHz; 128G RAM, 32G Hugepage, 2M hugepage size, 100Gbps RDMA NIC。VM: 16Vcpu, 16G RAM。Block Device:本地和远地都是null bdev。

注2:端到端性能不仅取决于SPDK vhost和NVMe-oF软件配置,同时取决于相关的硬件性能,比如网卡,PCIe,NUMA等等。

注3:这里的性能数据仅作为参考,不作为正式性能测试数据使用。

参考文献

1.https://spdk.io/

2.https://review.spdk.io/gerrit/c/spdk/spdk/+/12818

3.https://spdk.io/doc/vhost.html

198d69672fe4c7c30af1a3e0e43d4ddc.jpeg

转载须知

DPDK与SPDK开源社区

公众号文章转载声明

推荐阅读

SPDK Mini-HaT注册开启!

绿网采用英特尔®TADK提供基于AI的智能DPI检测方案

DPDK Release 22.07

2021SPDK线上论坛(三) | SPDK高性能NVMe虚拟化方案

24ed64ff992156f03918c4a711cf45da.jpeg

1307a614daa73aaf4c2530e19805108e.gif

点点“赞”“在看”,给我充点儿电吧~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值