KVM半虚拟化驱动--virtio概述和基本原理(四)
一、 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概述和基本原理(四)相关推荐
- KVM学习(四)windows server半虚拟化驱动virtio
virtio virtio可以大大提高上层guest os的cpu,网卡等速度,相当于半虚拟化后guest os知道了自己是个虚拟机,就不会访问资源时被Hypervisor拦截再转送,直接统一接口,r ...
- 虚拟化kvm - 创建虚拟机、virtio、QEMU Guest Agent
文章目录 写在开头的话 创建虚拟机.virtio.QEMU Guest Agent 00. 使用virt-manager创建虚拟机 0.1 实验的环境准备 01. 使用virt-install创建虚拟 ...
- 不同虚拟化技术 virtio 之间的区别
目录 概述 I/O设备半虚拟化驱动(virtio) Guest of WindowsGuest of LinuxVirtio in Openstackvirtio_blk和virtio-scsivir ...
- 《深入浅出DPDK》读书笔记(十二):DPDK虚拟化技术篇(半虚拟化Virtio)
Table of Contents 半虚拟化Virtio 132.Virtio使用场景 133.Virtio规范和原理 11.2.1 设备的配置 1. 设备的初始化 2. 设备的发现 3. 传统模式v ...
- KVM介绍 虚拟化简史
KVM介绍 为什么需要CPU虚拟化 X86 操作系统是设计在直接运行在裸硬件设备上的,因此它们自动认为它们完全占有计算机 硬件.x86 架构提供四个特权级别给操作系统和应用程序来访问硬件. Ring ...
- KVM 介绍 虚拟化简史
KVM介绍 为什么需要CPU虚拟化 X86 操作系统是设计在直接运行在裸硬件设备上的,因此它们自动认为它们完全占有计算机 硬件.x86 架构提供四个特权级别给操作系统和应用程序来访问硬件. Ring ...
- Linux虚拟化:Virtio: 一个 I/O 虚拟化框架
<Virtio: An I/O virtualization framework for Linux> 目录 什么是 virtio# 为什么是 virtio# virtio 的架构# vi ...
- 全虚拟化和半虚拟化的区别 cpu的ring0~ring3又是什么概念?
ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之-- 拿Linux+x86来说, 操作系统(内核)的代码运行在最高运行级别ring0上,可以使用特权指令,控制中断 ...
- 基于KVM的虚拟化研究及应用
引言 虚拟化技术是IBM在20世纪70年代首先应用在IBM/370大型机上,这项技术极大地提高了大型机资源利用率.随着软硬件技术的迅速发展,这项属于大型机及专利的技术开始在普通X86计算机上应用并成为 ...
最新文章
- 大一c语言大作业课题大全,昆明理工大学大一C语言大作业题目.doc
- 人的寿命可能与智商成正比
- ElasticSearch---------------------Elasticsearch Clients---------------------JAVA API
- ubuntu下软件删除
- 网易云信助春招上“云” ,疫情过后线上招聘或成常态
- apr java_基于 APR 的原生库
- 前后端分离 常用工具汇总
- 用lnmp.org中的lnmp下安装ftp(pureftp)
- 从Discuz迁移帐号密码到NodeBB
- python大作业五子棋人人对战_五子棋总结(人人对战)
- 捷联式惯导系统初始对准
- 中国数字化城市行业现状调研及前景规划分析报告2022~2028年
- 第一章: 利用神经网络识别手写数字
- 宗地自动编号及属性赋值
- 认识中药(4)--陈皮
- python随笔01(robotframework自动化)
- ubuntu运行Openvino出现 ModuleNotFoundError: No module named ‘openvino.model_zoo.model_api‘解决
- C# Excel文件操作
- python奇数阶乘求和_Python阶乘求和的方法
- 【MATLAB-app】系列教程(含视频)第2课_实例:使用appdesigner 制作简单的计算器
热门文章
- python语言自学-零基础小白学习Python编程语言的正确姿势(纯干货)
- python中的time库安装步骤-Python time库基本操作方法
- python语言程序设计书-清华大学出版社-图书详情-《Python语言程序设计》
- pythonurllib模块-Python3学习笔记(urllib模块的使用)
- python 类-python--类
- python哪里下载import包-python import 自己的包
- php执行删除语句代码,ThinkPHP之数据删除和执行原生SQL语句
- spring中的AnnotationConfigUtils
- .net core 中文乱码问题
- thinkphp联查