继 2019 年开源 Midway 框架之后,阿里一直在 Node.js 的前沿进行深度研究,除了加入 TC39 参与标准化建设,向上游 Node.js 项目持续贡献,与龙蜥社区合作优化之外,也在 Serverless 领域有了不小的成果。
今天,向大家介绍我们最新的面向云原生场景,面向 Serverless 架构下的新产品, 代号 Noslate。
欢迎访问项目了解更多内容:Noslate
但随着云原生 /Serverless 等新架构概念的引导,弹性效率成为了全新的架构设计目标。为了能够让 JavaScript 任务拥有更高的弹性效率,进而满足在泛终端、全栈交付等领域的效率期待。我们逐步深入探索的过程中逐渐形成了 Noslate Project ,旨在提升云原生场景下 JavaScript 的被调度性能,解决诊断性黑盒问题。
Noslate 它主要由三个子项目组成,分别体现了我们在提升 Javascript 任务弹性效率过程中碰到的问题以及解决方式:
简而言之,Noslate 目标是通过提供完整的技术产品方案, 将 JavaScript 打造成云原生时代最灵活的交付语言。
一方面我们希望通过开源加强项目产品化程度;另一方面希望在社区中吸收更多的实践场景进而继续完善产品设计,也欢迎大家参与到项目中来。 同时,依托阿里云龙蜥社区和 Anolis 操作系统的合作关系,我们得以在底层探索,实现技术的演进。
提供 Web API 标准的 Web-interoperable JavaScript 运行时,适合不直接依赖系统接口的业务逻辑部署。Aworker 实现了近似 Service Worker API 的规范,提供了基本的 Request-Response 服务 API 。 因为提供了相比于 Node.js 的 API 更加高层次、抽象的定义,不会泄漏系统底层状态,Aworker 通过 Startup Snapshot 和 Warmfork 能力, 实现了更快的水平及垂直扩容,能够在毫秒级启动并处理流量,具备更高的弹性效率。
熟悉 Linux 系统编程的同学都知道 fork(2) 系统调用有几个优势:
对于 Node.js 来说,因为其无法在主线程持有所有多线程的状态 (如锁,信号量等),所以 Node.js 进行 fork 的修改难度很大。其多线程设计主要 来源于 libuv 库和 V8 Platform Worker 线程:
Node.js 的单进程多线程模型可以由下图表示:
而为了管理、隔离这些工作进程,我们设计了一个轻量的业务进程容器管理组件 Turf ,该组件能通过 Warmfork 方式创建新的 Aworker 服务进程,并能提供一定的资源、环境的隔离能力,同时兼容 OCI 。区别于传统 runc, rund 的容器,turf 旨在承载如 Aworker 这类轻 JS Runtime ,它无需镜像运行,开销更低,可以支持更高的部署密度。
Warmfork 具体的对比:
提供 "被复制" 的进程,称为 "种子进程",其他服务进程都是该进程的克隆。譬如 Aworker 作为种子进程,它需要确定自己一个 "可被克隆" 的时间点,将自己的所在状态(内存)作为克隆进程的初始状态。
Warmfork 的系统时序如下:
Warmfork 能实现了单机上服务进程的快速启动,而对于优化冷机启动加载速度,需要采用 Startup Snapshot 方案。 Startup Snapshot 和 CodeCache 的区别在于 Startup Snapshot 能够保存用户代码逻辑执行状态,而 CodeCache 只保存代码解析结果、仍然需要重新执行 用户代码逻辑。
设计上,Startup Snapshot 可提供携带用户代码逻辑的快速恢复,但是也有局限性:
V8 的 Startup Snapshot Serializer 就是一个类似于 GC 的对象遍历器。这个遍历器通过遍历加入到 Snapshot 中的 Root 对象,遍历它所对应的对象图并按照对象关系生成一系列的反序列化指令。
Startup Snapshot 相当于从 V8 Context 对象与它的 globalThis 开始,遍历堆中所有的对象并将对象关系与引用序列化成 特有的字节码,形成一个线性的可存储状态。并在恢复时,解释执行这些字节码,恢复堆中的对象内容与他们之间的引用关系。
Noslate Container Deamon ,作为 Noslate Workers 解决方案的核心管控程序,提供了实例调度、弹性扩缩容、配置管理、流量管理等能力。
基于健壮性考虑,它由两个角色组成:控制面( Control Plane )、数据面( Data Plane )
当流量进入 Data Plane 后,如果没有能够处理请求的 Worker 实例,会通过 requestQueueing 事件通知 Control Plane ,它会根据当前水位决定扩容数量,如果当前已无法创建 Worker 实例,会返回资源上限报错。新的 Worker 实例启动后,会自动连接到 Data Plane ,Data Plane 发现新的 Worker 实例连接后会主动触发初始化请求,初始化成功后开始消费请求队列里堆积的请求。
当 Worker 实例闲置一段时间后,Control Plane 会主动发起 GC 操作,告知 Data Plane 关闭流量,流量关闭后,Control Plane 会通知 Turf 关闭 Worker 实例,清理资源残留。
针对特定的灵活场景,一次性的轻量用户脚本执行(比如特别高密度的混部执行二方任务如 SSR ),为了隔离不同请求间的上下文,可以针对每个请求创建一个实例,并在执行后销毁。
为了更好的解决问题而不是造轮子,在未来的几个月 Noslate Debugger 也会和国内社区 Node.js 稳定性领域优秀的开源软件 Easy Monitor 共建整合,在 Node.js/V8 的问题诊断领域形成合力,也是值得期待的事情。
Serverless 应用通常会使用大量生命周期短、规格小的任务实例,但在此类任务实例上获得调试诊断能力并不容易,这使得 Serverless 应用长期处于较为黑盒的窘境。比如,Inspector 需要稳定和长时的网络连接、运行时 Heap Snapshot 需要较多的计算和内存资源,都是和 Serverless 架构背道而驰的。
不管是 V8 的对象还是堆快照,它都是 "信息" 在内存中的存储,而 Inspector 功能就是可以在 "运行时" 能提取这些信息。Noslate Debugger 通过 Corefile 将这部分调试诊断能力转移到了离线时进行,让原有实时性要求高的在线诊断调试转化为只需简单文件上传即可集成使用。
在用户本地或云端服务上提供接近用户本地开发时的调试诊断体感:
Corefile (特指 GNU Corefile 格式) 主要记录的是 Node.js 进程的内存和寄存器转储(CoreDump: 内存到磁盘的过程)。所以它也是进程完整“信息”,被用于 Linux 系统应用 Crash(有损) 的调试载体,也可用于 GCore(无损) 产生进程快照用于离线分析。
对比原有线上 "堆快照" 对业务的影响长达数分钟,到只影响业务 RT 秒级(通过 GCore ),甚至只有几十毫秒 (通过 Arthur 工具)。Corefile 快照也不会有任何运行时的"添油加醋",所以它也适合那些还未被 GC 的对象定位,譬如诊断已经结束了的业务处理等。
Arthur 是 Noslate Debugger 中用于低影响获取 core 文件的工具,利用 fork 减少进程暂停时间,LZ4 压缩减少转储体积。带业务流量的线上环境抓取,业务影响 31.106 毫秒,Corefile 大小为 338 MB (进程原使用 1.44GB 物理内存)。
PGO ( Profile Guided Optimization ),是一种根据运行时 Profiling Data 来进行编译优化的技术,这里我们借鉴了这一概念。主要是通过执行一遍之后收集启动阶段的热点数据生成缓存文件,后续通过内存映射直接加载高效的缓存文件,即可获得提升在 100% ~ 200% 的用户代码冷启动优化效果。
Node.js 支持包括 x64 、arm64 等在内的多种架构。 但针对 ARM 芯片的快速发展,上游版本往往仅提供基础适配,缺少针对新指令集的优化,导致在 ARM 芯片上无法获得潜在的性能提升。当下主流云厂商大都提供了 ARM 架构、高性价比的运行环境。Noslate Node.js 发行版针对 ARM 等平台的优化可以让应用在这些架构上获得更高的性能和效率。
目前 Noslate Node.js 发行版已经在进行针对阿里云 Ampere 、阿里云倚天的定制优化,未来计划包括支持龙蜥社区中的其他架构。主要包括:zlib 特性优化、其他一些利用 SIMD 的性能提升都在 PR 合并和准别中。 上面是对 Noslate Project 的简单介绍,如果想要详细了解可通过下述方式:
感谢阿里巴巴集团内业务方的支持,同时还要特别感谢所有给本项目贡献过代码、一起探索过技术方向伙伴们(包括不限于 legendecas 、mariodu 、zhaolei0505 、XadillaX 、umuoy1 、oraluben 、hyj1991 等)。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.