http://www.brendangregg.com/blog/2017-11-29/aws-ec2-virtualization-2017.html @木芽

AWS EC2虚拟化2017 :介绍Nitro虚拟化

在云计算中,硬件虚拟化经历了漫长的发展,相关的技术比如 VT-x, SR-IOV, VT-d, NVMe 和 APICv。最新AWS提出的hypervisor,Nirto提供了一种简单并且高效的硬件辅助hypervisor,能够提供接近裸机的性能,这个消息让人激动万分。

以下总结了EC2发展过程用到的虚拟化技术,表格右半部分是实例性能,包括cpu,memory,io等。而从上往下则是实例的类型。从表格可以看到大致分为三个阶段:

1)全虚拟化: guest os无需修改,很多操作依靠纯软件模拟,这种性能最差,应用有2到10倍的性能损失。

2)半虚拟化: hypervisor提供了有效的hypercall,guest os使用相关驱动,以及通过修改kernel来调用这些hypercall。这种效率比全虚拟化要好一些。

3)硬件虚拟化: 这种方式的性能接近裸机性能,大概有0.1%到1.5%的性能损失。

下面按照时间顺序,具体介绍下每一行的内容

1、全模拟

还记得1998年VMWARE x86 hypervisor,这是最早的虚拟化技术,在2005和2006年才开始有硬件辅助(Intel VT-x 和 AMD-V)。最早的x86 hypervisor使用模拟和二进制翻译来做特殊的操作,比如系统调用和页表操作,显然这种方式性能损失严重,特殊是对于IO密集型的workload。

2、Xen PV 3.0

进入半虚拟化时代,它是来自于Xen虚拟化。这种需要guest进行修改后才能进行hypercall。在这种配置下,AMI和boot都是半虚拟的(PV),kernel用hypercall来代替privileged instructions,对于网络和存储都是使用半虚拟化的驱动。这种方式相比全虚拟化有了性能提升,但对于系统调用和页表操作还是比较慢。目前EC2上有m1.small采用这种方式。

3、Xen HVM 3.0

这个相较于上一种方式来讲,在cpu和memory上有了硬件的辅助VT-x。另外,AMI(Amazon machine instance)boot采用HVM,所以这种类型的实例启动速度要快一步。

4、Xen HVM 4.0.1

这种方式,以HVM启动,使用PVHVM驱动[1],这使得中断和timers有了性能提升。

同时,事情也开始变得复杂起来,总结下来两个原因:

1)AMI类型。EC2对于PV和HVM使用不同镜像类型和boot,正如[2]里描述。人们开始用带PV或HVM类型的实例,但比这更复杂的是,HVM可以boot并且运行PV驱动,同时也可以在HVM驱动上运行PV。目前EC2上大部分HVM实例是带有PVHVM的HVM。 2)性能。早期的HVM性能一般,比不上PV。但现在看选择PV有点过时。听到这里,你可能有点迷惑,这里有一篇关于这几种方式的具体说明[3]

5、Xen AWS 2013

从2013å¹´开始,一些EC2实例开始对网络支持硬件虚拟化,SR-IOV。最开始是C3实例,AWS称之为网络增强型实例[4]。开始是通过ixgbe驱动达到10Gbps,后来又用ena驱动提升到25Gbps。

6、Xen AWS 2017

2015年,AWS发布了C4实例,它在EBS磁盘卷使用硬件虚拟化,然后在2016年拓展到了x1.32xlarge,在2017年最终发布了存储优化的i3 实例存储,它采用了SR-IOV技术和Nvme磁盘。这里有些结果可供参考[5]。

7、AWS Nitro 2017

重点来了,c5实例采用一种新的hypervisor,称为Nirto。非常轻量级,它是基于KVM kernel模块,没有采用qemu。同时也没有在IO路径上没有dom0或者IDD。

Nitro设计的目的就是提供裸机差不多的性能,在IO上采用SR-IOV,并且对中断也进行了硬件虚拟化:采用posted中断和APICv来减少vm exit的次数,这里有一些性能数据供参考[6]。在Nirto之前,各个组件的虚拟化都比较零散,而Nitro集大成。

另外,让人激动的是,Nirto暴露了所有PMC计数器,大大提高了性能分析的效率。AWS说以后大部分实例都要用Nirto hypervisor。

8、AWS Bare Metal 2017

更牛逼的来了,Bare Metal,与裸机一样的性能,可以运行Xen, KVM以及容器,所以的PVM计数器都有,还有一些处理器的feautres。这里有介绍视频[7]。

AWS对这种平台叫Nirto system, 刚才提到c5用的Nirto是Nirto hypervisor,可能听起来晕,这里有相关talk[8]

此文,从AWS 实例的发展介绍虚拟化的发展,最后的Nirto令人心动,也许开启了虚拟化的新篇章。