当前位置: 首页 > news >正文

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

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

图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

相关文章:

  • mysql 创建函数
  • 支持十亿级密态数据、低代码,蚂蚁集团发布隐语开放平台
  • 关于kafka常见名词解释,你了解多少?
  • 吴恩达深度学习笔记(四)——深度学习的实践层面
  • KNN-KG论文学习笔记
  • DOM与BOM与Echarts
  • 13c++呵呵老师【pawn移动组件与碰撞】
  • 简明介绍 n-gram
  • 前端培训丁鹿学堂:es7_es11常用新特性(三)
  • 深入浅出总结求解菲波那切数列的五种方法
  • TCP滑动窗口机制(重要)
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [基础服务] CentOS 7.x 安装NodeJS环境并搭建Hexo
  • 设计一个支持多版本的APP的后端服务
  • 在Ubuntu/Linux中自动备份MySQL数据库
  • [PHP内核探索]PHP中的哈希表
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 30天自制操作系统-2
  • Angular Elements 及其运作原理
  • CentOS6 编译安装 redis-3.2.3
  • css系列之关于字体的事
  • java8-模拟hadoop
  • Java反射-动态类加载和重新加载
  • Otto开发初探——微服务依赖管理新利器
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • React-生命周期杂记
  • Travix是如何部署应用程序到Kubernetes上的
  • WebSocket使用
  • 测试如何在敏捷团队中工作?
  • 多线程事务回滚
  • 面试遇到的一些题
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (ZT)薛涌:谈贫说富
  • (定时器/计数器)中断系统(详解与使用)
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (原)Matlab的svmtrain和svmclassify
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .apk文件,IIS不支持下载解决
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • @RequestParam详解
  • @Responsebody与@RequestBody
  • [ChromeApp]指南!让你的谷歌浏览器好用十倍!
  • [Django 0-1] Core.Handlers 模块
  • [Docker]四.Docker部署nodejs项目,部署Mysql,部署Redis,部署Mongodb