这里我们主要介绍如何测试vhost-user使用本地bdev以及结合使用NVMe-oF RDMA使用远端bdev测试性能,并且对他们的性能进行比较。
首先,我们介绍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设备的名字。
表1 vhost_create_blk_controller函数参数及说明
SPDK Vhost-user本地Target和Initiator的拓扑图如下所示
Host Machine是标准的bare metal的服务器,上面运行vhost-target应用程序,并且配置本地的bdev作为后端。VM1,VM2和VMn即Initiator,由QEMU启动。在虚拟机VM1,VM2及VMn中跑fio来测试Vhost-Target使用本地bdev的性能。
图1 SPDK Vhost-user本地Target和Initiator拓扑图
此测试旨在获得SPDK Vhost-Target在使用本地bdev时,在虚拟机上测试可以达到的性能指标。
在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 \
通过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值。
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的性能。
图2 SPDK Vhost-user结合NVMe-oF远端Target和Initiator拓扑图
本测试旨在测试SPDK Vhost-user结合NVMe-oF远端Target的remote bdev,在虚拟机中测试fio的性能与SPDK Vhost-user使用本地bdev的性能对比。
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应用程序,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 \
通过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