I/O虚拟化
note:这里主要记录我对IO虚拟化的理解,希望这篇文章对想了解虚拟化IO的同学有点帮助。这是我在看论文[vale,a switched ethernet for virtual machines]的时候总结的有关io虚拟化技术,概括性的和思考结果比較多。细节内容比較少。
我们如果如今大部分的计算机服务都迁移到了虚拟化环境中(事实上是事实)。带来的主要优点是资源共享并降低开销。
虚拟机也是须要訪问外围设备的,比方磁盘和网络。
即使在非虚拟化环境中訪问网络也是非常有挑战性的技术(应用程序使用系统调用),所以到了虚拟机这一层面,訪问网络,要达到硬件的速度非常困难。所以要怎么处理虚拟化I/O呢?主要有三种方法来虚拟化I/O。各自是全虚拟化,半虚拟化以及Direct I/O accsss。他们在处理guest和hypervisor通信以及hypervisor和host架构上分别採用了不同的处理方式。
全虚拟化
(这仅仅是最主要的解释了,至于说怎么写一个模拟器?我没写过。感兴趣的能够google~~)
当hypervisor截取到guest的packet之后。假设要发送到网络上(这里能够既包含内部网络也包含外部网络),就须要使用host的网络栈了,比方TCP/UDP sockets(封装)。
全虚拟化看起来直观易懂。非常easy使用,环境配置简单。仅仅是模拟的开销会非常大,一般来说。那是一个非常庞大的系统(所以写个模拟器工作量非常大……)。
半虚拟化
上面讲了全虚拟化。和全虚拟化相对的就是半虚拟化,半虚拟化的意思就是说guest操作系统可以感知到自己是虚拟机。
那么对于I/O系统来说,仅仅要guest的驱动可以和hypervisor进行沟通,。
不同的hypervisor使用不同的技术来实现半虚拟化。比方说xen。就是通过事件通道,授权表以及共享内存的机制来使得虚拟机中的驱动(前端驱动)和host中的驱动(后端驱动)来通信。
最后由设备域的标准linux内核来处理IO。
另外kvm使用virtio。和xen的半虚拟化网络驱动原理几乎相同。
还有就是比方VMware的Guest tools,和xen的半虚拟化机制应该也非常相似,一通百通。
那么半虚拟化相对全虚拟化有什么优点?尽管和全虚拟化一样,都是使用软件完毕虚拟化工作。可是因为机制不一样,这样的方式因为不像模拟器那么复杂。软件处理起来不至于那么慢,所以有更高的带宽,更好的性能。可是还是存在性能问题,仍然达不到硬件的速度。
break:到此为止,提一个问题,为什么软件实现的性能不好?比方达不到有硬件支持(以下会提到)的速度?难道硬件支持就一定快,软件就一定慢?能不能设计出一种软件比有硬件支持的更快呢?(这个问题边想边继续看吧,到文章的结尾处我会给出我的认识)
Direct I/O Access
前面的两种方式,不管是模拟还是沟通方式,都须要guest和hypervisor的交互,而这里要讲的这样的方式是为了避免guest和hypervisor的沟通,使得guest能够直接将流量发到硬件上面。
看起来非常奇怪是不是,可是这样的方式应该怎么做?host或hypervisor怎么将网卡的控制权转移给host?有没有一个网卡能够转移给多个虚拟机使用呢?(这仅仅是一点提示问题,你可能还能够想出很多其它的问题来。)为了解决这些问题,须要一套机制支持,这里主要表如今硬件的支持。
首先考虑一个简单的情形,将一个NIC分配给一个guest(host和其它guest都不能看到这个NIC),如今的方法是通过pci passthrough技术。
如今一般一个网卡是一个pci设备。当系统识别这个网卡后,在内存会分配一块相应的pci配置空间,为了支持pci passthrough。现代的cpu架构会提供一种机制将这块pci物理地址映射到guest操作系统的内存。比方intel的vt-d和amd的iommu(cpu对虚拟化的硬件支持)。然后通过软件比方,pci passthrough命令来使用一次这块硬件,实现映射的功能。可是是不是一定要用到CPU的虚拟化支持呢,我想仅仅要你牛逼,写个有映射功能和隔离机制的软件也能够做到相同的功能吧。
另外假设要将一个NIC分配给多个guest。我想就是SR-IOV技术了。就是将一个网卡虚拟出多个VF,然后将每一个VF通过pci passthrough分配给不同的guest。
这里除了cpu的虚拟化支持,比方intel的vt-d,也还须要网卡本身的虚拟化技术,须要虚拟出多个vf功能。以及邮箱机制等功能(我做不了硬件的虚拟化,仅仅讲功能需求)。
关于这三种方式,我的了解程度都不一样。尽管三种我都用过。全虚拟化的方式採用模拟器(写一个模拟器的难度太大,没有尝试过写,也没有读过代码);xen的半虚拟化机制看过源代码,调用它的api实现过一些功能。至于pci passthrough我以前使用82599网卡的SRIOV功能,将网卡虚拟化为多个vf,再将多个vf分配给多个虚拟机进行实验。这样虚拟机的带宽确实非常高。
break:对于那个问题。私以为软件执行的速度不一定比纯硬件慢。软件归根结底也是表如今cpu上执行(推荐看看csapp《深入理解计算机系统》)。相同一个功能,软件的不同设计导致执行的速度非常可能不同。有的快,有的慢。当软件的设计非常完美的时候,这个时候影响软件执行的瓶颈就是CPU频率和内存带宽。对于实现交换机功能这种软件。假设这个交换机设计合理,基本上能达到cpu的频率。假设相应的物理网卡的带宽小于这个值,那么这个软件交换机相对于物理网卡而言。设计非常棒。我们会认为虚拟机的网络IO性能真的是相当棒。
另外假设网卡带宽大于cpu主频或内存带宽的时候,此时假设交换机软件也设计相当棒的时候,瓶颈就表如今cpu主频上。
p.s.因为比較懒,没有绘图。希望不影响理解,有些观点没有展开,细节讲的过少。有些没有重点。会慢慢改动补充,欢迎评论与建议:-I
I/O虚拟化的更多相关文章
- [原] KVM 虚拟化原理探究(1)— overview
KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...
- BIOS中未启用虚拟化支持系列~~例如:因此无法安装Hyper-V
异常处理汇总-服务器系列:http://www.cnblogs.com/dunitian/p/4522983.html 一般都是启动一下CUP虚拟化就可以了 比如华硕的:
- [原] KVM 虚拟化原理探究 —— 目录
KVM 虚拟化原理探究 -- 目录 标签(空格分隔): KVM KVM 虚拟化原理探究(1)- overview KVM 虚拟化原理探究(2)- QEMU启动过程 KVM 虚拟化原理探究(3)- CP ...
- [原] KVM 虚拟化原理探究(6)— 块设备IO虚拟化
KVM 虚拟化原理探究(6)- 块设备IO虚拟化 标签(空格分隔): KVM [toc] 块设备IO虚拟化简介 上一篇文章讲到了网络IO虚拟化,作为另外一个重要的虚拟化资源,块设备IO的虚拟化也是同样 ...
- [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化
KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...
- [原] KVM 虚拟化原理探究(4)— 内存虚拟化
KVM 虚拟化原理探究(4)- 内存虚拟化 标签(空格分隔): KVM 内存虚拟化简介 前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理.可以说内存是除了CPU外最重要的组件,Gu ...
- [原] KVM 虚拟化原理探究(3)— CPU 虚拟化
KVM 虚拟化原理探究(3)- CPU 虚拟化 标签(空格分隔): KVM [TOC] CPU 虚拟化简介 上一篇文章笼统的介绍了一个虚拟机的诞生过程,从demo中也可以看到,运行一个虚拟机再也不需要 ...
- [原] KVM 虚拟化原理探究(2)— QEMU启动过程
KVM 虚拟化原理探究- QEMU启动过程 标签(空格分隔): KVM [TOC] 虚拟机启动过程 第一步,获取到kvm句柄 kvmfd = open("/dev/kvm", O_ ...
- Linux虚拟化学习笔记<一>
关于虚拟化,原理的东西是非常复杂的,要想完全理解,没有足够的耐心是不不能完全学透这部分内容的.那下面我主要以资源汇总的形式把一些资料罗列出来,帮助大家快速理解虚拟化,快速使用和配置. 为什么要虚拟化: ...
- ITTC数据挖掘平台介绍(七)强化的数据库, 虚拟化,脚本编辑器
一. 前言 好久没有更新博客了,最近一直在忙着找工作,目前差不多尘埃落定.特别期待而且准备的都很少能成功,反而是没怎么在意的最终反而能拿到,真是神一样的人生. 言归正传,一直以来,数据挖掘系统的数据类 ...
随机推荐
- 42使用NanoPiM1Plus在Android4.4.2下的录音测试
42使用NanoPiM1Plus在Android4.4.2下的录音测试 大文实验室/大文哥壹捌陆捌零陆捌捌陆捌贰21504965 AT qq.com完成时间:2017/12/5 17:51版本:V1. ...
- Android 知识Tips
有一些Android很小的知识点,不值得单独写出来做为一篇博客.都在这个博客里面进行总结 1.ImageButton控件,中间图片的放置效果可以用scaleType来设置,如下: <ImageB ...
- 联想 Vibe Shot(Z90-3) 免recovery 获取ROOT权限 救砖 VIBEUI V3.1_1625
>>>重点介绍<<< 第一:本刷机包可卡刷可线刷,刷机包比较大的原因是采用同时兼容卡刷和线刷的格式,所以比较大第二:[卡刷方法]卡刷不要解压刷机包,直接传入手机后用 ...
- BZOJ2657: [Zjoi2012]旅游(journey) (树形DP)
题意:一个三角划分的凸多边形 画一条对角线 穿过最多的三角形 题解:把每一个三角形看作一个点 如果某条边是两个三角形的公共边 那么就把这两个三角形连边 然后问题就转化为求树上的最长链了 就当求个直径就 ...
- docker 1-->docker compose 转载
转自:http://www.ityouknow.com/docker/2018/03/22/docker-compose.html Docker-Compose 是 Docker 的一种编排服务,是一 ...
- [转]SSD固态存储大观(一)
From: http://blog.51cto.com/alanwu/1405874 Contents 1.概述... 1 2.FusionIO:Pcie SSD的始作俑者... 2 3.Intel ...
- java面试题链接
http://blog.csdn.net/jackfrued/article/details/17339393
- ionic3开发环境搭建与配置(win10系统)
1.安装nodeJS(不会的自行百度) 2.安装ionic和cordova,执行以下命令: npm install -g ionic cordova 3.安装Java JDK: 下载地址:http:/ ...
- [Python数据结构] 使用List实现Stack
[Python数据结构] 使用List实现Stack 1. Stack 堆栈(Stack)又称为栈或堆叠,是计算机科学中一种特殊的串列形式的抽象数据类型(ADT),其特殊之处在于只能允许在阵列的一端进 ...
- FileOutputStream将从一个文件中读取的内容写到另一个文件中
package com.janson.day2018082 import java.io.FileInputStream; import java.io.FileNotFoundException; ...