使用 Alinode PGO 优化 Node.js 函数冷启动

576次阅读  |  发布于2年以前

什么是 Alinode PGO

PGO(Profile Guided Optimization),是一种根据运行时 Profiling Data 来进行优化的技术。Alinode PGO 主要是通过执行一遍之后收集启动阶段的热点数据生成缓存文件,后续通过加载高效的缓存文件启动即可获得提升在 100% 到 200% 的用户代码冷启动优化效果。目前 Alinode 发行版本已经在阿里云函数计算自 Node.js 14 版本起提供,亦提供了该特性,在阿里云函数计算使用 Node.js 14 版本即可使用。

使用效果示例

我们以一个简单的测试程序来验证 Alinode PGO 的实际效果,下面是示例。该优化主要是提高用户代码加载的速度,下面示例加载了若干平时常用的 NPM 模块。

示例代码

require('eslint');
require('lodash');
require('midway');
require('webpack');
require('jsdom');
require('mysql2');
require('sequelize');

exports.handler = (event, context, callback) => {
  callback(null, {
    versions: process.versions
  });
}

普通冷启动

可以看到,未使用 PGO 并且在仅安装 Production 依赖的情况下,冷启动时请求执行时间达到 3069.39 ms。

PGO 优化冷启动

向现有的函数代码包增加 PGO 缓存文件,下图可以看到采用 PGO 缓存进行冷启动,时间降到了 1254.43 ms。约等于减少了 61% 的冷启动时间,提升 150% 左右。

PGO 优化冷启动进阶,仅使用 PGO 缓存启动

在大多数情况下,如果您的业务代码可控,所有模块依赖都已经在初始化阶段引入,也可以尝试只保留 PGO 缓存文件来启动(即删除 node_modules)。因为减少了至少一半的代码包大小以及减少了碎文件数量,这样会极大的降低代码包下载和代码包解压的时间,在类似真实情况的压测场景有所体现,下图 P50 到 P99 百分数指标都有较大比重的下降。

现有代码包附加 PGO 缓存:

只使用 PGO 缓存启动(删除 node_modules):

如何使用 - 通过 Serverless Devs

目前 Alinode 发行版本已经在阿里云函数计算自 Node.js 14 版本起提供,使用 Node.js 14 版本即可。另外也提供了函数计算 Serverless Devs 工具的插件,来帮助大家方便的尝试这一用户代码加速技术。目前该特性还是实验性与社区化口径提供,请充分测试后再用于实际环境。

插件地址及使用文档:https://github.com/midwayjs/pgo,其他环境也可以参考该插件的实现方式改造到自己的开发流程中。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8