云栖社区2017在线技术峰会上,来自阿里云弹性计算团队的子团分享了红包背后虚拟化技术。他首先比较了容器技术和虚拟化技术,然后从CPU虚拟化、内存虚拟化、IO虚拟化三个方面介绍了虚拟化关键技术。他还分享了虚拟化架构的优化探索,包括高性能网络方案、高性能云盘/本地盘方案、高效热迁移技术、虚拟机CPU/内存热插拔技术等。
以下内容根据直播视频整理而成。
视频回顾:点击进入
pdf下载:点击进入
面临的挑战
以前在阿里、天猫等用的比较多的是容器技术,比如LXC/Docker,从2015年开始将“双十一”的流量部分迁移到了阿里云的虚拟机上。容器技术的特点是轻量,很容易达到本地物理机的性能,而虚拟化技术是跑在物理机上的虚拟机上的,开销相对大一些,性能不如容器技术,但是安全性比较高。
容器技术
容器技术的大体架构如上图所示,最下面是硬件平台,主流使用的是Linux内核,内核上会有Container引擎,最上方会跑一些Container实例。
虚拟化技术
虚拟化技术和容器技术最大的差别是在虚拟机和硬件平台之间会有一个虚拟机监视器,主要用于将硬件抽象出来切分资源提供给虚拟机,提供隔离和虚拟化的功能,在监视器上方则是一个个的虚拟机。
要在阿里云的公有云上跑这些业务的话,需要比较强的隔离性、安全性,所以选择虚拟化技术更加合适。虚拟化技术概念是IBM很早提出的,然后VMware公司将虚拟化技术推向民用市场。在Intel发布VT-x后,虚拟化技术走向成熟,公有云的普及让虚拟化技术规模扩大。
虚拟化关键技术
CPU虚拟化
CPU的虚拟化从实现上可以分为三种:二进制翻译技术,其优势在于跨平台虚拟化也可以实现(纯软件实现,对硬件没有要求),其缺点是指令翻译过程开销会明显增加(因为要用很多指令才能解释一个其他平台的指令,和单词翻译类似),性能不好,很少用在商用工程上,主要用于研究机构做仿真;CPU半虚拟化技术,比如在X86机器上虚拟X86的虚拟机,大部分的指令是不需要翻译的,但因为x86早期设计问题,有些敏感之类执行的异常没办法被hypervisor捕获, 导致无法进行适当模拟, 所以虚拟机的内核必须要通过修改来适配虚拟化环境;CPU硬件辅助虚拟化技术(VT-x),即每个虚拟机在non-root模式下,看到的资源(比如x86的ring结构)和本地的物理机是一致的,理论上虚拟机的内核不需要经过任何的修改就能够完全运行起来。
目前的X86机器都是支持VT-x的。VT-x提供了两种模式:root模式,权限最高,可以访问所有硬件,管理所有虚拟机;non-root模式,只拥有部分特权。右下角的这张图中,VMM跑在root模式下,其上是两个虚拟机,从root模式进入non-root模式的过程叫VM Entry,从虚拟机退出到VMM的过程是VM Exit。
当需要给虚拟机执行机会使它能够运行里面的操作系统、进程作业时,需要从root模式进入non-root模式,在non-root模式运行和在物理机上运行是没有任何区别的。只有当需要去访问一些硬件,做IO操作, 或者收到中断等情况的时候, 才需要从虚拟机退出到VMM。VM Entry和VM Exit决定了跑在机器上的虚拟机的性能,这两个操作是非常耗时的,在当前主流的至强E5平台上大约需要1 ~ 2微秒的时间。VMCS则记录了用来决定两种模式间切换的控制数据。
内存虚拟化
内存虚拟化主要面临两方面的挑战:虚拟机操作系统总是希望能够看到物理内存是从0开始的;虚拟机总是希望看到在地址空间里内存是连续的。但是硬件往往并不能保证上述两点。
如上图所示,在虚拟机里看到的内存实际上是Pseudo伪物理内存,实际的物理内存分配是硬件管理的。
MMU虚拟化技术
MMU是内存里CPU访问内存的一个主要控制单元,它面临的挑战是Guest TLB和Guest页表对硬件来讲并不总是有效的,所以MMU一定要经过虚拟化。MMU虚拟化主要有四种方式:Direct page table、Virtual TLB、Shadow page table(通过多层的page table来控制)和Extended page table(目前最主流的)。
Extend Page Table
Extend Page Table的实现如上图所示,Guest CR3控制页表的信息,完成Guest的线性地址到物理地址的转换过程,再到物理机的物理地址映射则通过EPT来完成。这种基于硬件的EPT技术,使得虚拟机里的一次内存访问不需要经过多次的页表访问就可以完成,在内存访问方面可以达到和物理机相近的水平。
IO虚拟化
常见的IO虚拟化主要有三种方案:基于软件模拟的方案,这种方案里, 中断、DMA的访问都是通过软件实现的,优点是可以模拟任何硬件的模型,缺点是性能不会太好;半虚拟化技术,主要是为了解决软件模拟性能问题,比如串口对性能要求不高可以采用软件模拟,但是磁盘设备、网卡设备对性能要求高,主流方案是采用半虚拟化技术,前后端相互感知,通过Shared Memory控制请求的传输,两个设备之间的通知也是基于快速消息传递,性能很高;设备直通模式,比如PCIE的直通、网卡SROV直通,对性能更高的可以采用此模式,可以达到和物理机上直接使用接近的性能,但是设备和虚拟机的耦合会对管理造成影响。
虚拟化架构优化
虚拟化平台升级及优化
早期的阿里云后台采用Xen的虚拟化方案,之后切换到了KVM里面。KVM能够给虚拟机提供更好的性能、稳定性, 更重要的是架构简洁,可维护性高。
虚拟化的整体架构如上图所示,最上方是后羿管控系统,主要负责虚拟机生命周期的管理,下发虚拟机启停、关闭、销毁等操作到物理机,调用Libvirt接入API,而Libvirt通过调用Qemu完成虚拟机的操作。系统使用Virtio技术做磁盘和IO设备的虚拟化,内核中使用vhost-net/vhost-blk模块来加速Virtio的性能。
新虚拟化平台的特性
- 热升级架构:所有组件热升级,由于开源代码有安全漏洞,热升级技术为性能保驾护航;
- 高可用性架构:高效、稳定的热迁移,CPU/内存的热插拔,vMCE支持,内核热补丁;
- 高性能网络架构:支持vhost-net,支持多队列虚拟网卡,SRIOV硬件网卡虚拟化;
- 高性能存储架构:支持dataplane增强的高性能分布式存储,支持SPDK的超高性能用户态框架。
高性能网络方案
高性能网络是基于SRIOV和万兆网卡技术来做的。
高性能云盘/本地盘方案
SSD云盘的数据可靠性非常高,对数据可靠性要求不是非常高的业务可以使用高性能本地盘。
高效热迁移技术
不同集群中的数组集的负载出现不均衡情况时,需要将负载特别高的物理机上的虚拟机迁移一部分到负载低的物理机上,如果没有热迁移技术则只能采用停机迁移的方式,用户可以感知到,但是热迁移技术用户是感知不到的。另外,当物理机硬件出现故障时,比如磁盘坏道变多、可校正ECC较多,此时就可以把此物理机上的所有虚拟机热迁移到其它物理机上,然后对故障机器进行维护。当机器上软件版本出现很大问题没办法进行热升级的时候,也可以使用热迁移技术进行迁移升级。
虚拟机CPU/内存热插拔技术
当升级设备时,不想停机升级,则可使用热插拔技术进行扩容。
软件层面tuning
在软件层面进行了大量的优化:Pvtimer、Pvipi、Posted interrupt、power。
优化效果
上图反映的是一台虚拟机在跑红包其中某一个业务的时候,虚拟机每秒vmexit次数的统计。蓝色代表优化前,红色代表优化后。从图上看出,优化后退出次数明显减少,虚拟机性能越来越接近物理机表现。