IT 论文精读 · PAPER 67

Firecracker:给 serverless 用的轻量虚拟化

Agache 等 · Amazon Web Services · NSDI 2020

EN →

这篇论文干了什么?

现在有一类叫「云函数」的服务:你只上传一小段代码,不用管服务器,有人调用时它才跑起来、按毫秒计费,AWS Lambda 是其中最大的一家。2020 年亚马逊发论文公开了 Lambda 底下真正跑你代码的那个东西——Firecracker,一台被削到只剩骨架的虚拟机。它让同一台物理机能同时装下成千上万个互不信任的客户的代码,每一台还能在八分之一秒内开机。

先说个两难

把陌生人的代码放进自己机器里跑,历来要在安全和快之间选一个。

传统虚拟机很安全——它给每位客人发一整台「假电脑」,客人在里面折腾不出来。代价是开机要好几秒、还得占掉几百 MB;为了一个只跑 20 毫秒的函数这么干,太荒谬。

另一头是容器:不发假电脑,所有客人合用同一个操作系统,只是各自关在自己房间里,轻且开机只要毫秒。可房间的墙就是「同一个操作系统」,而它对外开着三百多个入口,历史上被撬开过不止一次。让互不信任的陌生人合用一个操作系统,亚马逊不敢。过去大家默认:只能二选一。

那个点子

Firecracker 的点子是去质问这个默认:虚拟机慢,到底慢在哪?

答案是——不慢在「隔离」,而慢在它太想当一台真电脑。通用虚拟机为了「装什么系统都能跑」,忠实地伪造了一整台 PC:开机自检、光驱软驱、声卡显卡、USB 口、一整条插槽总线……客人开机时得把这一柜子假硬件逐个点名清查,几秒钟就花在这上头。可云函数要跑的只是「一段代码」,不是「任意一台古董电脑」。那就把假电脑削成只剩必需的几件。

削成了什么样

Firecracker 发给每位客人的「电脑」上只剩四样:一块网卡、一块硬盘、一根用来吐日志的线,以及一个只有一个按键的键盘——那个键是关机。没有开机自检,没有插槽总线,连开机画面都没有:它直接把操作系统搬进内存,从第一条指令开始跑。

就像胶囊旅馆不再给每间房配厨房、车库和花园,只留床、门锁和水电——客人要的本来就只是睡一晚。房间小,一层楼塞得下几千间;打扫得快,退房到下一位入住只要一眨眼。

还有两件事顺手一起做了。一是换建材:这个「发房间」的程序用一门不容易写出漏洞的语言重写,总共约五万行代码,而老牌同类软件有上百万行——代码少,能被撬的缝就少。二是房门外再加一道锁:万一真有人钻出了房间,落脚处也不是走廊,而是一个提前被剥光权限的小铁笼。

带来了什么

每台这样的「微型虚拟机」额外只多花不到 5 MB 内存,从创建到跑上客户代码约 125 毫秒,一台机器每秒能造出 150 台。于是同一台物理机上可以密密麻麻住满不同客户的函数,谁也碰不到谁——安全和快,不必二选一了。它 2018 年开源,如今 Lambda 与 Fargate 都跑在上面。

诚实说一句代价:这台电脑太特化——没有显卡、没有扩展插槽,需要这些的活它干不了。

一句话记住

虚拟机又慢又重,不是因为隔离贵,而是因为它假装自己是一台什么都有的真电脑。把假硬件削到只剩网卡、硬盘、一根日志线和一个关机键,再用更稳的语言重写、外面套一层铁笼——隔离还是虚拟机级别的,开机却只要八分之一秒、每台只多占几 MB。云函数的「又安全又便宜」,就是这么同时拿到的。

想看它的结构图、被否决的几条路线和实测数字? → 切到精读版