virtio技术(1)简介

概述

virtio是当前主流的IO设备半虚拟化解决方案,其主要目标是在虚拟机和各种Hypervisor虚拟设备之间提供一个统一的通信框架和编程接口,减少跨平台所带来的兼容性问题,提升驱动程序开发效率。virtio是一种前后端架构,包括前端驱动和后端设备以及virtio定义的传输协议。通过传输协议,virtio可以应用到不同的虚拟化方案中,如QEMU/KVM、Iguest等,而且也允许实现不同的前后端。
virtio技术(1)简介_第1张图片

virtio协议架构

从总体上来看,virtio协议架构可分为三层:前端驱动、后端设备以及中间的传输层:
virtio技术(1)简介_第2张图片

前端驱动

前端驱动是虚拟机内部的virtio模拟设备对应的驱动程序,其主要作用是发现virtio设备、接受来自虚拟机内部的请求,并依据virtio协议与virtio设备进行通信。对于Linux系统,内核已经实现了一系列的virtio前端驱动程序,包括virtio-ballon、virtio-net、virtio-blk和virtio-scsi等;另外,DPDK也实现了用户态版本的virtio设备驱动程序virtio-pmd(主要针对virito网络设备实现),用于进一步提升virito数据通信的性能。

后端设备

后端设备承担的主体功能分为两部分:1、virtio后端设备的模拟;2、依据virtio协议处理来自虚拟机端发送的请求。在QEMU的实现中,virtio设备是QEMU为虚拟机模拟的PCI设备,遵循PCI-SIG定义的PCI规范,具有配置空间、中断配置等功能;对于virtio设备的请求处理,最早的实现是放在QEMU内部,但随着技术演进,又逐渐出现了vhost、vhost-user以及vDPA等后端加速方案实现。

传输层

传输层位于前端驱动和后端设备之间,用于支持虚拟机与Hypervisor虚拟设备之间的数据通信。virtio传输层使用虚拟队列的方式来传输数据,虚拟队列是由虚拟机virtio前端驱动创建的用于数据传输的共享内存,后端处理程序通过这块共享内存获取前端设备递交的IO请求。

virtio前后端通信机制

virtio使用前后端通信模型,在虚拟机中运行virtio设备的驱动程序,通过virtio虚拟队列和后端的Hypervisor虚拟设备进行数据交互。virtio虚拟队列通过vring进行实现,vring是虚拟机和后端设备之间共享的一段环形缓冲区,如下图:
virtio技术(1)简介_第3张图片
vring 包含三个部分:描述符表(Descriptor Table)、可用描述符表(Available Ring)和已用描述符表(Used Ring):

  • 描述符表:描述符表用于存储一些关联的描述符,每个描述符记录一个对 buffer 的描述;
  • 可用描述符表:用于保存前端驱动提供给后端设备且后端设备可以使用的描述符;
  • 已用描述符表:用于保存后端处理程序已经处理过并且尚未反馈给前端驱动的描述。

当虚拟机需要发送请求到后端设备的时候就准备好数据,将数据描述放到Available Ring中,写配置通知后端设备;然后,后端设备就能够通过Availabel Ring中读取请求信息,进而从共享内存中读出数据。后端设备完成请求之后,将响应状态存放在Used Ring中,前端驱动也就可以从Used Ring中得到请求完成信息,并获取请求的数据。

virtio技术演进

随着技术的进步,virtio协议也在不断地朝着更高性能的方向在演进,下图展示了virtio协议实现的各种加速方案:
virtio技术(1)简介_第4张图片

  • 基于QEMU的传统实现:早期的virtio后端程序是基于QEMU模拟实现,这种方式下virtio数据传输,QEMU需要多次与内核通信以完成数据交互,系统调用开销大,效率低。为了提升数据传输的频率,提出了将后端处理程序的数据传输部分放在QEMU外进行实现,这种技术称为vhost。vhost的实现分为两类:vhost kernel和vhost user;
  • vhost-kernel:vhost-kernel实现将virtio后端的数据处理逻辑放到Linux内核中实现,QEMU仍然负责对该PCI设备的模拟。当前内核已有的vhost实现包括vhost-net、vhost-scsi、vhost-blk等;
  • vhost-user:vhost-user则直接将virtio后端的数据处理逻辑放到了用户态中进行实现,完全bypass内核。vhost-user协议典型的实现包括spdk中vhost-user-blk和vhost-user-scsi,以及DPDK库中vhost-user-net实现;
  • vDPA:virtio设备虚拟化的功能一直都是由软件来实现,在Host上因虚拟化而产生的额外开销无法避免。为了提升云端服务的性能,可以将virtio功能offload,将与业务无关的任务绕开系统、CPU直接交给专用硬件执行。vDPA(vhost Data Path Accelaeration)是virito协议的半硬件虚拟化实现。vDPA将virtio数据平面卸载到硬件中进行处理,控制平面仍然采用原来的控制平面协议,当控制信息被传递到硬件中,硬件完成数据平面的配置之后,数据通信过程由硬件设备完成,虚拟机与硬件设备之间直通。

相关参考

  • 《深入浅出系统虚拟化:原理与实践》
  • 《深度探索Linux系统虚拟化:原理与实现》
  • 《Linux开源存储全栈详解——从Ceph到容器存储》

你可能感兴趣的:(虚拟化技术手札,虚拟化)