1998年诞生的虚拟化技术的VM、2013年出现Docker容器技术和K8s,以及2019年开始走出浏览器Wasm,都是可以用来部署和建置云原生基础架构的根本技术,也都提供了一个沙盒般的独立软体执行环境,可以用来执行应用系统或程式。不过,这三者有很大的不同,尤其是Wasm技术,从一开始的技术创立目的,就和前两者截然不同。
Wasm技术发明之初,就是为了解决JavaScript效能问题,希望让浏览器中的Web应用能像桌面原生软体一样的高速执行。而VM技术是为了更善用硬体资源,让不同应用系统各自有自己完整的虚拟「实体主机资源」可用,而Docker则是为了解决应用程式相依性越来越复杂的挑战,想要让AP可以到处执行。
不过,从技术实作背后的核心概念,VM是将实体环境的复杂度封装到单一环境中,容器则是将AP的相依性复杂度,封装到单一环境中,这两者比较相似,但Wasm则是在浏览器环境中,创造一个Bytecode二进位执行格式的沙盒环境,来提高执行速度,技术实作的方向有很大的不同。但因浏览器本来就是一个与作业系统层隔离的独立执行环境,也格外讲究与实体资源的安全,以及浏览器内不同网页程式之间的隔离性,这就让Wasm先天带有类似容器的将可以封装AP复杂性的特色和隔离实体环境复杂度的特性。
Wasm档案为何远比虚拟机器、容器映像档小这么多?
因为技术实作的不同,VM等于模拟了一整个实体主机环境,有虚拟CPU、虚拟记忆体、虚拟储存,因此可以安装多套或大型的应用系统,映像档案大小也最大,光是安装一套作业系统,就可能需要好几GB。
而容器不需要作业系统,只需要执行程式码相关的必要元件,可取得记忆体资源、也可以配置本地端储存给容器专用。 容器常用来执行一只应用程式,一只微服务, 执行同样程式码的容器映像档大小比VM映像档小了不少,冷启动速度也快上许多。
Wasm同样不需要作业系统,目前也无法配置本地端储存,常用来执行一只应用、一只程式或是一支元件。因为封装到Wasm的程式码,会经过编译处理成二进位格式档,而不是采取映像档的形式来载入,因此,同样功能程式码的Wasm档案,远比容器映像档格式小非常多。这也让Wasm的冷启动执行速度超短。
技术特性、映像档和执行档大小,也影响了这三类技术可以部署的环境。VM大多部署于公云环境、实体伺服器或是边缘主机,需要有一定硬体规格的设备上。而容器除了上述三类基础架构环境之外,也可部署到硬体规格较低阶的行动装置、边缘装置上。Wasm档案的硬体规格需求最低,虚拟机器和容器可部署的环境之外,甚至可以部署到小型边缘设备,IoT设备,甚至是IoT感测器上。
这三者技术目前也可以混用在同一个执行环境中,Docker公司早在2022年就宣布开始支援Wasm,可以让Docker容器的Runtime也能同时执行wasm档案,而微软则在去年发表了Hypervisor对Wasm的支援技术,可以在Hyperbisor平台上,同时支援虚拟机器、容器和Wasm,甚至可以混用这三者,不过,还只是技术预览功能。
Wasm冷启动速度可以比容器快上百倍
冷启动速度来说,虽然这个速度会受到执行程式码规模和复杂度的影响,但大概来比较,以执行同样功能的一只应用程式来说,Wasm是最快,甚至可以说超快。虚拟机器的冷启动速度,常见是数十分钟,可说是分钟级的冷启动速度,而容器则可以缩短到数十秒,甚至数秒内,可说是秒级的冷启动。
由于Wasm是经过编译后的Bytecode档案,几乎是载入就可以执行,再加上Wasm档案极小。因此可以做到毫秒等级的冷启动速度,这是千分之几秒的程度,就能开始一支Wasm应用。
对于开发语言的支援上,不论是在虚拟机器或是容器中,都需要该语言的runtime来执行,例如用了GO语言和Rust,就需要这两种与言的runtime才能执行。但是在wasm的做法不一样,经过事先编译,可以将不同语言编译成同样的Bytecode执行格式,因此,只需要一只wasm的runtime,就可以执行不同语言编译过的wasm档案,等于是用一只runtime通吃各种语言,甚至WASI提出的新元件模式,可以让不同程式语言的Wasm元件,彼此有一个标准的输入输出沟通方式,仿佛就像是用同一种语言开发的两只元件一样。不过,目前不是所有开发语言都能支援Wasm,不同语言的支援程度也不尽相同,以Go、JavaScirpt、C#、Rust语言的支援度相对完整且稳定。其余也有四、五十种语言提供部分程度的支援,使用时得留意支援度不足的地方。
若以用GPU来执行AI推论的功能来比较,除了AI推论的程式码之外,还需要Nvidiak的CUDA runtime,以及一套AI框架,像是PyTorch,光是这三者,最小的容器映像档大小就接近5GB,LLM基础模型的档案大小也动辄数GB,甚至数十GB,整个加起来,至少要有15GB,以前,容器问世时,常有人打趣说,VM太肥,所以需要容器来解决,但是,LLM推论需要的容器映像档也动辄是数GB或数十GB,就像是当年过于肥大的VM一样。
同样功能,若改用Wasm,自制推论程式码、CUDA runtime加上PyTorch框架和10GB的LLM基础模型,编译后可以大幅缩小到数MB,可以说比同样功能的容器或VM映像档,足足少了1千倍,这也正是Wasm冷启动速度可以超级快的原因。
后续报导请见:WebAssembly生态圈有哪些重要专案?Wasm生态地图重点剖析