简介
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开源社区公众号文章转载声明
推荐阅读