云计算一直是在大型数据中心向多个(甚至竞争)租户出租计算资源的先驱业务。云的基本使能技术是
早期云计算增长的关键驱动力是服务器整合。现有的应用程序通常安装在单独利用率不足的物理主机上,而虚拟化使得将它们打包到更少的主机上成为可能,而无需任何修改或代码重新编译。VM 也可以通过软件 API 而不是物理操作来管理。
它们可以集中备份并在不同的物理主机之间迁移,而不会中断服务。今天,亚马逊和 Rackspace 等商业提供商维护着庞大的数据中心,托管着数百万个 VM。这些云提供商减轻了客户管理数据中心的负担,并实现了规模经济,从而降低了成本。
虽然
这个问题在剑桥大学受到了很多思考,包括计算机实验室(Xen hypervisor 于 2003 年起源于此)和 Xen 项目(现在通过亚马逊和 Rackspace 等公司为公共云提供支持的 hypervisor 的托管者)。
MirageOS 的目标是重构整个
今天在云上运行的典型 VM 包含一个完整的
尽管包含许多灵活的软件层,但大多数已部署的 VM 最终都执行单一功能,例如充当数据库或 Web 服务器。向单用途 VM 的转变反映了按需部署新虚拟计算机变得多么容易。即使在十年前,部署单个(物理)机器实例也需要更多的时间和金钱,因此单台机器需要运行多个最终用户应用程序,因此需要仔细配置以隔离各个服务和用户。
构成 VM 的软件层尚未赶上这一趋势,这代表着优化的真正机会——不仅在性能方面通过使应用适应其任务,而且在安全性方面通过消除冗余功能并减少公共云上运行的服务的攻击面。然而,由于现有操作系统的结构,静态地执行此操作是一个挑战。
现代 hypervisor 提供了可以动态扩展的资源抽象——既可以通过添加内存和内核垂直扩展,也可以通过生成更多 VM 水平扩展。许多应用程序和操作系统无法充分利用此功能,因为它们是在现代 hypervisor 出现之前设计的(并且物理类似物(如内存热插拔)在商品硬件中从未普及)。通常,为了使服务通过在负载增加时生成新的 VM 来弹性响应,会在 VM 中运行的传统应用程序中添加外部应用程序级负载均衡器。然而,传统系统并未针对大小或启动时间进行优化(例如,Windows 可能会在启动时应用许多补丁),因此负载均衡器必须通过保持空闲 VM 来处理负载峰值,从而浪费资源和金钱。
为什么不能简单地修复操作系统中的这些问题?现代操作系统旨在保持坚定的通用性,以解决广大受众的问题。例如,Linux 在极其多样化的平台上运行,从低功耗移动设备到为庞大数据中心供电的高端服务器。仅仅为了帮助一类用户提高应用程序性能而损害这种灵活性是不可接受的。
另一方面,由于 hypervisor 可以在较低级别执行此操作,因此专用服务器应用不再需要 OS 充当资源多路复用器。这种方法的一个明显问题是,大多数现有代码都假定存在大型但相当钙化的接口,例如 POSIX 或 Win32 API。另一个潜在问题是,传统操作系统提供诸如 TCP/IP 堆栈用于通信和文件系统接口用于存储持久性数据之类的服务:在我们美好的新世界中,这些服务将从何而来?
MirageOS
这不是人们第一次提出关于操作系统的存在性问题。一些研究小组提出了
与更传统的设计相比,libOS 架构具有几个优点。对于
libOS 架构有两个很大的缺点。首先,并行运行多个具有强大资源隔离的应用程序是很棘手的(尽管 Nemesis 在最小化交互式应用程序之间的串扰方面做得非常出色)。其次,必须重写设备驱动程序以适应新模型。商品 PC 硬件的
幸运的是,OS 虚拟化克服了商品硬件上的这些缺点。现代 hypervisor 为 VM 提供 CPU 时间和强大的隔离虚拟设备,用于网络、块存储、USB 和 PCI 桥接。作为 VM 运行的 libOS 只需要实现这些虚拟硬件设备的驱动程序,并且可以依赖 hypervisor 来驱动真正的物理硬件。libOS 应用程序之间的隔离可以通过低成本实现,只需使用 hypervisor 为每个不同的应用程序生成一个新的 VM,使每个 VM 可以自由地专门用于其特定目的。hypervisor 层施加了一个更简单、更少
尽管 OS 虚拟化使得 libOS 成为可能,而无需一支设备驱动程序编写大军,但仍然需要协议库来替换传统操作系统的服务。现代内核都用 C 语言编写,C 语言擅长
图 2 显示了 MirageOS 中的逻辑工作流程。来自源代码(本地和全局库)和配置文件的精确依赖关系跟踪使已部署内核二进制文件的完整出处可以记录在不可变数据存储中,足以按需精确地重新编译它。
MirageOS 旨在统一这些不同的
• 静态类型检查。 编译器可以将程序变量和函数分类为类型,并拒绝将一种类型的变量当作另一种类型操作的代码。静态类型检查在编译时而不是运行时捕获这些错误,并为系统程序员提供了一种灵活的方式来相互保护程序的不同部分,而无需完全依赖虚拟内存分页等硬件机制。类型检查最明显的好处是避免了内存错误,例如缓冲区或整数溢出,这些错误在 CERT(计算机紧急响应小组)漏洞数据库中仍然很普遍。更高级的用途是
• 自动内存管理。 运行时系统减轻了程序员分配和释放内存的负担,同时仍然允许手动管理缓冲区(例如,用于高效的 I/O)。现代垃圾收集器还旨在通过增量和分代收集来最大限度地减少应用程序中断,从而允许它们用于
• 模块。 当代码库增长时,模块将其划分为具有定义明确的接口的逻辑组件,将它们粘合在一起。模块有助于软件开发扩展,因为内部实现细节可以被抽象化,并且可以限制单个
• 元编程。 如果在编译时部分了解系统的运行时配置,那么编译器可以比通常情况下更多地优化程序。在不了解运行时配置的情况下,编译器的手脚被束缚,因为输出程序必须保持完全通用,以防万一。这里的目标是在编译时统一配置和代码,并在部署到公共云之前消除浪费。
总之,这些功能大大简化了
我们于 2008 年开始构建 MirageOS 原型,目的是了解我们可以在多大程度上统一库操作系统和
挑战是确定正确的模块化抽象,以支持在单个可管理结构中表达整个操作系统和应用程序软件堆栈。MirageOS 已经发展成为一套成熟的近 100 个
图 2 说明了 MirageOS 的设计。它赋予编译器比传统的云部署周期更广泛的
• 输入应用程序的所有源代码依赖项都被显式跟踪,包括实现内核功能所需的所有库。MirageOS 包括一个构建系统,该系统在内部使用 SAT 求解器(使用 OPAM 包管理器,以及来自 Mancoosi 项目的求解器)来搜索来自已发布的在线包集中兼容的模块实现。由于 OCaml 的静态类型检查,接口中的任何不匹配都会在编译时捕获。
• 然后,编译器可以输出完整的独立内核,而不仅仅是 Unix 可执行文件。这些 unikernels 是单用途 libOS VM,它们仅执行其应用程序源代码和配置文件中定义的任务,并且它们依赖 hypervisor 来提供资源多路复用和隔离。甚至必须设置虚拟内存页表并初始化语言运行时的引导加载程序也被编写为一个简单的库。每个应用程序都链接到它需要的特定库集,并且可以以特定于应用程序的方式将它们粘合在一起。
• 专门的 unikernels 部署在公共云上。与传统的虚拟化等效物相比,它们具有明显更小的攻击面,并且在启动时间、二进制大小和运行时性能方面更
OCaml 是 MirageOS 的唯一基础语言,原因有几个关键原因。它是一种
OCaml 支持模块签名的定义(数据类型
考虑一个简单的例子。图 3 显示了静态 Web 服务器的部分模块图。库是抽象
当程序员对他们的 HTTP 逻辑感到满意时,他们可以重新编译以切换为使用 OCaml TCP/IP 堆栈,如图 3 中的MirTCP所示。这仍然需要 Unix 内核,但仅作为将以太网帧传递到
MirageOS 中的库以尽可能函数式的风格设计:它们是可重入的,具有显式状态句柄,这些句柄又是可序列化的,因此可以显式地重建它们。应用程序由一组库加上一些配置代码组成,所有这些都链接在一起。配置被构造为一棵树,大致类似于文件系统,子目录由每个库解析以初始化它们自己的值(让人想起 Plan 9 操作系统)。所有这些都通过
元编程也扩展到存储。如果应用程序使用少量文件(通常需要块设备和文件系统的所有包袱),MirageOS 可以将其转换为满足
元编程的一个(故意的)后果是,大型功能块可能会完全从输出二进制文件中丢失。这使得最专业的目标的动态重新配置成为不可能,并且配置更改需要重新链接 unikernel。表 1 显示了 MirageOS Web 服务器中涉及的活动(即
在传统的 OS 中,应用程序源代码首先通过
调解。在内核中,诸如网络堆栈或虚拟内存系统之类的各种子系统处理系统调用并与硬件交互。
。
优势
部署和管理
编译器可以分析和优化整个 unikernel。
工具和编译器的类型检查器。结果是大大减少了配置复杂的多服务应用程序 VM 所需的工作量。
unikernel 的一个缺点是,由于需要调度更多 VM 并增加 churn(因为每次重新配置都需要重新部署 VM),它给云编排层带来了负担。流行的编排实现近年来发展得相当有机,并且由许多分布式组件组成,这些组件不仅难以管理,而且延迟和资源消耗也相对较高。
单用途
云环境是一种所有资源使用情况都会被计量和租用的环境。与此同时,多租户服务会受到负载变化的影响,这鼓励快速扩展部署——向上扩展以满足当前需求,向下扩展以避免浪费资金。在 MirageOS 中,特定构建中未使用的功能不会被包含,并且
小型 unikernel 二进制文件(在许多情况下约为数百 KB 量级)使得跨互联网远程数据中心的部署更加顺畅。启动时间也轻松地少于一秒,使得在响应传入网络数据包时启动 unikernel 成为可能。
图 5 比较了 MirageOS 和 Linux/Apache 发行版中服务的启动时间。一个
MLton20 编译器率先使用了 WPO(全程序优化),其中应用程序及其所有库一起进行优化。在 libOS 世界中,一个完整的程序实际上就是一个完整的操作系统:这项技术现在可以从
一个有趣的最新趋势是转向
图 3 中所示的 MirageOS 库的结构明确编码了库从其执行环境所需的内容。虽然这传统上意味着一个
例如,
其他
MirageOS 当然不是过去几年中出现的唯一 unikernel,尽管它可能是探索
在频谱的另一端,OSv2 和 rump kernels9 为现有应用程序提供了一个兼容层,并弱化了指导 MirageOS 的编程模型改进和类型安全。Drawbridge 项目16 将 Windows 转换为 libOS,据报道每个应用程序仅有
最终,公共云应该像今天支持 Linux 和 Windows 一样,将所有这些新兴项目作为
MirageOS 的努力是巨大的,如果没有多个来源的智力和财政支持,就不可能实现。Richard Mortier、Thomas Gazagnaire、Jonatham Ludlam、Haris Rotsos、Balraj Singh 和 Vincent Bernardoff 的核心团队辛勤工作,帮助我们构建
这项工作主要由 Horizon Digital Economy Research、RCUK 资助 EP/G065802/1 支持。一部分由 DARPA(国防高级研究计划局)和 AFRL(空军研究实验室)根据合同
MirageOS 可在 http://openmirage.org 免费获得。我们欢迎反馈、补丁以及使用它的不可思议的特技。
1. Barham, P., Dragovic, B., Fraser, K., Hand, S., Harris, T., Ho, A., Neugebauer, R., Pratt, I., Warfield, A. 2003. Xen and the art of virtualization. In Proceedings of the 19th Symposium on Operating Systems Principles
2. Cloudius Systems. OSv; https://github.com/cloudius-systems/osv。
3. Colp, P., Nanavati, M., Zhu, J., Aiello, W., Coker, G., Deegan, T., Loscocco, P., Warfield, A. 2011. Breaking up is hard to do: security and functionality in a commodity hypervisor. In Proceedings of the 23rd Symposium on Operating Systems Principles (SOSP)
4. Crowcroft, J., Madhavapeddy, A., Schwarzkopf, M., Hong, T., Mortier, R. Unclouded vision. In Proceedings of the International Conference on Distributed Computing and Networking (ICDCN) 29-40.
5. Eisenstadt, M. My hairiest bug war stories. 1997. Communications of the 40(4)
6. Engler, D. R., Kaashoek, M. F., O'Toole, Jr., J. 1995. Exokernel: an operating system architecture for
7. Eriksen, M. 2013. Your server as a function. In Proceedings of the Seventh Workshop on Programming Languages and Operating Systems (PLOS): 5:1-5:7.
8. Galois Inc. The Haskell Lightweight Virtual Machine (HaLVM) source archive; https://github.com/GaloisInc/HaLVM。
9. Kantee, A. 2012. Flexible operating system internals: the design and implementation of the anykernel and rump kernels. Ph.D. thesis, Aalto University, Espoo, Finland.
10. Leslie, I. M., McAuley, D., Black, R., Roscoe, T., Barham, P. T., Evers, D., Fairbairns, R., Hyden, E. 1996. The design and implementation of an operating system to support distributed multimedia applications. IEEE Journal of Selected Areas in Communications 14(7)
11. Madhavapeddy, A., Ho, A., Deegan, T., Scott, D., Sohan, R. 2007. Melange: creating a "functional" Internet. SIGOPS Operating Systems Review 41(3)
12. Madhavapeddy, A., Mortier, R., Crowcroft, J., S. Hand, S. 2010. Multiscale not multicore: efficient heterogeneous cloud computing. In Proceedings of -BCS Visions of Computer Science. Electronic Workshops in Computing, Edinburgh, UK.
13. Madhavapeddy, A., Mortier, R., Rotsos, C., Scott, D., Singh, B., Gazagnaire, T., Smith, S., Hand, S., Crowcroft, J. 2013. Unikernels: library operating systems for the cloud. In Proceedings of the 18th International Conference on Architectural Support for Programming Languages and Operating Systems (ASPLOS):
14. Minsky, Y. 2011. OCaml for the masses. Communications of the 54(11)
15. Mortier, R., Madhavapeddy, A., Hong, T., Murray, D., Schwarzkopf, M. 2010. Using dust clouds to enhance anonymous communication. In Proceedings of the 18th International Workshop on Security Protocols (IWSP).
16. Porter, D. E.,
17. Scott, D., Sharp, R., Gazagnaire, T., Madhavapeddy, A. 2010. Using functional programming within an industrial product group: perspectives and perceptions. In Proceedings of the 15th SIGPLAN International Conference on Functional Programming (ICFP):
18. Vinge, V. 1992. A Fire Upon the Deep. New York, NY: Tor Books.
19. Watson, R. N. M. 2013. A decade of OS
20. Weeks, S. 2006.
在符合以下条件的情况下,特此授予为个人或课堂使用而复制本作品的数字或硬拷贝的许可,无需任何费用:副本不得为营利或商业优势而制作或分发;副本必须带有本声明和第一页的完整引用。否则,若要复制、再版、张贴在服务器上或再分发到列表,则需要事先获得具体许可和/或支付费用。
喜欢还是讨厌?请告诉我们 [email protected]
Anil Madhavapeddy 是剑桥大学系统研究小组的高级研究员。他是开发 Xen 虚拟机监控程序和
Dave Scott 是 Citrix Systems 的首席架构师,他在那里从事 XenServer 虚拟化平台的工作。Dave 的主要重点是通过利用
© 2013
最初发表于 Queue 第 11 卷,第 11 期—
在 数字图书馆 中评论本文
Marc Brooker, Ankush Desai - AWS 系统正确性实践
构建可靠且安全的软件需要一系列方法来推理系统正确性。除了行业标准测试方法(例如单元测试和集成测试)之外,AWS 还采用了模型检查、模糊测试、基于属性的测试、故障注入测试、确定性模拟、基于事件的模拟以及执行跟踪的运行时验证。形式化方法一直是开发过程的重要组成部分——也许最重要的是,形式化规范作为测试预言,为 AWS 的许多测试实践提供正确的答案。正确性测试和形式化方法仍然是 AWS 的关键投资领域,这些领域已经看到的投资回报加速了这一趋势。
Achilles Benetopoulos - 数据中心计算机的中间表示
我们已经达到了分布式计算无处不在的地步。内存应用程序数据大小正在超过单台机器的容量,因此需要将其分区到集群中;在线服务具有高可用性要求,这只能通过将系统部署为多个冗余组件的集合来满足;高持久性要求只能通过数据复制来满足,有时跨越广阔的地理距离。
David R. Morrison - 模拟:分布式系统中未充分利用的工具
模拟在人工智能系统的出现中发挥着巨大作用:我们需要一种高效、快速且经济高效的方式来训练人工智能代理在我们的基础设施中运行,而模拟绝对提供了这种能力。
Matt Fata, Philippe-Joseph Arida, Patrick Hahn, Betsy Beyer - 公司到云端:谷歌的虚拟桌面
超过四分之一的 Googler 使用内部、数据中心托管的虚拟桌面。这种本地产品位于公司网络中,允许用户从世界任何地方远程开发代码、访问内部资源和使用 GUI 工具。在其最显着的特性中,虚拟桌面实例可以根据手头的任务调整大小,具有持久的用户存储,并且可以在公司数据中心之间移动以跟随出差的 Googler。直到最近,我们的虚拟桌面都托管在使用名为 Ganeti 的本土开源虚拟集群管理系统的 Google 公司网络上的商用硬件上。今天,这项重要且对 Google 至关重要的工作负载在 GCP(Google Compute Platform)上运行。