• 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设备的名字。

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

    图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的数量,建议配置成相同的值

    1. qemu-system-x86_64 \
    2. -cpu host -smp 16 \
    3. -chardev socket,id=spdk_vhost_blk0,path=/var/tmp/vhost.1 \
    4. -device vhost-user-blk-pci,chardev=spdk_vhost_blk0,num-queues=16 \
    • 虚拟VM端

    通过ssh命令登录虚拟机

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

    1. [root@fedora ~]# lsblk
    2. NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
    3. sda 8:0 0 11G 0 disk
    4. ├─sda1 8:1 0 1G 0 part /boot
    5. └─sda2 8:2 0 10G 0 part
    6. └─fedora_fedora-root 253:0 0 10G 0 lvm /
    7. zram0 251:0 0 8G 0 disk [SWAP]
    8. vda 252:0 0 100G 0 disk

    运行fio命令测试IOPS

    1. #fio fio.job
    2. # cat fio.job
    3. [global]
    4. thread=1
    5. direct=1
    6. invalidate=1
    7. ioengine=libaio
    8. norandommap=1
    9. group_reporting=1
    10. bs=4k
    11. rw=randread
    12. iodepth=128
    13. time_based=1
    14. ramp_time=30
    15. runtime=240
    16. numjobs=1
    17. [job0]
    18. 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的性能。

    图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。

    1. ./scripts/rpc.py nvmf_create_transport -t rdma -u 8192
    2. ./scripts/rpc.py bdev_null_create Null1 102400 512
    3. ./scripts/rpc.py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a -s SPDK00000000000001
    4. ./scripts/rpc.py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 Null1
    5. ./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。

    1. ./build/bin/vhost -S /var/tmp -s 1024 -m 0x1
    2. ./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
    3. ./scripts/rpc.py vhost_create_blk_controller --cpumask 0x1 vhost.1 Nvme0n1

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

    1. qemu-system-x86_64 \
    2. -cpu host -smp 16 \
    3. -chardev socket,id=spdk_vhost_blk0,path=/var/tmp/vhost.1 \
    4. -device vhost-user-blk-pci,chardev=spdk_vhost_blk0,num-queues=16 \
    • 虚拟机VM端

    通过ssh命令登录虚拟机

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

    1. [root@fedora ~]# lsblk
    2. NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
    3. sda 8:0 0 11G 0 disk
    4. ├─sda1 8:1 0 1G 0 part /boot
    5. └─sda2 8:2 0 10G 0 part
    6. └─fedora_fedora-root 253:0 0 10G 0 lvm /
    7. zram0 251:0 0 8G 0 disk [SWAP]
    8. vda 252:0 0 100G 0 disk

    运行fio命令测试IOPS

    1. #fio fio.job
    2. # cat fio.job
    3. [global]
    4. thread=1
    5. direct=1
    6. invalidate=1
    7. ioengine=libaio
    8. norandommap=1
    9. group_reporting=1
    10. bs=4k
    11. rw=randread
    12. iodepth=128
    13. time_based=1
    14. ramp_time=30
    15. runtime=240
    16. numjobs=1
    17. [job0]
    18. 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

  • 相关阅读:
    【web前端期末大作业】基于html关爱空巢老人网页设计与实现
    深度学习理论(李宏毅
    流程引擎概述及组成
    【网工日常】Web网管及注意事项
    Java导出数据到Excel
    Linux内核优化的一些配置
    果断收藏|项目中有哪些风险是难以避免的?
    测试人员的KPI怎么设置
    Python正则表达式
    物联网主机:为智能交通赋能
  • 原文地址:https://blog.csdn.net/lingshengxiyou/article/details/126664712