当 Knative 遇见 WebAssembly

Knative 是在 Kubernetes 基础之上的 Serverless 计算的技术框架,可以极大简化 Kubernetes 应用的开发与运维体验。在 2022 年 3 月成为 CNCF 孵化项目。Knative 由两个主要部分组成:一个是支持 HTTP 在线应用的 Knative Serving,一个是支持 CloudEvents 和事件驱动应用的 Knative Eventing。

Knative 可以支持各种容器化的运行时环境,我们今天来探索一下利用 WebAssembly 技术作为一个新的 Serverless 运行时。

从 WASM、WASI 到 WAGI

WebAssembly(简称 WASM)是一个新兴的 W3C 规范。它是一个虚拟指令集体系架构(virtual ISA),其初始目标是为 C/C++等语言编写的程序,可以安全和高效地运行在浏览器中。在 2019 年 12 月,W3C 正式宣布 WebAssembly 的核心规范成为Web标准, 大大推进了 WASM 技术普及。今天,WebAssembly 已经得到了 Google Chrome、Microsoft Edge、Apple Safari、Mozilla Firefox 等流浏览器的全面支持。而更加重要的是,WebAssembly 作为一个安全的、可移植、高效率的虚拟机沙箱,可以在任何地方、任何操作系统,任何 CPU 体系架构中安全地运行应用。

Mozilla 在 2019 年提出了 WebAssembly System Interface(WASI),它提供类似 POSIX 这样的标准 API 来标准化 WebAssembly 应用与文件系统,内存管理等系统资源的交互。WASI 的出现大大拓展了 WASM 的应用场景,可以让其作为一个虚拟机运行各种类型的服务端应用。为了进一步推动 WebAssembly 生态发展,Mozilla、Fastly、英特尔和红帽公司携手成立了字节码联盟(Bytecode Alliance),共同领导 WASI 标准、WebAssembly 运行时、工具等工作。后续微软,谷歌、ARM 等公司也成为其成员。

WebAssembly 技术仍然在持续快速演进中,2022 年 4 月,W3C 公布了 WebAssembly 2.0 的第一批公共工作草案,这也成为其成熟与发展的重要标志。

WASM/WASI 作为一种新兴的后端技术,具备的的原生安全、可移植、高性能,轻量化的特点,非常适于作为分布式应用运行环境。与容器是一个一个独立隔离的操作系统进程不同,WASM 应用可以在一个进程内部实现安全隔离,支持毫秒级冷启动时间和极低的资源消耗。如下图所示:

图片来源:cloudflare

目前 WASM/WASI 还在发展初期,还有很多技术限制,比如不支持线程,无法支持低级 Socket 网络应用等等,这极大限制了 WASM 在服务器端的应用场景。社区都在探索一个能够充分适配 WASM 的应用开发模型,扬长避短。微软 Deislabs 的工程师从 HTTP 服务器发展的历史中汲取灵感,提出了 WAGI - WebAssembly Gateway Interface 项目[1]。没错 WAGI 的概念就是来自于互联网的上古传奇,CGI。

CGI 是“公共网关接口”(Common Gateway Interface)的简称,是 HTTP 服务器与其它程序进行交互的一种规范。HTTP Server 通过标准输入、输出接口等与 CGI 脚本语言进行通信,开发者可以使用 Python/PHP/Perl 等各种实现来处理 HTTP 请求。

一个非常自然的推演,如果我们可以通过 CGI 规范来调用 WASI 应用,开发者就可以非常轻松地利用 WebAssembly 来编写 Web API 或者微服务应用了,而且无需在 WASM 中处理太多的网络实现细节。下图就是 CGI 与 WAGI 的概念架构图对比:

二者架构上高度相似,其不同之处是:传统 CGI 架构,每次 HTTP 请求会创建一个 OS 进程来进行处理,由操作系统的进程机制来实现安全隔离;而 WAGI 中 ,每次 HTTP 请求会在一个独立的线程来中调用 WASI 应用,应用之间利用 WebAssembly 虚拟机实现安全隔离。在理论上,WAGI 可以有比 CGI 更低的资源损耗和更快的响应时间。

本文不会对 WAGI 自身架构以及 WAGI 应用开发进行分析。有兴趣的小伙伴可以自行阅读项目文档。

进一步思考,如果我们可以将 WAGI 作为一个 Knative Serving 运行时,我们就可以建立起一座将 WebAssembly 应用于 Serverless 场景的桥梁。

WAGI 应用冷启动分析与优化

冷启动性能是 Serverless 场景的关键指标。为了更好了了解 WAGI 执行效率,我们可以利用 ab 做一个简单的压测:

$ ab -k -n 10000 -c 100 http://127.0.0.1:3000/...Server Software:
Server Hostname:        127.0.0.1
Server Port:            3000Document Path:          /
Document Length:        12 bytesConcurrency Level:      100
Time taken for tests:   7.632 seconds
Complete requests:      10000
Failed requests:        0
Keep-Alive requests:    10000
Total transferred:      1510000 bytes
HTML transferred:       120000 bytes
Requests per second:    1310.31 [#/sec] (mean)
Time per request:       76.318 [ms] (mean)
Time per request:       0.763 [ms] (mean, across all concurrent requests)
Transfer rate:          193.22 [Kbytes/sec] receivedConnection Times (ms)min  mean[+/-sd] median   max
Connect:        0    0   0.6      0       9
Processing:     8   76  29.6     74     214
Waiting:        1   76  29.6     74     214
Total:          8   76  29.5     74     214Percentage of the requests served within a certain time (ms)50%     7466%     8875%     9580%    10090%    11595%    12598%    13999%    150100%    214 (longest request) 

我们可以看到 P90 请求响应时间在 115ms,就这?这个和我们对 WASM 应用轻量化的认知不同。利用火焰图,我们可以快速定位到问题所在:prepare_wasm_instance 函数消耗了整体应用运行 80% 的时间。

经过对代码的分析,我们发现在每次响应 HTTP 请求过程中,WAGI 都要对已经编译过的 WSM 应用,重新连接 WASI 以及 wasi-http 等扩展和并进行环境配置。这消耗了大量的时间。定位了问题,解决思路就非常简单了,重构执行逻辑,让这些准备工作只在初始化过程中执行一次,无需在每次 HTTP 请求过程中重复执行。具体可参考优化过的实现[2]

我们重新运行一遍压力测试:

$ ab -k -n 10000 -c 100 http://127.0.0.1:3000/...Server Software:
Server Hostname:        127.0.0.1
Server Port:            3000Document Path:          /
Document Length:        12 bytesConcurrency Level:      100
Time taken for tests:   1.328 seconds
Complete requests:      10000
Failed requests:        0
Keep-Alive requests:    10000
Total transferred:      1510000 bytes
HTML transferred:       120000 bytes
Requests per second:    7532.13 [#/sec] (mean)
Time per request:       13.276 [ms] (mean)
Time per request:       0.133 [ms] (mean, across all concurrent requests)
Transfer rate:          1110.70 [Kbytes/sec] receivedConnection Times (ms)min  mean[+/-sd] median   max
Connect:        0    0   0.6      0       9
Processing:     1   13   5.7     13      37
Waiting:        1   13   5.7     13      37
Total:          1   13   5.6     13      37Percentage of the requests served within a certain time (ms)50%     1366%     1575%     1780%     1890%     2195%     2398%     2599%     27100%     37 (longest request)

在经过优化过的实现中,P90响应时间已经下降到 21ms,其中 prepare_wasm_instance 所占运行时间已经下降到 17%。整体冷启动效率有了很大的提升!

注:本文利用 flamegraph[3] 进行的性能分析。

利用 Knative 运行 WAGI 应用

为了让 WAGI 可以作为 Knative 应用运行,我们还需在 WAGI 上增加了对 SIGTERM 信号的支持,让 WAGI 容器支持优雅下线。具体细节不再赘述。

Knative 的环境准备可以参考 Knative 安装文档[4],利用 Minikube 创建本地测试环境。

注:前提是需要有一定的网络能力,因国内无法访问在 http://gcr.io 中的 Knative 镜像。

一个更加简单的方式是直接使用阿里云 Serverless 容器服务 ASK[5] 上 Serverless K8s 集群。ASK 内建了 Knative 支持[6],无需复杂的配置安装过程即可以开发和使用 Knative 应用。

首先我们利用 WAGI 来定义一个 Knative 服务:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:name: autoscale-waginamespace: default
spec:template:metadata:annotations:# Knative concurrency-based autoscaling (default).autoscaling.knative.dev/class: kpa.autoscaling.knative.devautoscaling.knative.dev/metric: concurrency# Target 10 requests in-flight per pod.autoscaling.knative.dev/target: "10"# Disable scale to zero with a min scale of 1.autoscaling.knative.dev/min-scale: "1"# Limit scaling to 100 pods.autoscaling.knative.dev/max-scale: "10"spec:containers:- image: registry.cn-hangzhou.aliyuncs.com/denverdino/knative-wagi:0.8.1-with-cache

其中:

  • 容器镜像 knative-wagi 包含了 WAGI 网关和一些示例的 WASI 应用,更多细节可以参考项目[7]
  • autoscale-wagi 服务可以根据请求数进行弹性伸缩
$ kubectl apply -f knative_test.yaml$ kubectl get ksvc autoscale-wagi
NAME             URL                                                LATESTCREATED           LATESTREADY            READY   REASON
autoscale-wagi   http://autoscale-wagi.default.127.0.0.1.sslip.io   autoscale-wagi-00002   autoscale-wagi-00002   True
$ curl http://autoscale-wagi.default.127.0.0.1.sslip.io
Oh hi world
$ curl http://autoscale-wagi.default.127.0.0.1.sslip.io/hello
hello world

大家也可以进行一些压测,学习一下 Knative 的弹性伸缩能力。

后记

本文介绍了 WAGI 这个项目,它可以将 HTTP 服务器的网络处理细节,与 WASM 应用逻辑实现解耦。这样可以轻松将 WASM/WASI 应用与 Knative 这样的 Serverless 框架相结合。一方面我们可以复用 Knative/K8s 带来的弹性和大规模资源调度能力,一方面我们可以发挥 WebAssembly 带来的安全隔离、可移植、轻量化等优势。

一脉相承的思考,在之前一篇文章《WebAssembly + Dapr = 下一代云原生运行时?》 中,我介绍了一个思路是将 WASM 应用与外部服务依赖通过 Dapr 实现解耦,来解决可移植性与多样化的服务能力之间的矛盾。

当然这些工作还是简单的玩具,只是用来验证技术的可能性边界。主要目的还是抛砖引玉,听到大家关于下一代分布式应用框架和运行时环境的思考和设想。

文章书写过程中,忽然回忆起在 90 年代与师兄们一起根据 RFC 规范来实现 HTTP Server 与 CGI Gateway 的岁月,那是一种非常简单而单纯的快乐。在这里,也祝每一位技术人永葆好奇,享受每一天的编程时光。

参考链接

[1] WAGI - WebAssembly Gateway Interface 项目:

https://github.com/deislabs/wagi

[2] 优化过的实现:

https://github.com/denverdino/wagi/tree/with_cache

[3] flamegraph:

https://github.com/flamegraph-rs/flamegraph

[4] Knative 安装文档:

https://knative.dev/docs/install/

[5] 阿里云 Serverless 容器服务 ASK:

https://www.aliyun.com/product/cs/ask

[6] Knative 支持:

https://help.aliyun.com/document_detail/121508.html

[7] 项目:

https://github.com/denverdino/knative-wagi

作者:易立

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6000字干货分享:数据中台项目管理实践分享

简介 阿里云数据中台是一个包含落地实施方法论、平台产品和技术服务的企业级解决方案。阿里云数据中台以Maxcompute等大数据计算平台为载体,以三个One为理论基础构成数据中台方法论,实现在一个平台里完成数据全生命周期的管理工作。 本文总结了企业级数…

关于程序员的职业操守,从《匠艺整洁之道》谈起

为什么程序员需要职业操守? 行业的壮大 这个问题还得从软件行业的发展说起。软件行业从诞生(1935)至今(2022),已经八十多年的历史了。 在这期间,整个软件行业有了巨大的发展: 从业…

面向长代码序列的 Transformer 模型优化方法,提升长代码场景性能

阿里云机器学习平台PAI与华东师范大学高明教授团队合作在SIGIR2022上发表了结构感知的稀疏注意力Transformer模型SASA,这是面向长代码序列的Transformer模型优化方法,致力于提升长代码场景下的效果和性能。由于self-attention模块的复杂度随序列长度呈次…

支持异构GPU集群的超大规模模型的高效的分布式训练框架Whale

近日,阿里云机器学习PAI关于深度学习模型高效的分布式训练框架的论文《 Whale: Efficient Giant Model Training over Heterogeneous GPUs 》被计算机系统领域国际顶级学术会议USENIX ATC22接收。 Whale是阿里云机器学习PAI平台自研的分布式训练框架,开…

深度揭秘阿里云函数计算异步任务能力

在上篇文章《解密函数计算异步任务能力之「任务的状态及生命周期管理」》中,我们介绍了任务系统的状态管理,并介绍了用户应如何根据需求,对任务状态信息进行实时的查询等操作。在本篇中我们将会进一步走进函数计算异步任务,介绍异…

月费 19 美元的 GitHub Copilot 企业版上线,你乐意买单吗?

近日,微软旗下的 GitHub 发布了 Copilot 企业版,推出了一个名为“Copilot for Business”的新计划。每个用户每月仅需 19 美元就能享受企业级服务。简单来说,支付月费的用户将享有简单的许可管理,管理员可以为其团队启用 GitHub C…

设计稳定的微服务系统时不得不考虑的场景

我们的生产环境经常会出现一些不稳定的情况,如: 大促时瞬间洪峰流量导致系统超出最大负载,load 飙高,系统崩溃导致用户无法下单“黑马”热点商品击穿缓存,DB 被打垮,挤占正常流量调用端被不稳定服务拖垮&a…

千万级可观测数据采集器 - iLogtail代码完整开源

2022年6月29日,阿里云iLogtail开源后迎来首次重大更新,正式发布完整功能的iLogtail社区版。本次更新开源全部C核心代码,该版本在内核能力上首次对齐企业版,开发者可以构建出与企业版性能相当的iLogtail云原生可观测性数据采集器。…

科普达人丨漫画图解什么是 eRDMA?

在一个领先的阿里云数据中心里,数百台服务器(也就是大型的计算机)在疯狂工作和通信,他们正在合力完成一个大型的大数据处理任务,每台服务器领到自己的小任务,算完之后,得把结果相互同步&#xf…

聚焦科技创新产业升级 中国联通和腾讯签署新战略合作协议

12月20日,中国联通和腾讯在“2022中国联通合作伙伴大会”上签署新一轮战略合作协议。双方将充分发挥资源和技术优势,聚焦科技创新、产业升级、网络安全等进行全方位合作,为数实融合高质量发展开辟新路径、提供新引擎,助力千行百业…

科普达人丨漫画图解 SGX 加密计算黑科技

01 从一场朋友圈的“赛富”说起 最近,小明买基金赚了不少钱,开始膨胀了,开始在朋友圈里晒豪车、晒爱马仕。小红表示不服,“最近买基金还能赚钱?肯定是P图凡尔赛。还是我买币赚得多。”炒鞋达人小孟就更不服&#xff0…

SysOM 案例解析:消失的内存都去哪了 !

在《AK47 所向披靡,内存泄漏一网打尽》一文中,我们分享了slab 内存泄漏的排查方式和工具,这次我们分享一种更加隐秘且更难排查的"内存泄漏"案例。 一、 问题现象 客户收到系统告警,K8S 集群某些节点 used 内存持续升高…

Windows 上玩转最新的 Android 13,微软悄悄在 GitHub 上官宣了!

整理 | 屠敏出品 | CSDN(ID:CSDNnews)操作系统领域有两大霸主,一个是移动端的 Android,一个自然是桌面端的 Windows。当有一天,两者在同一套系统上碰撞,将会擦除怎样的火花?想必不少…

Serverless 时代下微服务应用全托管解决方案

Serverless 时代下微服务发展与挑战 早期业务规模比较简单,大多团队开发采用单体应用,已经能够很好地满足团队的业务需求,并且能够快速迭代。但随着业务规模的不断增长,系统变得越来越复杂,单体应用逐渐无法满足线上生…

关于接口测试自动化的总结与思考

序 近期看到阿里云性能测试 PTS 接口测试开启免费公测,本着以和大家交流如何实现高效的接口测试为出发点,本文包含了我在接口测试领域的一些方法和心得,希望大家一起讨论和分享,内容包括但不仅限于: 服务端接口测试介…

最新Forrester Wave云计算报告:阿里云位居中国领导者、全球强劲者象限

近日,国际权威机构Forrester连续发布2022年全球和中国云计算市场Forrester Wave报告,在中国市场上,阿里云位居领导者象限,在市场表现、战略两大维度的评测中获评全项最高分;在全球报告中,阿里云位居强劲者象…

大促场景下,如何做好网关高可用防护

618 大促正在如火如荼进行中。《618大促来袭,浅谈如何做好大促备战》一文介绍了全方位保障大促高可用的方法论和技术手段,本文继续围绕网关,深入探讨大促场景下,如何做好网关高可用防护,将从以下几点逐一展开介绍&…

Java Agent 踩坑之 appendToSystemClassLoaderSearch 问题

从 Java Agent 报错开始,到 JVM 原理,到 glibc 线程安全,再到 pthread tls,逐步探究 Java Agent 诡异报错。 背景 由于阿里云多个产品都提供了 Java Agent 给用户使用,在多个 Java Agent 一起使用的场景下&#xff0…

消息队列 RabbitMQ 遇上可观测 - 业务链路可视化

本篇文章主要介绍阿里云消息队列 RabbitMQ 版的可观测功能。RabbitMQ 的可观测能力相对开源有了全面的加强,为业务链路保驾护航。消息队列 RabbitMQ 简介 阿里云消息队列 RabbitMQ 版是一款基于高可用分布式存储架构实现的 AMQP 0-9-1 协议的消息产品,兼…

你的 Sleep 服务会梦到服务网格外的 bookinfo 吗

作为业内首个全托管 Istio 兼容的阿里云服务网格产品 ASM,一开始从架构上就保持了与社区、业界趋势的一致性,控制平面的组件托管在阿里云侧,与数据面侧的用户集群独立。ASM 产品是基于社区 Istio 定制实现的,在托管的控制面侧提供…