作者简介闫亮 Intel高级软件工程师专注于开源存储SPDK的测试和优化

简介

CONTENTS

SPDK  virtio模块介绍

SPDK  virtio 用户模式使用示例

SPDK  virtio PCI模式使用示例

总结

第一章

SPDK virtio模块介绍

众所周知,Virtio协议定义了两个块设备驱动,virtio-blk和virtio-scsi。SPDK Vhost target提供了VM中virtio-blk/scsi半虚拟化IO请求的加速器,相比较原来的QEMU virtio-blk方案以及kernel vhost-scsi方案极大的提高了性能,VM内置的内核半虚拟化驱动即可使用。

现在SPDK在使用相同的vhost target基础上,更进一步的提供了一个用户态的virtio bdev模块,有两个传输层:

* PCI:在VM中使用,该模块提供了在VM中使用用户态驱动访问后端块设备的能力,用户需要卸载掉原内核的virtio-blk/scsi驱动,绑定virtio控制器到uio模块

* Vhost-user模式:提供进程间使用virtio-blk/scsi协议访问vhost target的块设备驱动,可以直接集成到用户的独立进程中使用,例如container。

目前SPDK virtio驱动模块只实现了virtio 1.0 版本。

下图是SPDK virtio整体介绍:

第二章 

SPDK virtio 用户模式使用示例

SPDK virtio用户模式的使用场景可以参考下图:

如上图所示,SPDK vhost socket和使用virtio块设备的SPDK进程在同一台机器。

参考步骤如下:

在host机器中,使用如下命令配置和编译SPDK:

[root@]./configure --with-vhost --with-virtio && make启动vhost主进程:

[root@] ./app/vhost/vhost -i 0

创建vhost controller,以下是vhost blk示例:

[root@]./scripts/rpc.py bdev_malloc_create 128 512

[root@]./scripts/rpc.py vhost_create_blk_controller vhostblk0 Malloc0

启动spdk bdevperf进程:

[root@] ./test/bdev/bdevperf/bdevperf-q 128 -o 4096 -w randread -t 300 -z -r /var/tmp/newspdk.sock -m 0x2 -g

Vhost-user需要连续的内存,如果使用2MiB的hugepage时,注意要加-g参数,只创建一个hugetlbfs文件。因为是第二个进程,所以要加-r参数,创建新的rpc 监听地址。同时要采用和vhost进程不同的core。

接着是创建virtio bdev:

[root@]./scripts/rpc.py  -s  /var/tmp/newspdk.sock   bdev_virtio_attach_controller -t user -a /home/storage/spdk/vhostblk0 -d blk virtioblk0

这样,就创建了user模式的virtio块设备。

我们还可以运行bdevperf,测试一下virtio块设备的性能:

[root@]PYTHONPATH=$PYTHONPATH:./scripts/  test/bdev/bdevperf/bdevperf.py -s/var/tmp/newspdk.sock  -t 1000perform_tests

经过五分钟,bdevperf工具就会打印测试结果:

Logical core: 1

virtioblk0          : 1500453.10 IO/s    5861.14 MB/s

=====================================================

Total               : 1500453.10 IO/s    5861.14 MB/s

第三章

SPDK virtio PCI模式使用示例

PCI模式使用于虚拟机中。这种模式会避免QENU和虚拟机内核的中断和上下文切换开销,能够显著提高IO性能。经过验证, 标准的SPDK vhost 和kernel vhost scsi都可以通过SPDK virtio PCI模式加速。官方qemu仓库主分支代码实现的virtio-blk PCI设备也可以使用SPDK virtio PCI模块。

使用场景参考下图:

示例步骤如下:

在host机器中,使用如下命令配置和编译SPDK:

[root@]./configure --with-vhost && make

启动vhost主进程:

[root@] ./app/vhost/vhost

创建vhost controller,以下是vhost blk示例:

[root@]./scripts/rpc.py bdev_malloc_create 128 512

[root@]./scripts/rpc.py vhost_create_blk_controller vhostblk0 Malloc0

运行如下命令启动QEMU:

[root@]/home/storage/qemu/build/x86_64-softmmu/qemu-system-x86_64 -cpu host -smp 8 -m 10240 -object memory-backend-file,id=mem,size=10G,mem-path=/dev/hugepages,share=on -numa node,memdev=mem -drive file=/home/storage/fedora.qcow2,if=none,id=disk -device ide-hd,drive=disk,bootindex=0 -net user,hostfwd=tcp::10021-:22 -net nic -chardev socket,id=char0,path=/home/storage/spdk/vhostblk0 -device vhost-user-blk-pci,chardev=char0,id=blk0 -vnc 0.0.0.0:3 --enable-kvm

运行ssh命令登录到虚拟机中:

[root@]ssh -p 10021 root@localhost

在虚拟机中克隆并配置spdk代码:

[root@]git clone https://github.com/spdk/spdk

[root@]cd spdk && git submodule update --init

[root@]./configure --with-virtio && make

配置SPDK运行环境:

[root@]./scripts/setup.sh

运行spdk target:

[root@]./app/spdk_tgt/spdk_tgt &

创建virtio PCI模式块设备:

[root@]./scripts/rpc.py   bdev_virtio_attach_controller -t pci -a 00:04.0 -d blk virtioblk0

00:04.0是SPDK vhost设备在VM中的PCI bus number, 可以根据实际情况变更。这样virtio块设备就创建成功了。我们就可以在虚拟机中使用这个virtio 块设备了。

我们还可以运行SPDK测试工具bdevperf直接测试virtio 块设备。步骤如下。

如果使用配置文件的方式的话, 首先要创建bdev.conf文件,内容如下:

[VirtioPci]

Enable Yes

运行bdevperf命令, 参考命令如下:

[root@] ./test/bdev/bdevperf/bdevperf -c bdev.conf -q 128 -o 4096 -w randread -t 300

命令结果如下:

Logical core: 0

VirtioBlk0          : 1438365.17 IO/s    5618.61 MB/s

=====================================================

Total               : 1438365.17 IO/s    5618.61 MB/s

作为对比,我们可以运行bdevperf测试内核驱动virtio设备。创建bdev.conf:

[AIO]

AIO /dev/vda AIO0

运行bdevperf命令,参考命令如下:

[root@]./test/bdev/bdevperf/bdevperf -c bdev.conf -q 128 -o 4096 -w randread -t 300

命令结果如下:

Logical core: 0

AIO0                :  254381.20 IO/s     993.68 MB/s

=====================================================

Total               :  254381.20 IO/s     993.68 MB/s

第四章 

总结

下面的表格是三种运行方式的结果对比:

Bdevperf运行方式

SPDK virtio 用户模式

SPDK virtio PCI模式

VM 内核AIO性能

随机读带宽

1500453.10 IO/s

1438365.17 IO/s

254381.20 IO/s

上面章节运行bdevperf采用的SPDKcommit是1b6d1c80f96dab381db066c9c5f7852ea327eb75。

初步性能实验数据,仅供参考,更多官方数据,参考https://spdk.io/doc/相关性能测试报告。大家如果想深入了解SPDK virtio驱动,可以联系SPDK 社区。

    转载须知   

DPDK与SPDK开源社区公众号文章转载声明

推荐阅读

SPDK线程模型解析试试SPDK的trace

在虚拟机上部署SPDK NVME测试案例

l298n电机驱动模块使用方法_SPDK virtio 驱动模块介绍及使用相关推荐

  1. 用寻迹模块L298n电机驱动模块制作Arduino寻迹小车四路(含清单,代码,接线,注意事项)

    本帖是在参考了很多博客之后进行的一次实战加总结,参考连接如下: Arduino智能小车寻迹篇 不适用PWM调速彻底解决L298n电机驱动转速不同的问题 1.工作原理 总体思想:小车通过四路寻迹模块得到 ...

  2. 【Arduino蓝牙小车】L298N电机驱动模块详解

    原文链接:[Arduino] 从零制作蓝牙小车 - 饮猫的学习日志 1. L298N模块的使用 这是一个L298N电机驱动模块的图片.你可能会觉得接口有一点点多.但其实搞清楚它的控制原理后就能很快完成 ...

  3. 怎么计算机械设备电机,电机功率计算公式是什么?电机正确选配方法

    如今生活中人们总是会使用到各种各样的机械设备,这些机械设备的应用也在不断的满足着人们不同环境下的使用需求,当然在这些机械设备应用过程中也存在很多的问题需要大家去解决,了解选型方法以及其中的计算方法也是 ...

  4. 镜头上的四线电机怎么驱动_用于驱动镜头的电机的制作方法

    用于驱动镜头的电机的制作方法 [专利说明]用于驱动镜头的电机 [0001]本发明是2011年8月17日进入中国国家阶段的.申请号为201080008128.2.发明名称为"用于驱动镜头的电机 ...

  5. matlab 测速电机,一种精准的电机测速方法与流程

    本发明涉及电机测速领域,特别地,涉及一种精准的电机测速方法. 背景技术: 通常对电机进行转速测量,需要在电机内部安装某些传感器,但会降低电机运行可靠性,甚至某些电机无法在内部加装传感器.目前国内外常用 ...

  6. 利用Arduino Mega的Analog端口无法驱动L298N电机芯片的解释

    利用Arduino的Analog端口无法驱动L298N电机芯片的解释 问题描述 第一章 L298芯片 1.1 L298N芯片概述 1.2 L298N电气属性 第二章 L298工作原理 第三章 L298 ...

  7. HTML5 Audio标签方法和函数API介绍

     问说网 > 文章教程 > 网页制作 > HTML5 Audio标签方法和函数API介绍 Audio APIHTML5HTML5 Audio预加载 HTML5 Audio标签方法和函 ...

  8. php curl_setopt抓取内容,PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)

    通过curl_setopt()函数可以方便快捷的抓取网页(采集很方便),curl_setopt 是php的一个扩展库 使用条件:需要在php.ini 中配置开启.(PHP 4 >= 4.0.2) ...

  9. (已更新)Ubuntu 14.04 Linux 3D桌面完全教程,显卡驱动安装方法,compiz特效介绍,常见问题解答

      内容   文章标题 : (已更新)Ubuntu 14.04 Linux 3D桌面完全教程,显卡驱动安装方法,compiz特效介绍,常见问题解答 发表于 : 2008-08-03 0:57    [ ...

最新文章

  1. opencv中的Rodrigues()函数
  2. 互联网公司败局汇总,这些公司都是怎么死的?(上篇)
  3. mysql建立 分区_MySQL-mysql分区合理建立
  4. centos8 kernel source 安装_什么?你在物理机上安装Oracle总失败?那就试试Docker吧
  5. 怎么查redis 中的 cache_20、springcloud如何使用spring-cache
  6. 惠普服务器装Linux7系统,如何安装惠普服务器操作系统
  7. 阿里云服务器ECS数据盘的自动挂载解决方案
  8. 190311每日一句
  9. python中能用π吗_python里π
  10. 让WindowsXP SP3支持64G内存
  11. javaSE基础大全--知识点总结
  12. python弹球游戏添加一个球_Python实现的弹球小游戏示例
  13. uniapp 跳转外部链接
  14. Phaser3之 load
  15. NSDate计算时间差
  16. 互联网+废品回收小程序,废品回收小程序,废品回收小程序平台,蚂蚁废收小程序
  17. js 按拼音 首字母 排序 并分组
  18. LVTTL与LVCMOS区别
  19. CSJH网络安全团队简介
  20. 第四天,同系的大佬都已经开始研究算法了,我还在系统徘徊,是我小吴认怂了,我这进度属实有点慢啊!!

热门文章

  1. 关于python语言和人工智能下哪个说法不正确_“在资源管理器”窗口中,文件夹图标左侧有“...
  2. 通信基站c语言,[转]2015年数学建模C题–基于无线通信基站的室内三维定位问题...
  3. android 通知历史,Android P新特性:追踪应用通知历史
  4. logstash-filter模块
  5. Oracle数据库游标数总结
  6. WebP 在减少图片体积和流量上的效果如何?MIP技术实践分享
  7. 搭建gitlab及部署gitlab-runner
  8. 2018百度之星程序设计大赛 - 资格赛 1002 子串查询
  9. 序(不知道是什么时候的模拟题)
  10. CentOS7入门_安装并配置mysql5.7.18