一、 virtio概述

KVM是必须使用硬件虚拟化辅助技术(如Intel VT-x、AMD-V)的hypervisor,在CPU运行效率方面有硬件支持,其效率是比较高的;在有Intel EPT特性支持的平台上,内存虚拟化的效率也较高。QEMU/KVM提供了全虚拟化环境,可以让客户机不经过任何修改就能运行在KVM环境中。不过,KVM在I/O虚拟化方面,传统的方式是使用QEMU纯软件的方式来模拟I/O设备(如第4章中提到模拟的网卡、磁盘、显卡等等),其效率并不非常高。在KVM中,可以在客户机中使用半虚拟化驱动(Paravirtualized Drivers,PV Drivers)来提高客户机的性能(特别是I/O性能)。目前,KVM中实现半虚拟化驱动的方式是采用了virtio这个Linux上的设备驱动标准框架。

1、QEMU模拟I/O设备的基本原理和优缺点

QEMU纯软件方式模拟现实世界中的I/O设备的基本过程模型如图所示。

使用QEMU模拟I/O的情况下,当客户机中的设备驱动程序(device driver)发起I/O操作请求之时,KVM模块中的I/O操作捕获代码会拦截这次I/O请求,然后经过处理后将本次I/O请求的信息存放到I/O共享页,并通知用户控件的QEMU程序。QEMU模拟程序获得I/O操作的具体信息之后,交由硬件模拟代码来模拟出本次的I/O操作,完成之后,将结果放回到I/O共享页,并通知KVM模块中的I/O操作捕获代码。最后,由KVM模块中的捕获代码读取I/O共享页中的操作结果,并把结果返回到客户机中。当然,这个操作过程中客户机作为一个QEMU进程在等待I/O时也可能被阻塞。另外,当客户机通过DMA(Direct Memory Access)访问大块I/O之时,QEMU模拟程序将不会把操作结果放到I/O共享页中,而是通过内存映射的方式将结果直接写到客户机的内存中去,然后通过KVM模块告诉客户机DMA操作已经完成。

QEMU模拟I/O设备的方式,其优点是可以通过软件模拟出各种各样的硬件设备,包括一些不常用的或者很老很经典的设备(如RTL8139的网卡),而且它不用修改客户机操作系统,就可以实现模拟设备在客户机中正常工作。在KVM客户机中使用这种方式,对于解决手上没有足够设备的软件开发及调试有非常大的好处。而它的缺点是,每次I/O操作的路径比较长,有较多的VMEntry、VMExit发生,需要多次上下文切换(context switch),也需要多次数据复制,所以它的性能较差。

2、Virtio的基本原理和优缺点

Virtio最初由澳大利亚的一个天才级程序员Rusty Russell编写,是一个在hypervisor之上的抽象API接口,让客户机知道自己运行在虚拟化环境中,从而与hypervisor根据 virtio 标准协作,从而在客户机中达到更好的性能(特别是I/O性能)。目前,有不少虚拟机都采用了virtio半虚拟化驱动来提高性能,如KVM和Lguest。

QEMU/KVM中,Virtio的基本结构框架如图所示

其中前端驱动(frondend,如virtio-blk、virtio-net等)是在客户机中存在的驱动程序模块,而后端处理程序(backend)是在QEMU中实现的。在这前后端驱动之间,还定义了两层来支持客户机与QEMU之间的通信。其中,“virtio”这一层是虚拟队列接口,它在概念上将前端驱动程序附加到后端处理程序。一个前端驱动程序可以使用0个或多个队列,具体数量取决于需求。例如,virtio-net网络驱动程序使用两个虚拟队列(一个用于接收,另一个用于发送),而virtio-blk块驱动程序仅使用一个虚拟队列。虚拟队列实际上被实现为跨越客户机操作系统和hypervisor的衔接点,但它可以通过任意方式实现,前提是客户机操作系统和virtio后端程序都遵循一定的标准,以相互匹配的方式实现它。而virtio-ring实现了环形缓冲区(ring buffer),用于保存前端驱动和后端处理程序执行的信息,并且它可以一次性保存前端驱动的多次I/O请求,并且交由后端去动去批量处理,最后实际调用宿主机中设备驱动实现物理上的I/O操作,这样做就可以根据约定实现批量处理而不是客户机中每次I/O请求都需要处理一次,从而提高客户机与hypervisor信息交换的效率。

virtio半虚拟化驱动的方式,可以获得很好的I/O性能,其性能几乎可以达到和native(即:非虚拟化环境中的原生系统)差不多的I/O性能。所以,在使用KVM之时,如果宿主机内核和客户机都支持virtio的情况下,一般推荐使用virtio达到更好的性能。当然,virtio的也是有缺点的,它必须要客户机安装特定的Virtio驱动使其知道是运行在虚拟化环境中,且按照Virtio的规定格式进行数据传输,不过客户机中可能有一些老的Linux系统不支持virtio和主流的Windows系统需要安装特定的驱动才支持Virtio。不过,较新的一些Linux发行版(如RHEL 6.3、Fedora 17等)默认都将virtio相关驱动编译为模块,可直接作为客户机使用virtio,而且对于主流Windows系统都有对应的virtio驱动程序可供下载使用。

原文链接:http://smilejay.com/2012/11/virtio-overview/

KVM半虚拟化驱动--virtio概述和基本原理(四)相关推荐

  1. KVM学习(四)windows server半虚拟化驱动virtio

    virtio virtio可以大大提高上层guest os的cpu,网卡等速度,相当于半虚拟化后guest os知道了自己是个虚拟机,就不会访问资源时被Hypervisor拦截再转送,直接统一接口,r ...

  2. 虚拟化kvm - 创建虚拟机、virtio、QEMU Guest Agent

    文章目录 写在开头的话 创建虚拟机.virtio.QEMU Guest Agent 00. 使用virt-manager创建虚拟机 0.1 实验的环境准备 01. 使用virt-install创建虚拟 ...

  3. 不同虚拟化技术 virtio 之间的区别

    目录 概述 I/O设备半虚拟化驱动(virtio) Guest of WindowsGuest of LinuxVirtio in Openstackvirtio_blk和virtio-scsivir ...

  4. 《深入浅出DPDK》读书笔记(十二):DPDK虚拟化技术篇(半虚拟化Virtio)

    Table of Contents 半虚拟化Virtio 132.Virtio使用场景 133.Virtio规范和原理 11.2.1 设备的配置 1. 设备的初始化 2. 设备的发现 3. 传统模式v ...

  5. KVM介绍 虚拟化简史

    KVM介绍 为什么需要CPU虚拟化 X86 操作系统是设计在直接运行在裸硬件设备上的,因此它们自动认为它们完全占有计算机 硬件.x86 架构提供四个特权级别给操作系统和应用程序来访问硬件. Ring  ...

  6. KVM 介绍 虚拟化简史

    KVM介绍 为什么需要CPU虚拟化 X86 操作系统是设计在直接运行在裸硬件设备上的,因此它们自动认为它们完全占有计算机 硬件.x86 架构提供四个特权级别给操作系统和应用程序来访问硬件. Ring ...

  7. Linux虚拟化:Virtio: 一个 I/O 虚拟化框架

    <Virtio: An I/O virtualization framework for Linux> 目录 什么是 virtio# 为什么是 virtio# virtio 的架构# vi ...

  8. 全虚拟化和半虚拟化的区别 cpu的ring0~ring3又是什么概念?

    ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之-- 拿Linux+x86来说, 操作系统(内核)的代码运行在最高运行级别ring0上,可以使用特权指令,控制中断 ...

  9. 基于KVM的虚拟化研究及应用

    引言 虚拟化技术是IBM在20世纪70年代首先应用在IBM/370大型机上,这项技术极大地提高了大型机资源利用率.随着软硬件技术的迅速发展,这项属于大型机及专利的技术开始在普通X86计算机上应用并成为 ...

最新文章

  1. 大一c语言大作业课题大全,昆明理工大学大一C语言大作业题目.doc
  2. 人的寿命可能与智商成正比
  3. ElasticSearch---------------------Elasticsearch Clients---------------------JAVA API
  4. ubuntu下软件删除
  5. 网易云信助春招上“云” ,疫情过后线上招聘或成常态
  6. apr java_基于 APR 的原生库
  7. 前后端分离 常用工具汇总
  8. 用lnmp.org中的lnmp下安装ftp(pureftp)
  9. 从Discuz迁移帐号密码到NodeBB
  10. python大作业五子棋人人对战_五子棋总结(人人对战)
  11. 捷联式惯导系统初始对准
  12. 中国数字化城市行业现状调研及前景规划分析报告2022~2028年
  13. 第一章: 利用神经网络识别手写数字
  14. 宗地自动编号及属性赋值
  15. 认识中药(4)--陈皮
  16. python随笔01(robotframework自动化)
  17. ubuntu运行Openvino出现 ModuleNotFoundError: No module named ‘openvino.model_zoo.model_api‘解决
  18. C# Excel文件操作
  19. python奇数阶乘求和_Python阶乘求和的方法
  20. 【MATLAB-app】系列教程(含视频)第2课_实例:使用appdesigner 制作简单的计算器

热门文章

  1. python语言自学-零基础小白学习Python编程语言的正确姿势(纯干货)
  2. python中的time库安装步骤-Python time库基本操作方法
  3. python语言程序设计书-清华大学出版社-图书详情-《Python语言程序设计》
  4. pythonurllib模块-Python3学习笔记(urllib模块的使用)
  5. python 类-python--类
  6. python哪里下载import包-python import 自己的包
  7. php执行删除语句代码,ThinkPHP之数据删除和执行原生SQL语句
  8. spring中的AnnotationConfigUtils
  9. .net core 中文乱码问题
  10. thinkphp联查