容器镜像相比于代码包有更好的可移植性和更丰富的工具链生态,但其自带的与应用无关的数据极易使镜像臃肿,GB级镜像会导致分钟级冷启动。开启镜像加速后提速约90%,将分钟级的镜像拉取缩短至秒级。本文介绍使用ACR个人版实现镜像启动加速的使用原理等。
使用原理
对于运行环境为Custom Container且使用阿里云容器镜像服务ACR个人版的函数,函数计算默认为其开启镜像启动加速功能。每次创建或更新该类函数时,函数计算会扮演服务RAM角色,使用临时的AccessKey拉取镜像,并且转存至函数计算系统的加速镜像缓存服务中。转存结束后,函数中的自定义容器镜像启动速度将会得到显著提升。
注意事项
默认支持镜像加速的地域有华北2(北京)、华北3(张家口)、华东1(杭州)、华东2(上海)、华南1(深圳)、中国香港、新加坡、美国(硅谷)、美国(弗吉尼亚)和日本(东京)。
如果您同意使用镜像加速,则代表您同意并授权函数计算拉取您仓库内的镜像并转存至函数计算服务内部的加速缓存服务中。镜像数据将被加密,并且具备网络隔离和身份鉴权,以保证足够的数据安全性。请确保将镜像转存在函数计算系统内部存储服务的操作符合您所在机构的安全规范和指导。
创建或更新使用ACR个人版镜像的函数后,由于转存镜像也有一定的时间消耗,在加速镜像可用之前,该函数在函数计算控制台禁止使用。加速镜像通常会在创建或更新函数后5分钟内完成。
查看镜像加速准备状态
您可以通过以下任一方式查看镜像加速准备状态,来判断当前被加速的镜像是否可用。
在函数计算控制台的函数详情页面的函数配置页签,找到环境信息区域,即可查看镜像加速准备状态,取值如下:
准备中:对应
Preparing
。可用:对应
Ready
。失败:对应
Failed
。
示例如下:
调用GetFunction接口,根据返回的accelerationInfo的status参数判断当前镜像加速准备状态。主要的状态如下:
Preparing
:加速正在准备中,这时调用会使用没有加速效果的原始镜像。Ready
:加速完成,后续函数调用会有加速效果。Failed
:加速失败。
版本控制最佳实践
如果您使用了ACR个人版,更新函数镜像会触发新的加速镜像转存。在加速镜像可用前的一段时间内,函数调用会拉取原始镜像从而失去函数加速运行效果。对此,您可参照以下流程通过管理函数和管理版本的方式来体系化地发布函数:
更新函数,此时会连带更新服务的LATEST版本。
等待镜像加速准备状态从准备中状态至可用后,发布一个新的版本。
将别名切换到新的服务版本。
查看加速效果
示例项目puppeteer-pdf中提供了一个使用Node.js Express结合Puppeteer将网页转换成PDF的示例。
加速前,端到端耗时66.51s。加速后仅需4.3s,冷启动速度提升93.5%。示例代码如下:
time curl -H "x-fc-invocation-target: 2016-08-15/proxy/CustomContainerDemo/puppeteer-pdf-no-accl" https://$ACCOUNT_ID.$REGION.fc.aliyuncs.com/generate-pdf\?url\=http://example.com -o /tmp/fc-demo-puppeteer-pdf-no-accl.pdf
# Time spent: 0.06s user 0.09s system 0% cpu 1:06.51 total time
# 镜像加速后冷启动
curl -H "x-fc-invocation-target: 2016-08-15/proxy/CustomContainerDemo/puppeteer-pdf-accl" https://$ACCOUNT_ID.$REGION.fc.aliyuncs.com/generate-pdf\?url\=http://example.com -o /tmp/fc-demo-puppeteer-pdf-accl.pdf
# Time spent: 0.05s user 0.06s system 0% cpu 4.300 total time
在测试过程中可能存在误差,请以实际情况为准。