Firecracker微虚拟机的工作原理
自2014年起,某中心通过AWS Lambda提供“无服务器”计算服务。客户无需管理服务器或根据需求波动调整容量,某中心自动进行资源调配,客户仅按实际使用量付费。
在构建Lambda初期,面临两种安全方案选择:一是容器化技术,速度快且资源高效,但客户间隔离性较弱;二是虚拟机方案,安全性更高但计算开销较大。由于安全始终是首要考量,最终选择基于传统虚拟机构建Lambda。
客户要求实现更快扩展、更低延迟及预置并发等高级功能。传统虚拟机无法满足这些需求,因此开发了Firecracker,并于2018年11月作为开源虚拟化平台发布。
Firecracker融合了硬件虚拟化安全性与容器资源效率及快速启动优势。在USENIX网络系统设计与实现研讨会(NSDI ‘20)上,团队发表了相关技术论文。
技术架构对比
- 容器方案(左图):代码直接访问操作系统核心功能(内核),通过沙盒层限制其他功能访问(图中“x”标识)实现安全隔离。
- 虚拟机方案(右图):为工作负载提供独立客户内核,通过硬件虚拟化功能实现隔离。
虚拟化监控器(VMM)优化
VMM负责设置虚拟化、管理内存和处理I/O(如网络连接与磁盘存储)。传统VMM复杂度接近完整操作系统,例如常用虚拟机监控器QEMU(与Linux内核虚拟机KVM配合使用)拥有超过140万行代码。
Firecracker的高效性源于其精简版VMM,仅包含5万行代码(较QEMU减少96%)。这使得能够为每个客户程序创建独立微虚拟机,形成简单而强大的安全模型。代码采用内置安全特性的Rust语言编写,单台服务器每秒可创建150个微虚拟机,同时运行数千个微虚拟机。
功能精简与性能优化
大幅缩减VMM规模导致功能相应减少。Firecracker未实现BIOS或PCI总线等传统设备,转而通过优化virtio接口与客户内核通信。传统虚拟化环境模拟程序预期运行的硬件行为,而virtio允许程序知晓自身运行于模拟环境,从而更好地配合虚拟机提升执行效率。
针对无服务器工作负载无需USB、显示器、扬声器等硬件特性的需求,直接剔除这些功能的支持。传统VMM需兼顾桌面与云用例,必须包含所有这些复杂性。
Firecracker目前支撑某中心Lambda服务,每月处理数百万客户的数万亿请求。
(图示说明:容器与虚拟机架构对比图,来源:Stacy Reilly)