Higress 全新 Wasm 运行时,性能大幅提升(二)

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: WAMR 是最早由 Intel 团队开发,在字节码联盟(Bytecode Alliance,面向 Wasm 软件生态的非盈利组织)下的一个广受欢迎的 WebAssembly 运行时开源项目。

Wasm 运行时升级:从 V8 到 WAMR
V8 存在的问题
Wasm 技术诞生于浏览器场景,作为 Chromium 的 JS 引擎,V8 是最早支持 Wasm 的运行时之一,V8 引擎基于 JIT 模式运行 Wasm 模块,有着很好的性能。但也存在以下问题:

  1. V8 项目复杂度很高:Wasm 相关实现跟 JS 处理逻辑有较多耦合,比如早期的 Envoy Wasm 插件的一个 bug 就是 V8 为优化 JS 执行内存引入指针压缩导致。

bug: https://bugs.chromium.org/p/v8/issues/detail?id=12592

  1. V8 社区和 Envoy 社区之间缺少协作:Envoy 目前对于 V8 的版本依赖还停留在 2022 年的提交,无法支持 Wasm GC 等新特性,因为项目复杂度高,升级 V8 依赖的风险也很高。

  2. 客户端偏好:V8 的用户和开发者大多来自客户端,考虑设备兼容性,更重视 JIT 模式的优化,AOT 模式下性能提升不大,无法完全发挥 Wasm 性能优势。

WAMR 的优势
WAMR 是最早由 Intel 团队开发,在字节码联盟(Bytecode Alliance,面向 Wasm 软件生态的非盈利组织)下的一个广受欢迎的 WebAssembly 运行时开源项目。目前社区活跃的贡献者包含来自 Intel、小米、亚马逊、索尼、Midokura、西门子、蚂蚁等公司的工程师。WAMR 使用 C 语言开发,具有良好的平台适应性。支持解释模式、即时编译及预编译等模式运行 Wasm 模块,有着优良的性能,在多个公开性能测评报告中均表现优异,同时又极低的资源开销,可以在 100KB 内存中运行单个 Wasm 实例。

性能对比
压测工具:k6
服务器 CPU 型号:Intel(R) Xeon(R) Platinum 8369B CPU @ 2.90GHz
压测方式:Higress 启动 2 个 worker 线程,压测期间固定 k6 的压力,跑满两个线程
选取了部分 Higress 插件进行性能测试,情况如下:

插件名称 插件用途 V8
(ms) WAMR
(ms) 性能提升
bot-detect 基于正则识别阻止互联网爬虫对站点资源的爬取 1.25 0.64 95%
hmac-auth 基于HMAC算法为HTTP请求生成不可伪造的签名,
并基于签名实现身份认证和鉴权 4.44 3.25 36%
jwt-auth 基于JWT(JSON Web Tokens)进行认证鉴权 11.98 7.46 60%
jwt-logout 基于Redis实现JWT的弱状态管理,解决JWT无法登出的问题 14.08 8.44 66%
key-auth 基于 API Key 进行认证鉴权 1.66 1.16 43%
oauth 基于JWT进行OAuth2 Access Token签发 10.15 4.75 113%
注:表格中的数据为单请求平均附加延时

整体来看,Wasm 指令越复杂的插件,WAMR 的提升越明显。上述所有插件除 jwt-logout 是企业版插件未开源以外,其余插件均可以在 Higress 开源仓库目录下查看对应源码实现:https://github.com/alibaba/higress/tree/main/plugins/wasm-cpp/extensions

编译生成 AOT 文件,可以使用 wamrc 这个 WAMR 提供的官方编译工具:wamrc --invoke-c-api-import -o plugin.aot plugin.wasm。

为了生成的 wasm 文件可以兼容 JIT 模式,使用 WAMR 仓库下的脚本生成合并文件:python3 wasm-micro-runtime/test-tools/append-aot-to-wasm/append_aot_to_wasm.py --aot plugin.aot --wasm plugin.wasm -o plugin.aot.wasm

以提升最大的 oauth 插件为例,可以使用下述配置进行复现:

k6 压测命令:k6 run --vus 300 ./script.js --duration 60s

k6 压测脚本:

import http from 'k6/http';
import { check } from 'k6';

export default function () {
const res = http.get('http://11.164.3.16:10000/',{headers: {'Authorization':'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6ImFwcGxpY2F0aW9uL2F0K2p3dCJ9.eyJhdWQiOiJ0ZXN0MiIsImNsaWVudF9pZCI6Ijk1MTViNTY0LTBiMWQtMTFlZS05YzRjLTAwMTYzZTEyNTBiNSIsImV4cCI6MTY2NTY3MzgyOSwiaWF0IjoxNjY1NjczODE5LCJpc3MiOiJIaWdyZXNzLUdhdGV3YXkiLCJqdGkiOiIxMDk1OWQxYi04ZDYxLTRkZWMtYmVhNy05NDgxMDM3NWI2M2MiLCJzY29wZSI6InRlc3QiLCJzdWIiOiJjb25zdW1lcjEifQ.LsZ6mlRxlaqWa0IAZgmGVuDgypRbctkTcOyoCxqLrHY'}});
check(res, { 'status was 200': (r) => r.status == 200 });
}
envoy 配置片段:

              - name: envoy.filters.http.wasm
                typed_config:
                  "@type": type.googleapis.com/envoy.extensions.filters.http.wasm.v3.Wasm
                  config:
                    name: "my_plugin"
                    configuration:
                      "@type": "type.googleapis.com/google.protobuf.StringValue"
                      value: |
                        {
                            "consumers": [
                                {
                                    "name": "consumer1",
                                    "client_id": "9515b564-0b1d-11ee-9c4c-00163e1250b5",
                                    "client_secret": "9e55de56-0b1d-11ee-b8ec-00163e1250b5"
                                }
                            ],
                            "clock_skew_seconds": 3153600000
                        }
                    vm_config:
                      runtime: envoy.wasm.runtime.wamr
                      #runtime: envoy.wasm.runtime.v8
                      code:
                        local:
                         filename: "oauth.aot.wasm"
                      allow_precompiled: true

性能提升原因
主要的原因包含:

  1. WAMR 提供了深度优化的预编译的能力。在部署前,WAMR 将 Wasm opcodes 翻译为 IR,经过定制的优化流水线,生成指定平台的机器码。在运行时,执行预编译后的 Wasm 可以获得媲美 native binary 的性能。

  2. WAMR 采用了高度优化的 FFI。有效降低在 host(c/c++) 和 guest(wasm) 两个世界间“穿梭”时需要的类型转换和内存拷贝的次数,减少不必要的损耗。

  3. WAMR 可以智能感知平台的硬件加速能力并予以充分利用。比如当运行在 X86 平台时,WAMR 实现了学术界最新提出的 "segue" 算法,利用 GS 寄存器作为寻址方法,提升了访问 Wasm 线性空间的效率。

未来展望
在 Higress 团队和 WAMR 团队之间的紧密协作下,除了在网关场景提升 Wasm 插件性能,还带来了很多实用的新特性即将发布,敬请期待:

  1. 支持生成 CPU 火焰图,例如下面是 Wasm 插件中执行 fibonacci 递归看到的 CPU 火焰图:
  1. 支持 Wasm 插件中逻辑问题导致 Crash 后,插件日志中打印完整的函数堆栈,并可以通过 WAMR 提供的 addr2line 工具定位到源代码中的具体行号。

  2. 支持观测每个 Wasm 插件模块的 CPU 和内存占用情况。

  3. 支持使用 TypeScript 编写 Wasm 插件,完整语法支持。

欢迎更多开发者一起参与 Higress 和 WAMR 开源社区,GitHub 项目地址:

Higress:https://github.com/alibaba/higress

WAMR:https://github.com/bytecodealliance/wasm-micro-runtime

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
17天前
|
数据采集 Cloud Native Java
10 倍性能提升, GraalVM 应用可观测实践
本文介绍了 GraalVM 静态编译技术在云原生环境下的应用:ARMS 发布了支持 GraalVM 应用的 Java Agent 探针,可为 GraalVM 应用提供开箱即用的可观测能力。同时,文章还提供了使用 ARMS 对 GraalVM 应用进行可观测的详细步骤。
|
3月前
|
Prometheus 监控 Cloud Native
使用 Jenkins 监控和优化构建性能
【8月更文第31天】在软件开发的过程中,构建性能直接影响着开发效率和团队的生产力。一个快速、可靠的构建流程可以显著加快迭代速度,减少等待时间,使团队能够更快地响应变化。Jenkins 作为一款广泛使用的持续集成/持续交付(CI/CD)工具,提供了丰富的功能来帮助开发者监控和优化构建性能。本文将探讨如何利用 Jenkins 的内置工具和外部工具来监控构建性能,并提出一些具体的优化方案。
293 0
|
3月前
|
并行计算 算法 调度
自研分布式训练框架EPL问题之提高GPU利用率如何解决
自研分布式训练框架EPL问题之提高GPU利用率如何解决
|
3月前
|
测试技术 索引 CDN
hyengine wasm业务性能测试问题之测试设备如何解决
hyengine wasm业务性能测试问题之测试设备如何解决
|
5月前
|
缓存 PHP 数据库
提升PHP应用性能的关键技巧与最佳实践
在当今数字化快速发展的环境中,优化PHP应用程序的性能是开发人员不可忽视的重要任务。本文将探讨一些关键的技巧和最佳实践,帮助开发人员有效提升PHP应用的性能和响应速度。从代码优化到服务器配置,我们将深入分析如何在不同层面上优化PHP应用程序,以提供更好的用户体验和更高的效率。 PHP作为一种广泛应用于Web开发的编程语言,其性能优化对于保持应用的稳定性和响应速度至关重要。下面是几个关键的技巧和最佳实践,可以帮助开发人员提升PHP应用的性能。
55 2
|
5月前
|
边缘计算 安全 开发工具
探索未来计算的可能性:Wasmer — 高性能WebAssembly运行时
探索未来计算的可能性:Wasmer — 高性能WebAssembly运行时
209 2
|
6月前
|
人工智能 监控 开发者
阿里云PAI发布DeepRec Extension,打造稳定高效的分布式训练,并宣布开源!
阿里云人工智能平台PAI正式发布自研的 DeepRec Extension(即 DeepRec 扩展),旨在以更低成本,更高效率进行稀疏模型的分布式训练。
|
4月前
|
缓存 监控 测试技术
优化PHP应用性能的关键技巧与实践
提升PHP应用性能是开发者关注的重点之一,本文探讨了几种有效的优化技巧和实际应用策略,包括缓存策略的选择、代码优化建议以及服务器端配置的最佳实践,旨在帮助开发者有效提升PHP应用的运行效率和响应速度。【7月更文挑战第2天】
33 0
|
6月前
|
消息中间件 缓存 负载均衡
构建高性能的后端服务:优化策略与实践
在当今互联网时代,构建高性能的后端服务至关重要。本文将深入探讨如何通过优化策略与实践来提升后端服务的性能。我们将从数据库优化、缓存策略、异步处理和负载均衡等方面展开讨论,帮助开发者构建出稳定、高效的后端架构。
153 2
|
6月前
|
NoSQL Java Redis
Higress 全新 Wasm 运行时,性能大幅提升
在 Higress 将 Wasm 运行时从 V8 替换为 WAMR 后,Wasm 插件的性能对比之前又有了大幅提升。
46 2