2006 - 2018
AWS 已走过 12 年时间
而从 Xen 到 Nitro
云计算技术也在一路发展
正如“螺蛳壳里做道场”
于精巧细微处 造就宏远庞大
在本期内容中
AWS 首席云计算技术顾问
费良宏老师
将细数云计算背后虚拟化技术的发展
并分享他身处云计算技术尖端浪潮中
最具前瞻性的思考
在传统的历法里面,六十年是一“甲子”,而十二年则被叫做“一纪”。十二年算不上很长久的时间,但是将这个数字带入云计算技术发展的坐标系上,你看到的却是天翻地覆般的变化。
十二年前,AWS 的 EC2 云服务器刚刚破茧而出,而同一时期,“虚拟化”则是业内一个大热门的技术词汇,甚至一度成为了云计算的另一种技术表述。今天,云计算早已脱离了虚拟化概念的局限,AWS 产品家族的成员也已经多到不胜枚举,但 AWS EC2 依然是最广泛应用的云计算服务。
考虑到当下云计算基础设施上数以百万计之多的服务器规模,虚拟化技术些微的变化都可能像亚马逊雨林里那只扇动翅膀的蝴蝶,掀起云计算技术变革的滔天巨浪。《国语·晋语》里有这样一句, “蓄力一纪,可以远矣”。在这个十二年轮回的时间节点上细数一下云计算背后虚拟化技术的发展,也许就是一个合适不过的当口。
Xen
早在 1998 年,VMware 率先推出了让人惊讶无比的 Hypervisor,允许用户将 x86 系统转变成通用的共享硬件基础架构,开启了 x86 架构上的虚拟化时代。但那个时代的虚拟化是一种完全的软件实现,在性能上,尤其是 I/O 性能方面,是非常糟糕的。2005 年之后,硬件辅助虚拟化技术(Intel VT-x 和 AMD-V),网络 I/O 虚拟化技术(SR-IOV、VT-d),存储技术(NVMe)以及 APICv 等技术的陆续出现,不仅大幅度提升了虚拟机的性能,也满足了虚拟化技术在生产环境中的使用要求。一时之间各种虚拟化技术纷至沓来,在主流的技术框架内,既有开源的 Xen、KVM,微软的 Hyper-V,VMware 的 ESX/ESXi,也有极具特点又令人惋惜的 Solaris Zone 等等。
其中,Xen 应该是最早被云计算所认可的虚拟化技术。Xen 通过一种叫做半虚拟化的技术获得高效能的表现,典型情况下性能损失大约 2%,在最糟的情况下会有 8% 的性能耗损,这与当时使用完全虚拟化却造成最高 20% 损耗的其它解决方案形成一个明显的对比。于是最早出现的云计算环境(例如 AWS)大多选择了 Xen 实现底层的硬件虚拟化,之后的十年间,Xen 虚拟化随着云计算的普及而得到了长足发展。这张示意图就归纳了这个演进历程。
采用了半虚拟化技术。为了实现更高的性能,在这里,Guest 虚拟机需要 Hypervisor 进行修补。在这个配置中,AMI 和 boot 是半虚拟的(PV),内核使用的是 hypercalls 而不是特权指令,系统使用了半虚拟的网络和存储驱动程序。这些技术实现了性能上的提升,但是仍然有一些特权操作具有明显的开销(系统调用页表事件)。事实上,EC2 上的第一个实例就是这样的。
这个技术具有了一个新的 Hypervisor 配置,使用的 CPU 具有硬件虚拟化的特性(VT-x),网络和存储设备使用了半虚拟化驱动程序。AMI 和 boot 现在升级为 HVM,不再需要改动,中断和定时器仍尚未实现半虚拟化。性能的表现上,这种类型的实例可以比裸机启动得更快。
这个配置启动 HVM 并使用了 PVHVM 驱动程序。这些驱动程序在 HVM 上也称为 PV,它们是使用 HVM 功能的半虚拟化驱动程序,在包括工作负载方面在内的可改进项上进行了改进,包括中断和定时器等。
早期的 HVM 技术或有不足,表现为 HVM 的实例在性能上比 PV 实例要慢。随后,这个问题被改进,HVM 的优势变得更为明显,于是 HVM 就成为 AWS 官方推荐的实例虚拟化类型。当然,这个名字本身也很容易让人混淆,记住一点就足够了—— EC2 上 “HVM” 实例都是带有 PVHVM 驱动程序的 HVM 。
从 2013 年开始,EC2 实例类型开始支持网络接口的硬件虚拟化:单根 I/O 虚拟化(SR-IOV), 第一个支持这个技术的实例就是 C3 。AWS 则将这个特性称作“增强联网” ,其中,Intel 82599 虚拟功能(VF) 接口最多支持 10 Gbps 的网络速度 (例如 C3 实例);而 Elastic Network Adapter 则最多支持 25 Gbps 的网络速度(例如 P2 实例)。2016 年, Netflix 曾经进行过一个有意思的网络性能测试,结果是在 AWS 上达到了每秒 2 百万个数据包。
相关链接:
2015 年,AWS 推出了新的实例 C4,它在网络存储 EBS 卷上使用了硬件虚拟化技术。在 2016 年,这个技术扩展到 x1.32xlarge 的实例存储设备之上(这个实例类型拥有 128 颗 vCPU 、1,952G 内存、2 个 1,920GB 的 SSD 存储)。2017 年,AWS 推出了存储优化实例类型 I3,该类型使用了 SR-IOV 和 NVME 存储驱动程序。Netflix 对这个类型也做了测试和部署,证实了 AWS 上 I3 实例存储的 300 万次 IOPS 。
I3 NVMe 存储 IOPS
I3 NVMe 存储吞吐
相关链接:
看起来,这似乎是一个伟大的成就。虚拟化技术,特别是 Xen 的应用应该已经达到了皆大欢喜的结果。按照常人的理解,在很长的一段时间里我们可以将重心移向他处了,但是技术的发展却不能以常理来推测。事实上,在长期的实践中,Xen 自身具有的缺陷已经暴露得越来越清晰。
主要的问题有这几点:
Domain0 是 Xen 在初期就引入的一个特权 Dom。Xen 的 Hypervisor 在收到 IO 请求后,需要先把请求转给 Domain0,完成调度处理后,再通过 grant copy 或者 grant map 转发到对应的虚拟机上。这就使得我们在 Dom0 的切换上损失了太多性能。
Xen Hypervisor 的 CPU 和内存调度管理
过去的十年,CPU 技术以及 Linux 内核都有了十足的发展,但是 Xen Hypervisor 的 CPU 和内存调度管理却乏善可陈。例如在对于 hugepage 的支持上,Xen 只支持 2M 的物理页面;多核(>128)调度上,也遇到了难以克服的问题。
于是,新的变化出现了。
AWS Nitro 2017
在 2017 年 10 月 30 日的 AWS re:Invent 大会上, 当 Peter DeSantis 发布新的 C5 实例时,他出人意料地宣布了 AWS 在 EC2 架构上的新演进——Nitro 系统架构。
记得发布的时候我就坐在会场的前排,当大屏幕上闪过这个新的虚拟化架构时,要承认我确实被这个大胆而全新的技术吓到了。按照他的介绍,在 Nitro 系统架构中,网络、存储、安全管理及监控都从传统实例中解耦,被迁移到专属硬件中。这些功能都将模块化、微服务化,使其能够快速迁移并且随时根据新的需求而演进。
这种架构的好处,是我们可以将所有服务器资源都分配给客户的实例,并且我们最终的目标是让 EC2 实例与裸金属主机之间没有区别。此外,从 EC2 C3 实例到 EC2 C4 实例,AWS 实现了将网络和存储模块迁移到 Nitro 系统中的功能。
Nitro 是一个轻量级的、基于 KVM 核心内核模块的系统虚拟化模块,但剪裁掉了部分组件,例如 QEMU。在 I/O 路径中没有调用 dom0 或 IDD,而是直接对硬件进行访问。Nitro 的目标是提供“与裸设备无法区分”的虚拟化表现,它不仅将 SR-IOV 用于网络和存储 I/O 的硬件虚拟化(AWS 2015 年收购的 Annapurna 实验室研发的 ASIC 芯片),还具有了硬件虚拟化支持的中断:使用延迟的中断和 APICv 来减少 VM exits 的数量。强调一点,中断性能被描述为硬件虚拟化性能的最后战场 。
无独有偶,在 AWS 公布了 Nitro 之后,微软也于 2018 年 2 月 5 日公布了其使用 FPGA(现场可编程门阵列)封装的 Accelerated Networking(AN)网络。看来殊途同归,使用专用硬件加速网络已经被证明是一条有效的通道。不过这个技术的门槛或许比较高,远不是普通的玩家可以参与的。至于 ASIC vs FPGA,这个见仁见智,答案或许就在今后的市场表现上了。
Nitro 并非是从零出现的技术,上文提到的硬件虚拟化开发的成果都是 Nitro 的组成部分,并且这个项目的开发历时 4 年之久。这也意味着,Nitro 虽然很新但是风险不大,也会很容易去部署使用。据 Brendan Gregg 观察,Nitro 的性能损耗是非常小的,通常不到 1%(很容易测量)。他的结论是—— Nitro 提供的虚拟化性能接近裸设备。
对于需要深度定制化 EC2 的用户而言,Nitro 也带来了另外的好处:对于 EC2 更深入的监控和优化。在 Nitro 所支持的 C5 实例中,我们可以得到数百个 PMCs 计数器(Performance Monitoring Counters ,性能监控计数器)。作为对比,以前的实例类型中,我们只能看到区区 7 个 PMCs 。
C5 是第一个使用 Nitro Hypervisor 的实例。截止到目前,C5 已经在 AWS 全球 10 个区域投入使用。随着国内云计算产业的发展,相信不久之后我们就会在 AWS 北京以及宁夏区域找到这个新一代的实例。
AWS 在 re:Invent 大会上表示,除了新的 Bare Metal 实例之外,大多数或全部实例将使用 Nitro 来进行管理。这也意味着,我们是时候与 Xen 说一声“再见”了 。出于好奇,我检索了一下自 2018 年以来 Amazon 在 Linux Kernel 上的贡献。可以看出,随着投入的加大,Nitro 技术势必快速成熟起来,而它所代表的新一代虚拟化技术应该为业界提供了一个很好的范本。Nitro 发布之后,有过各种评论,其中一篇的标题很有意思,叫做“AWS 不是终点,但的确是指路的明灯”。
后记
我认为,此时此刻任何一家企业的 CIO、CTO、技术副总裁、总监或项目经理都应该考虑这样一个问题:为什么我们购买硬件以期与云计算竞争?
在今天这个技术发展日趋复杂多变的时代,执念于自身并没有优势的领域是极其危险的一件事。现在是改变过去的投资习惯,并将支出重新导入到前瞻性战略领域的时候了。这应该就是云计算时代新的 IT 模式吧。
此外,正如我们熟知的所谓“冰山一角”的原理,我们所看到的云服务的价格、规格等等应该只是其表象而已。一个最普通不过的虚拟服务器,管理和调度其运行居然要如此大费周章。所以,产品的优势和技术特点应该更被我们所关注,毕竟这些因素才是未来可以支撑起业务发展的关键所在。
英国作家王尔德说过一句话:“对价格了如指掌的人,对价值往往一无所知”。在这个时代,我们要做哪一种人?