SPDK vhost工作机制

在这里插入图片描述

SPDK vhost 作为虚拟机存储的后端,以进程的形式在宿主机上运行,通过轮询的方式从共享的 Ring Buffer 中得到虚拟机中的 IO 请求,并进行处理,最后将处理完的数据同样通过 Ring Buffer 的方式通知虚拟机。整个过程不需要锁的保护,没有中断引入的开销,效率极高。这里面主要涉及到下面几个部分:

  • 虚拟机中的存储前端驱动:根据具体使用的协议不同而不同,可能为 virtio blk,virtio scsi,或直接使用原生的 NVMe driver,主要负责接收 IO 请求,并将请求保存到 Ring Buffer 中,等待后端的处理。另一方面,前端驱动还需要处理后端的完成通知;
  • 共享的 Ring Buffer:虚拟机中的前端驱动与宿主中的存储后端共享的内存,用来在两者之间传输数据,命令和执行结果;
  • SPDK vhost 后端:虚拟机存储的后端实现,真正处理 IO 请求的核心逻辑,通过用户态的存储驱动实现高效的 IO 操作。

SPDK vhost实现

SPDK vhost的软件结构示意如下:
在这里插入图片描述

SPDK vhost设备管理结构

所有类型的SPDK vhost设备统一链入到g_vhost_devies链表中进行管理,包括vhost-blk和vhost-scsi设备,关联的数据结构如下:
在这里插入图片描述

这里:

  • spdk_vhost_dev保存了vhost设备的通用信息,对于类型相关的数据则由vhost-blk或vhost-scsi扩展进行实现;
  • 对于每个vhost设备,可以支持建立多个session,由spdk_vhost_session结构描述,通常对于每个访问vhost-dev的VM都会建立一个session;
  • spdk_vhost_dev_backend结构保存了会话管理的相关处理回调函数。

vhost_dev_register:注册vhost设备

在这里插入图片描述

new_connection:新建连接会话

在这里插入图片描述

start_device:启动设备会话

在这里插入图片描述

SPDK vhost-blk实现

rpc_vhost_create_blk_controller:创建vhost-blk设备

在这里插入图片描述

vhost_blk_start:新建会话

在这里插入图片描述

vdev_worker:vhost-blk轮询任务

在这里插入图片描述

blk_request_complte_cb:blk IO完成

在这里插入图片描述

QEMU配置使用SPDK vhost

启动SPDK vhost应用

首先,配置SPDK使用的大页内存:

HUGEMEM=4096 scripts/setup.sh

接下来,启动SPDK自带的vhost应用程序

build/bin/vhost -S /var/tmp -m 0x3

配置SPDK

创建SPDK bdev设备

scripts/rpc.py bdev_malloc_create 64 512 -b Malloc0
vhost-scsi配置

首先,创建vhost-scsi控制器

scripts/rpc.py vhost_create_scsi_controller --cpumask 0x1 vhost.0

添加SPDK bdev设备到创建的vhost-scsi控制器中

scripts/rpc.py vhost_scsi_controller_add_target vhost.0 0 Malloc0
vhost-blk配置
scripts/rpc.py vhost_create_blk_controller --cpumask 0x1 vhost.1 Malloc0

相关参考

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐