Wasm 性能究竟如何 | Arm 上的容器运行时和 WasmEdge 基准测试

文摘   科技   2023-06-01 18:30   美国  

此文为 《Container Runtimes and WasmEdge benchmarking on Arm》 的翻译版本。原文发布在 Arm Community,作者为 Howard Zhang。

原文链接:https://community.arm.com/arm-community-blogs/b/infrastructure-solutions-blog/posts/container-runtimes-wasmedge-arm

本文章的翻译与传播已经获得许可。

这篇博客,我想介绍一些 Arm64 平台上的运行时。具体来说,对 WasmEdge 和 Runc 进行基准测试,展示 Wasm 与容器相比的优势。Arm 始终如一地为开源项目做出贡献。我们积极参与以下云原生项目,专注于在 Arm64 平台上启用、优化性能以及实施持续集成和部署。

Runtime

容器运行时是负责运行容器的软件。Runc 是应用广泛的运行时,Containerd 和 Docker 默认使用它。还有一些其他运行时,例如 Crun、Runsc 和 Kata 容器。运行时的职责有:

  • 消耗容器挂载点(mount point)
  • 使用容器元数据(也可以是手动制作的 config.json 用于测试)
  • 与内核通信以启动容器化进程(克隆系统调用)
  • 设置 cgroups、SELinux 策略、App Armor 规则

每个运行时都有自己的适应区域,例如轻量级应用程序或安全环境。

Kata 容器

Kata Container 是一个安全的容器运行时,它使用硬件虚拟化技术作为额外的防御层。这允许它提供更强大的工作负载隔离,同时仍然是轻量的,并且像常规容器一样运行。

图片来源 : https://katacontainers.io/learn/

此外,我们将默认的虚拟机监视器 (VMM) 从 Qemu 更改为 Cloud Hypervisor。与 Qemu 相比,Cloud Hypervisor 更加轻量和安全。这是因为 Cloud Hypervisor 具有最少的模拟设备,并且是用 Rust 实现的,从而避免许多常见的安全问题。

详情请参考

  • https://katacontainers.io/
  • https://www.cloudhypervisor.org/.

gVisor

gVisor 是一个用 Go 编写的应用程序内核,它实现了 Linux 系统调用接口的大部分。它在运行的应用程序和主机操作系统之间提供了额外的隔离层。它利用 KVM 来保持容器和主机之间内存和 CPU 的隔离。它还有一个应用程序内核,可以处理用户空间中的大多数系统调用,并且只有有限数量的系统调用会传递给主机内核。这减少了攻击面。

图片来源: https://gvisor.dev/blog/2020/04/02/gvisor-networking-security/

详情请参考:

  • https://gvisor.dev/

WasmEdge

WasmEdge 是一个轻量级、高性能和可扩展的 WebAssembly 运行时,适用于云原生、边缘和去中心化应用程序。

图片来源: https://wasmedge.org/book/en/use_cases/kubernetes.html

 WasmEdge 使用 WebAssembly 和 WASI。我不会深入介绍这两种技术,而是进行一般性介绍。

  • WebAssembly(缩写为 Wasm)是一种基于堆栈的虚拟机使用的、二进制指令格式。
  • 内存安全的沙盒执行环境
  • 程序语言,如 Rust、C 和 Golang,可以编译成兼容所有这些平台的 Wasm 二进制格式
  • WASI 是 WebAssembly 的模块化系统接口。Wasm 应用程序通过 WASI 与主机内核交互。

详情请参考

  • https://wasmedge.org/docs
  • https://github.com/WebAssembly/WASI
  • https://webassembly.org/

总的来说,与容器技术相比,Wasm 有几个优点。

  • 更小的二进制尺寸和内存足迹
    • 一些库可以在 Wasm 二进制文件之间共享。
  • 更快的启动时间
    • 没有一些容器技术的启动工作,比如创建命名空间、cgroup 等。
  • 减少主机内核的中继
    • 容器技术需要 namespace、cgroup、文件系统等,但 Wasm 不需要它们。

但是,作为一项不成熟的技术,它确实有一些缺点:

  • WASI 仅支持有限的系统调用,许多应用程序无法迁移到 Wasm
  • 安全性还有待验证
  • 许多导入功能仍未隐含。https://github.com/WebAssembly/proposals

这些优势使得 Wasm 非常适合 Serverless 和边缘计算,这些对镜像大小或启动时间敏感。

WasmEdge 和 Runc  之间的微基准测试

我们进行了三个基准测试,以说明 WasmEdge 相较 Runc 的优势,所有基准测试都在 Arm64 服务器上完成。以下是有关测试平台的一些信息。

CPUAmpere(TM) Altra(TM) Processor
kernel5.17.0
runc1.1.4
WasmEdge0.11.0

第一个测试验证普通 rust 二进制文件(由普通容器使用)和 Wasm 二进制文件之间的大小。以下是代码

fn main() { 
  println!("hello"); 

}  


普通的 Rust 二进制文件是 1.8MB,而 Wasm 二进制文件只有 0.8MB。

第二个测试是重复启动 helloworld 镜像,即 runc 和 WasmEdge 分别启动 1、10、100、500、1000 和 1500 次。正如你在第二张图片中看到的,Wasm 的启动时间约为普通容器的 25%。

第三个测试通过启动几个 helloworld 镜像并让它们休眠一段时间来并行运行,然后计算内存使用情况。正如你在第三张图片中看到的,1500 个 Wasm 的内存占用比 1500 个普通容器少 25%。

总结

在这篇博客中,我们简要介绍了运行时,并展示了 runc 和 WasmEdge 之间的镜像大小、启动时间和内存占用的基准测试。

下表总结了以下维度对运行时的评估:镜像大小,启动时间,安全性,应用程序开发难度,项目成熟度和适应环境。


runcKata/gVisorWasmEdge
镜像大小正常正常
开机时间正常
安全正常未知
App开发难度正常正常(容器内调试有问题)
项目成熟度
适应环境正常用量需要强隔离对启动时间或内存大小敏感

如果对这些运行时感兴趣,可访问它们的官方网站获取更详细的信息。

  • WasmEdge: https://wasmedge.org/
  • WebAssembly: https://webassembly.org/
  • Kata Containers: https://katacontainers.io/
  • Cloud Hypervisor: https://www.cloudhypervisor.org/.
  • gVisor: https://gvisor.dev/

关于 WasmEdge

WasmEdge 是轻量级、安全、高性能、可扩展、兼容OCI的软件容器与运行环境。目前是 CNCF 沙箱项目。WasmEdge 被应用在 SaaS、云原生,service mesh、边缘计算、边缘云、微服务、流数据处理等领域。

 ✨ GitHub:https://github.com/WasmEdge/WasmEdge
 💻 官网:https://wasmedge.org/
 👨‍💻‍ Discord 群:https://discord.gg/U4B5sFTkFc
  文档:https://wasmedge.org/book/en

点击阅读原文,查看原文

Second State
Rust 函数即服务
 最新文章