找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4711|回复: 0

I/O 虚拟化技术介绍

[复制链接]

238

主题

329

帖子

2119

积分

超级版主

Rank: 8Rank: 8

积分
2119
QQ
发表于 2016-2-29 12:04:15 | 显示全部楼层 |阅读模式
本帖最后由 xiaoyu 于 2016-3-3 11:19 编辑

转自微信公众好号“思杰之路“
1301.JPG
    在上面的文章中我们已经说了XenServer中存在的两种常用是网络堆栈模式,但是这两种模式对于应用在XenServer环境下来说,有一定的性能损耗。特别的在大规模高并发是情况下性能缺陷明显。根据公开资料显示,在Xen的环境下,对于目前的这两种网络IO虚拟化方式,存在着至少以下两个方面的性能瓶颈:一是Domain 0的后端驱动对Domain U的前端驱动的数据包收发。一个后端驱动需要应付很多的前端驱动的数据请求和交换。而是Domain 0和Domain U在数据交换的过程中,对每一次的数据包收发都会产生一次页面授权操作,这样对于Xen虚拟化底层系统的页面授权的超级调用就会很频繁,不断影响数据包的收发,还影响数据包的吞吐。
    为了解决纯软件的方式所造成的性能损耗,和CPU、内存类似,提出了基于硬件发IO设备来解决其性能问题,即硬件辅助的I/O 虚拟化。我们都知道,计算机的主要硬件资源可以划分为三大类,第一类是代表了计算机计算能力的中央处理器CPU;第二类是计算机存储资源,主要是内存;第三类是计算机与外部通信的I/O 设备。在上一篇文章操作系统运行原理当中,我们介绍了传统的操作系统对着三大类硬件资源的管理和调度。那么在虚拟化环境下,对着三大类硬件资源的管理和调度就转移到了虚拟机监视器VMM,即我们常说的服务器虚拟化层。

CPU虚拟化
    CPU 虚拟化是指针对CPU 的虚拟化技术。通常情况下,客户机的指令可以直接在物理CPU 上运行,只有少数x86 平台的特权指令,需要在高特权级别下执行。当客户机试图执行一条特权指令时,由于特权级别不符会产生一个错误。在x86 平台的虚拟化漏洞被填上之前,特权指令会被虚拟机监视器截获并代替客户机模拟执行,使其产生正确的执行结果。在Intel VT 等硬件虚拟化技术出现之后,由于增加了新的特权级和特权级切换指令,这个问题得到了更好的解决。
    另一方面,由于物理CPU 被多个客户机共享,每个客户机的状态都需要被保存下来,以便下次轮到客户机使用CPU 时可以恢复上次运行结束时的状态。类似操作系统中保存进程状态的进程控制块,虚拟化技术中对应的概念是虚拟CPU(Virtual CPU,或VCPU)。VCPU 由虚拟机监视器创建并分配给客户机,VCPU 保存了客户机使用CPU 时的上下文信息和寄存器状态。
CPU 虚拟化还需要处理中断和异常。中断一般由硬件产生,由于硬件资源是完全被虚拟机监视器管理,客户机没有办法直接接触到物理硬件。因此中断也不能直接送到客户机,而是先被虚拟机监视器截获,并在合适的时间模拟一个虚拟中断注入到客户机。然后客户机操作系统才能对这个中断进行处理。也就是说虚拟机监视器还需要为每个客户机模拟中断控制器。异常处理则更为重要,上文所提到的特权级切换就是通过异常来实现的,同时虚拟机监视器还需要处理其他异常。

内存虚拟化
    内存虚拟化的主要任务是内存地址的转换,由于现代操作系统中虚拟内存的存在,虚拟化环境的内存地址转换有两层,首先从客户机虚拟地址转换为客户机物理地址,然后把客户机物理地址转换成宿主机的实际物理地址。而事实上两次内存地址转换既低效又不可行,因为每台客户机都有自己的地址空间,如果把所有客户机的地址映射都保存在一个页表里,必然会产生冲突。这个问题开始是用影子页表来解决的,虚拟机监视器为客户机的每个页表都维护一个影子页表,影子页表中的地址是实际物理地址。当客户机访问内存时,客户机虚拟地址通过转换后得到的其实是影子页表里的实际物理地址,这样就解决原本需要两次地址转换的内存虚拟化问题。
    影子页表技术直观有效,但是占用大量内存而且实现起来非常复杂。目前x86 平台以及使用了对内存虚拟化的硬件支持,如Intel 的扩展页表(ExtendedPage Table 或EPT)技术和AMD 的嵌套页表(Nested Page Table 或NPT)技术,直接在硬件层面实现了客户机虚拟地址到宿主机物理地址的转换。

I/O虚拟化
    I/O 虚拟化主要是I/O 设备的虚拟抽象,也有软件模拟和硬件辅助两种方法。软件模拟的I/O 虚拟化通过模拟I/O 设备并从客户机截取对模拟I/O 设备的访问,直接或者转换之后发给物理硬件。通常软件模拟的I/O 设备都是非常普遍的,客户机操作系统一般都已经有这些设备的驱动程序,不需要修改客户机操作系统或者安装新的驱动程序。而有些I/O 虚拟化模型使用了半虚拟化技术,通过在宿主级和客户机使用特定的设备驱动,实现更高性能的I/O 虚拟化,比如Xen 的前后端驱动模型。这样的半虚拟化驱动已经进入Linux 操作系统内核,称为标准设备驱动的一部分。
    I/O 虚拟化的主要解决方案包括:基于I/O 设备完全模拟的解决方案、基于前后端模型的解决方案和基于硬件的解决方案。
其中基于I/O 设备完全模拟的解决方案(如QEMU)需要在宿主机中用软件的方法完整的模拟I/O 设备,并暴露给客户机跟真实硬件设备一致的接口。这种I/O 虚拟化方案不仅实现起来非常复杂,而且性能也比较低,在高速I/O设备虚拟化中已经逐渐被其他解决方案取代。
       前后端(Frontend-Backend)是Xen 平台的专业术语,但是在其他虚拟化平台也有类似原理的应用(如KVM 的Virt-IO 技术)。基于前后端的I/O 虚拟化模型采用半虚拟化的方式,在客户机操作系统系统机宿宿主机操作系统中安装特殊的设备驱动,建立起高效的虚拟I/O 通道。相比于比原始的基于I/O 设备模拟的I/O 虚拟化解决方案,前后端模型减少了客户机和宿主机之间的通信代价,提高了I/O 虚拟化的性能。本文以前后端模型这一术语指代所有采用了类似半虚拟化思想的I/O 虚拟化模型,但是仅讨论其中的典型代表,即Xen 的前后端模型。
硬件辅助的I/O 虚拟化主要是通过I/O 设备原生支持多个客户机共享以及直接I/O 技术来实现的。在硬件辅助的I/O 虚拟化环境,I/O 设备可以直接分配给多个客户机共享使用,而不需要软件模拟。而客户机也可以直接访问分配给它的I/O 设备,避免了虚拟机监视器的干涉。硬件辅助的I/O 虚拟化往往可以提供较高的I/O 性能,但是会失去软件模拟I/O 虚拟化的一些优点,如安全性和热迁移等。
     在虚拟化技术三个组成部分中,CPU虚拟化和内存虚拟化在硬件的支持下,已经能获得接近物理机器的执行效率,而I/O 虚拟化由于虚拟化所带来的巨大额外开销,是如今虚拟化环境的重要性能瓶颈之一。明天我们好好说说基于硬件IO虚拟化技术的实现SR-IOV技术。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表