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 缓存进行冷启动,时间降到了 1254.43 ms。约等于减少了 61% 的冷启动时间,提升 150% 左右。
在大多数情况下,如果您的业务代码可控,所有模块依赖都已经在初始化阶段引入,也可以尝试只保留 PGO 缓存文件来启动(即删除 node_modules)。因为减少了至少一半的代码包大小以及减少了碎文件数量,这样会极大的降低代码包下载和代码包解压的时间,在类似真实情况的压测场景有所体现,下图 P50 到 P99 百分数指标都有较大比重的下降。
现有代码包附加 PGO 缓存:
只使用 PGO 缓存启动(删除 node_modules):
目前 Alinode 发行版本已经在阿里云函数计算自 Node.js 14 版本起提供,使用 Node.js 14 版本即可。另外也提供了函数计算 Serverless Devs 工具的插件,来帮助大家方便的尝试这一用户代码加速技术。目前该特性还是实验性与社区化口径提供,请充分测试后再用于实际环境。
插件地址及使用文档:https://github.com/midwayjs/pgo,其他环境也可以参考该插件的实现方式改造到自己的开发流程中。
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8