I/O虚拟化

来源:互联网 发布:effect java 书籍下载 编辑:程序博客网 时间:2024/04/30 08:19

note:这里主要记录我对IO虚拟化的理解,希望这篇文章对想了解虚拟化IO的同学有点帮助。这是我在看论文[vale,a switched ethernet for virtual machines]的时候总结的有关io虚拟化技术,概括性的和思考结果比较多,细节内容比较少。


        我们假设现在大部分的计算机服务都迁移到了虚拟化环境中(其实是事实),带来的主要好处是资源共享并减少开销。虚拟机也是需要访问外围设备的,比如磁盘和网络。即使在非虚拟化环境中访问网络也是很有挑战性的技术(应用程序使用系统调用),所以到了虚拟机这一层面,访问网络,要达到硬件的速度很困难。所以要怎么处理虚拟化I/O呢?主要有三种方法来虚拟化I/O,分别是全虚拟化,半虚拟化以及Direct I/O accsss。他们在处理guest和hypervisor通信以及hypervisor和host架构上分别采用了不同的处理方式。


全虚拟化

        最简单的方法就是给guest操作系统一个虚拟网络接口。然后由hypervisor拦截下虚拟机的Accesses (to critical resources),并且hypervisor中用一个模块来模拟网卡硬件的功能(emulator)。这种方法很直观易懂,在历史上来说,这也是第一种I/O虚拟化方式,最开始由VMware 和QEMU采纳。
(这只是最基本的解释了,至于说怎么写一个模拟器?我没写过,感兴趣的可以google~~)

        当hypervisor截取到guest的packet之后,如果要发送到网络上(这里可以既包括内部网络也包括外部网络),就需要使用host的网络栈了,比如TCP/UDP sockets(封装)。

        全虚拟化看起来直观易懂,很容易使用,环境配置简单。只是模拟的开销会很大,一般来说,那是一个非常庞大的系统(所以写个模拟器工作量很大……)。


半虚拟化

        上面讲了全虚拟化,和全虚拟化相对的就是半虚拟化,半虚拟化的意思就是说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 
0 0
原创粉丝点击