文章目录
- SPDK vhost工作机制
- SPDK vhost实现
- SPDK vhost设备管理结构
- 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
- vhost-scsi配置
- vhost-blk配置
- 相关参考
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
相关参考
- Storage Performance Development Kit