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

SPDK Vhost在线恢复:让I/O飞一会儿

背景

在All in Cloud的趋势下,各大CSPs(Cloud Service Providers)在宣传自家的服务时都会向客户声称提供高可靠,高稳定的服务例如5个9的可用性(99.999%)。但是,仅仅以后端存储举例,技术和产品的升级等等都不可避免的需要他们进行在线升级,并且这个行为要在短时间内完成,这样才能满足5个9的标准。

Virtio是目前被广泛接受的I/O虚拟化的抽象设备接口,通过对virtqueue的定义实现了对不同虚拟化PCI设备的支持,广泛的运用在VM(Virtual Machine)中用来加速包括存储和网络等设备。Vhost是一种用来加速Guest到后端传输的软件解决方案,它基于virtio实现。然而查看已有的解决办法,并没有发现一种很好的支持在线升级的方法。

基于此,本篇文章将介绍SPDK Vhost提供的一种方法,可以灵活,快速的实现在线升级。

Virto和Vhost的简单介绍

Virtio由OASIS(Advancing Open Standard For Information Society)定义,它是半虚拟化协议规范,规定Guest OS和Hypervisor通过定义的队列结构进行数据面通信,本文中的Hypervisor我们都使用QEMU来进行说明,这个队列在Virtio Spec中被定义为Virtqueue,它由三个部分组成如图1所示。

图1 Virtqueue Layout

Virtio offload到host叫做Vhost,它可以在内核态或者用户态实现,在用户态中的实现称作vhost-user,它的解决方案如图2所示。简单的说它就是把Virtqueue offload到Vhost target,这样就实现了Guest OS和Vhost target的直接交互,进一步加速了数据的传递。

图2 SPDK Vhost

SPDK Vhost Live Recovery

以前的解决办法

主要是通过热迁移的方式,工作方式如图3所示。它的工作流程是当Server1中的Vhost target需要升级时,就把Server1中的VMs服务迁移到Server2中,等到Server1 Vhost target升级完成,再把VMs重新迁移回来。

图3 Live Migration

但是这种方法有着很明显的局限性和缺陷,例如:

1. 需要Server1和Server2 共享存储,否则热迁移是无意义的,后端的存储都改变了。很明显对于本地机器这种方式是不行的,而现在大热的bare metal也是不行的。

2. 比较耗时,它需要服务从Server1移动到Server2,然后等到Server1升级结束后再从Server2迁移回来。当VMs数量较多时耗时也会增加。

所以,我们需要一种更高效,更灵活的热升级办法。

SPDK Vhost的实现

Vhost-user protocol中提供了一种很好的方法叫做inflight I/O tracking。利用这个特性,vhost target会记录每一笔I/O request, 这样当vhost target升级重启后,可以继续处理升级前没有完成的I/O requests,保证不会有丢失。为了方便理解Vhost-user protocol,在这里稍微扩展一下vhost-user的实现。Vhost target 和 QEMU启动后通过 Unix domain socket进行通信,会协商包括virtio device features,vhost-user protocol features等特性,然后是memory table,virtqueue base address等等流程,如图4所示。Vhost target依据协商的结果提供相应的服务。

图4 inflight I/O tracking

SPDK Live recovery的工作流程如下图5所示:

图5 Recovery Workflow

这种方式和热迁移的方法相比有明显的优势,例如:

  • 更快,更好的升级。少了热迁移来回拷贝的时间。
  • 更少的限制,针对单机也可以很好的支持,也不需要共享的存储。
  • 对性能没有影响。Inflight buffer只需要存request descriptor的index就行。

测试

目前相关patch都已经在spdk 20.01中发布了。这项功能还需要QEMU的配合,而QEMU部分的patch也已经合入了。测试这项功能也非常简单,如下,先启动SPDK Vhost然后启动QEMU,注意的是一定要配置reconnect参数,然后在QEMU中跑fio测试,测试过程中可以杀死spdk vhost进程然后重启,可以看到QEMU中的测试在spdk vhost进程重启后继续正常运行。

SPDK Vhost ROOT_DIR=spdk source code:
./app/vhost/vhost
./scripts/rpc.py bdev_nvme_attach_controller -b Nvme0 -tpcie -a 0000:60:00.0
./scripts/rpc.py vhost_create_blk_controllervhost.1 Nvme0n1
QEMU:
qemu-system-x86_64 \
--enable-kvm \
-cpu host -smp 2 \
-m 4G \
-object memory-backend-file,id=mem,size=4G,mem-path=/dev/hugepages,share=on\
-numa node,memdev=mem \
-objectmemory-backend-file,id=mem1,size=2M,mem-path=/dev/hugepages,share=on \
 -drivefile=ubuntu-19.04.qcow2,if=none,id=disk \
 -deviceide-hd,drive=disk,bootindex=0 \
 -chardev socket,id=spdk_vhost_blk0,path=/xxxx/vhost.1,reconnect=1\

原文链接:http://t.csdn.cn/2tzZs

更多DPDK学习资料有需要的可以自行添加进入学习交流君 羊 793599096 免费获取,或自行报名学习,免费订阅,永久学习,关注我持续更新哦!!!

学习地址:http://ke.qq.com/course/5066203?flowToken=1043717

相关文章:

  • 如何判断一个低代码平台是否专业?
  • 达利欧《原则》读书思考笔记
  • C语言动态内存管理、柔性数组(超详细版)
  • 【USB设备设计】-- CDC 设备开发(虚拟串口设备)
  • 用ARM进行汇编语言编程(3)逻辑移位和轮换,条件与分支
  • maltab datenum函数与正则表达式巧用:逐日数据转为逐月数据、日序转月序
  • PTA JAVA02 基础语法1
  • C++ 语言学习 day06 string , 异常
  • Linux命令`ll`的结果解析
  • 查题校园公众号查题系统
  • git分布式版本控制系统
  • C++ Color the ball
  • mysql的基础操作语句
  • Cookie/Session
  • java抽象类和接口(Comparator和Conparable的使用)
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 2017前端实习生面试总结
  • iOS小技巧之UIImagePickerController实现头像选择
  • JavaScript 基础知识 - 入门篇(一)
  • SQLServer之索引简介
  • ViewService——一种保证客户端与服务端同步的方法
  • windows下使用nginx调试简介
  • 闭包--闭包作用之保存(一)
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 后端_ThinkPHP5
  • 聊聊hikari连接池的leakDetectionThreshold
  • 浏览器缓存机制分析
  • 前端路由实现-history
  • 巧用 TypeScript (一)
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 微信小程序填坑清单
  • 异常机制详解
  • linux 淘宝开源监控工具tsar
  • puppet连载22:define用法
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (2020)Java后端开发----(面试题和笔试题)
  • (Oracle)SQL优化技巧(一):分页查询
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (三)uboot源码分析
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)甲方乙方——赵民谈找工作
  • (转载)虚函数剖析
  • .Net 垃圾回收机制原理(二)
  • .Net 知识杂记
  • .NET中的十进制浮点类型,徐汇区网站设计
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [<事务专题>]
  • [17]JAVAEE-HTTP协议