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

一. 背景介绍

这里我们主要介绍如何测试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设备的名字。

SPDK vhost-user结合SPDK NVMe-oF RDMA性能调优_第1张图片

表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的性能。

SPDK vhost-user结合SPDK NVMe-oF RDMA性能调优_第2张图片

图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的性能。

SPDK vhost-user结合SPDK NVMe-oF RDMA性能调优_第3张图片

图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基本没有损耗。

表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:这里的性能数据仅作为参考,不作为正式性能测试数据使用。

原文链接:https://blog.csdn.net/weixin_37097605/article/details/126635003

更多DPDK学习资料有需要的可以自行添加进入学习交流君 羊 793599096 免费获取,或自行报名学习,免费订阅,永久学习,关注我持续更新哦!!!

学习地址:http://ke.qq.com/course/5066203?flowToken=1043717

你可能感兴趣的:(java,服务器,网络,网络协议,linux)