Higress推出全新 WebAssembly (Wasm) 运行时,实现显著性能飞跃
Higress 切换到 WAMR 运行时,Wasm 插件性能显著增强
Higress 近日宣布,其 Wasm 插件的运行时已从 V8 成功切换到 WebAssembly Micro Runtime (WAMR),并在开启 AOT(Ahead-Of-Time)编译模式后,实现了显著的性能提升。据测试数据显示,大部分插件的平均性能提升了约 50%,而对于逻辑复杂的插件,其性能甚至实现了翻倍增长。
Higress Wasm 插件:云产品网关的革新
作为首个引入 Wasm 扩展能力的云产品网关,Higress 自 2022 年起便上线了 Wasm 插件市场。Wasm 技术作为 Higress 的主要网关扩展手段,为用户带来了诸多独特价值:
1. 工程可靠性:Wasm 可基于多种静态类型语言编译,支持编译期检查,有效避免运行时错误,确保生产环境的稳定运行。
2. 沙箱安全性:Wasm 插件在严格的虚拟机沙箱环境中运行,拥有独立内存空间,有效抵御了因插件代码漏洞导致的缓冲区溢出、远程代码执行等攻击。
3. 热更新:基于 Envoy 的 xDS 机制,Higress 实现了插件二进制和配置的独立热更新,无需中断现有连接,对 WebSocket/gRPC 等业务场景尤为友好。
Higress 赋能 Wasm 插件机制
在 Istio/Envoy 的基础上,Higress 为 Wasm 插件机制增添了以下核心能力:
1. 域名/路由级生效:相较于 Istio/Envoy 的全局生效方式,Higress 允许基于 Wasm sdk 开发的插件在特定域名或路由级别生效,同时保持与 Istio/Envoy 生态的兼容性。
2. Redis 访问能力:通过提供 Redis 访问的 Host Function,插件代码可以基于 Redis 实现多种功能,如全局限流、Session 状态管理等。
3. 虚拟机自愈机制:插件代码中的异常(如空指针访问、数组越界、内存泄漏等)将被运行时系统捕获,不会导致网关崩溃。Higress 支持 Wasm 模块异常后的自动重启,并通过告警通知用户异常代码堆栈。
Wasm 插件技术的企业采纳
从 Higress 的企业用户反馈来看,Wasm 插件技术的采纳已经越过了鸿沟,步入了早期大众阶段。这一趋势的核心驱动力在于性能提升带来的成本降低。用户通过 Wasm 插件开发满足特定业务需求的功能,将鉴权、加解密、会话管理等逻辑卸载至网关层面处理,从而全局降低了计算成本。
Higress 中的 Wasm 运行时升级:从 V8 到 WAMR
Higress 在对 Wasm 运行时进行深度优化时,决定将原有的 V8 引擎替换为 WAMR,这一举措显著提升了 Wasm 插件的性能。
Wasm 运行时升级的背景
Wasm(WebAssembly)技术最初是为浏览器环境设计的,旨在提供一种安全、高效、可移植的二进制代码执行方式。作为 Chromium 浏览器的 JS 引擎,V8 引擎早期便支持了 Wasm,并基于 JIT(即时编译)模式运行 Wasm 模块,这确保了良好的性能表现。然而,随着技术的不断发展,V8 也逐渐暴露出一些与 Wasm 相关的挑战。
V8 存在的问题
1. 项目复杂度高:V8 引擎的设计初衷是为了优化 JavaScript 的执行效率,因此其内部实现与 JS 处理逻辑紧密耦合。这种设计导致在 Wasm 的实现上也受到了 JS 引擎特性的影响。例如,早期 Envoy Wasm 插件中出现的一个 bug 就是由于 V8 为了优化 JS 执行内存而引入的指针压缩机制所导致的。这种高度的耦合性增加了代码的复杂性,并可能导致性能上的瓶颈。
通过切换到 WAMR,Higress 旨在解决 V8 存在的这些问题,并进一步提升 Wasm 插件的性能和稳定性。
V8 与 Envoy 社区协作不足与客户端偏好问题
2. V8 与 Envoy 社区协作的局限性:目前,Envoy 项目对于 V8 的版本依赖较为陈旧,仍停留在2022年的某个提交上。这导致Envoy无法及时享受到V8后续版本中引入的如Wasm GC(垃圾收集)等新特性。考虑到V8项目本身的复杂性,升级其依赖版本面临着较高的风险和挑战。
3. 客户端优先的V8生态:V8的用户和开发者群体主要聚焦于客户端环境,他们在设计和优化时更多考虑的是设备兼容性和JIT(即时编译)模式的性能。虽然AOT(预编译)模式在某些场景下能够带来性能提升,但V8在AOT模式下的优化相对有限,无法完全发挥Wasm的性能优势。
WAMR 的显著优势
WAMR,作为一个由Intel团队发起的、在字节码联盟(Bytecode Alliance,专注于Wasm软件生态的非盈利组织)下广受欢迎的WebAssembly运行时开源项目,已经吸引了来自Intel、小米、亚马逊、索尼、Midokura、西门子、蚂蚁等众多公司的工程师积极参与。
WAMR以C语言为基础开发,具有出色的平台适应性。它支持多种运行模式,包括解释模式、即时编译和预编译模式,以灵活适应不同的使用场景。在性能上,WAMR表现卓越,多个公开的性能测评报告都验证了其高效的性能。同时,WAMR的资源开销极低,能够在仅100KB的内存中运行单个Wasm实例,这使其在资源受限的环境中尤为适用。
性能测试对比
一、测试环境
压测工具:k6
服务器 CPU:Intel(R) Xeon(R) Platinum 8369B CPU @ 2.90GHz
二、测试方法
在测试中,我们使用了Higress来启动2个worker线程,并通过k6工具来模拟固定的负载压力,确保两个线程在压测期间能够充分运行。
三、测试内容
为了全面评估Higress的性能表现,我们选取了部分Higress插件进行了详细的性能测试,以下是具体的测试情况:
注:表格中的数据为单请求平均附加延时
整体来看,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
性能提升原因
性能得到显著提升的主要原因有以下几点:
深度优化的预编译能力:WAMR 提供了一种深度优化的预编译机制。在部署前,它将 Wasm opcodes 转化为中间表示(IR),并通过定制的优化流水线生成特定平台的机器码。因此,在运行时,执行预编译后的 Wasm 程序能够达到接近原生二进制(native binary)的性能水平。
高度优化的外部函数接口(FFI):WAMR 采用了高度优化的 FFI,有效减少了在宿主环境(host,如 c/c++)和来宾环境(guest,如 wasm)之间切换时所需的类型转换和内存拷贝次数,从而降低了不必要的性能损耗。
智能硬件加速利用:WAMR 能够智能地感知平台的硬件加速能力并充分利用这些能力。例如,在 X86 平台上,WAMR 实现了学术界最新提出的 "segue" 算法,通过利用 GS 寄存器作为寻址方法,显著提高了访问 Wasm 线性空间的效率。
未来展望
在 Higress 团队与 WAMR 团队的紧密协作下,我们不仅致力于在网关场景中提升 Wasm 插件的性能,还计划发布一系列实用的新特性。敬请期待以下更新:
1. 支持生成 CPU 火焰图:新功能将支持生成 CPU 火焰图,例如,以下是一个在 Wasm 插件中执行 fibonacci 递归时捕获的 CPU 火焰图示例。这一功能将帮助开发者更直观地分析性能瓶颈,优化代码执行效率。
2. 插件崩溃日志增强
WAMR 提供了增强的插件崩溃日志功能。当 Wasm 插件因逻辑问题导致崩溃时,插件日志中将自动打印完整的函数堆栈信息。此外,结合 WAMR 提供的 addr2line 工具,开发者可以迅速定位到源代码中的具体行号,从而更快速地定位和解决问题。
3. 资源占用监控
WAMR 增加了对 Wasm 插件模块的资源占用监控功能。通过此功能,开发者可以实时观测每个 Wasm 插件模块的 CPU 和内存占用情况,帮助识别性能瓶颈和潜在的资源泄露问题。
4. TypeScript 支持
为了提升开发效率和代码质量,WAMR 现在支持使用 TypeScript 编写 Wasm 插件。这一功能为开发者提供了完整的 TypeScript 语法支持,使编写和维护 Wasm 插件变得更加容易和高效。通过 TypeScript 的类型检查和代码自动补全等特性,开发者可以编写出更加健壮和可维护的 Wasm 插件代码。
Higress
网站开发
小程序开发
阅读排行
-
1. 几行代码就能实现Html大转盘抽奖
大转盘抽奖是网络互动营销的一种常见形式,其通过简单易懂的界面设计,让用户在游戏中体验到乐趣,同时也能增加商家与用户之间的互动。本文将详细介绍如何使用HTML,CSS和JavaScript来实现大转盘抽奖的功能。
查看详情 -
2. 浙江省同区域公司地址变更详细流程
提前准备好所有需要的资料,包含:房屋租赁合同、房产证、营业执照正副本、代理人身份证正反面、承诺书(由于我们公司其中一区域已有注册另外一公司,所以必须需要承诺书)
查看详情 -
3. 微信支付商户申请接入流程
微信支付,是微信向有出售物品/提供服务需求的商家提供推广销售、支付收款、经营分析的整套解决方案,包括多种支付方式,如JSAPI支付、小程序支付、APP支付H5支付等支付方式接入。
查看详情 -
4. 阿里云域名ICP网络备案流程
根据《互联网信息服务管理办法》以及《非经营性互联网信息服务备案管理办法》,国家对非经营性互联网信息服务实行备案制度,对经营性互联网信息服务实行许可制度。
查看详情 -
5. 微信小程序申请注册流程
微信小程序注册流程与微信公众号较为相似,同时微信小程序支持通过已认证的微信公众号进行注册申请,无需进行单独认证即可使用,同一个已认证微信公众号可同时绑定注册多个小程序。
查看详情