Spring Boot Serverless 实战系列 | 性能调优
共 3368字,需浏览 7分钟
·
2022-01-23 05:01
点击上方蓝字关注我们
我将通过一系列文章,从架构,部署,监控、性能、安全等 5 个方面来分析 Serverless 平台运行 Spring Boot 应用的优劣。为了让分析更有代表性,我选择了 Github 上 star 数超过 50k 的电商应用 mall 作为示例。这是系列文章的第四篇, 本文向大家展示如何对 Serverless 应用进行性能调优。
实例启动速度优化
在之前的文章实战教程中,相信大家都感受到 Serverless 的便捷之美,只需上传代码包和镜像就能够轻松上线一个弹性高可用的 Web 应用。
但是它仍存在首次启动“冷启动延时”的问题,Mall 应用实例的启动大约 30 秒左右,用户会感受较长时间的冷启动延时,在这个“即时时代”应用程序响应慢多少会有些瑕不掩瑜。(“冷启动”是指函数服务于特定调用请求时的状态,当一段时间没有请求后,Serverless 平台则会回收函数实例;等到下一次再有请求时,系统会再次实时拉起实例,该过程称之为冷启动。)
对 mall-admin 服务发起请求,成功后查看 FC 控制台,我们能够看到相应的请求信息。注意关闭“仅查看函数错误”,这样才会显示所有请求。指标监控和调用链路数据收集会存在一定延时,如果没有显示,请等待一会再刷新。找到冷启动标记的请求,点击 “更多” 下的 “请求详情”。
调用链路会显示冷启动各个环节的耗时。冷启动包含以下几个环节:
代码准备(PrepareCode):主要是下载代码包或者镜像。由于我们已经启用了镜像加速功能,不需要下载全部的镜像,因此这一步的延时非常短。
运行时初始化(RuntimeInitialization):从启动函数开始,到函数计算(FC)系统探测到应用端口就绪为止。这中间包含了应用启动时间。在命令行执行 s mall-admin logs 查看相应的日志时间,我们也能看到 Spring Boot 应用的启动需要花大量的时间。
应用初始化(Initialization):函数计算提供了 Initializer 接口,用户可以将一些初始化逻辑放在 Initializer 中执行。
调用延时(Invocation):处理请求的延时,这个延时非常短。
从上述链路追踪图来看,实例启动时间是瓶颈,但是我们可以采取多种方式来优化。
1、使用预留实例
Java 类应用普遍会启动较慢。应用在初始化时,也需要和很多外部服务交互,耗时较长。这类流程是业务逻辑需要的,很难优化延时。因此函数计算提供了预留实例功能。预留实例的起停由用户自己控制,没有请求也会常驻在那,因此不会有冷启动的问题,当然用户需要为整个实例的运行付费,即便实例没有处理任何请求。
2、优化实例启动速度
延迟初始化
在 Spring Boot 2.2 及更高版本中,可以开启一个全局延迟初始化标志。这将提高启动速度,但代价是第一个请求的延迟时间可能变长,因为需要等待组件首次初始化。
SPRING_MAIN_LAZY_INITIATIALIZATION=true
关闭优化编译器
JAVA_TOOL_OPTIONS="-XX:+TieredCompilation -XX:TieredStopAtLevel=1"
s.yaml 中设置环境变量示例:
登录实例检查环境变量是否配置正确:
在实例详情页中点击“登录实例”。
注意:对于非预留实例,一段时间没有请求后,函数计算系统会自动回收实例。此时无法再登入实例(上面的实例详情页面中的登录实例按钮会变灰)。所以请执行调用后,在实例被回收之前尽快登录。
配置合理的实例参数
注意:请区分实例并发度和 QPS 的区别。
系统能够迅速统计实例并发度指标值进行扩缩容。CPU/Memory/Network/Load 等实例级别的指标通常是后台统计,需要花费数十秒的指标统计后才能进行伸缩,难以满足在线应用的弹性伸缩要求。
在各种条件下,实例并发度指标都能够稳定的反映系统负载高低。如果以请求延时作为指标,系统难以区分是实例过载导致延时变大,还是下游服务成为瓶颈导致延时变大。例如一个典型的 Web 应用,通常会访问 MySQL 数据库。如果数据库成为瓶颈,请求延时变大,此时扩容不但毫无意义,而且会压垮数据库,让情况更加恶化。QPS 和请求延时相关,也会有上述问题。
实例并发度作为伸缩依据虽然有上述优点,但用户常常并不知道该设置多大的实例并发度。我推荐按照下述流程确定合理的并发度:
将应用函数的最大实例数设置为 1,确保压测到单个实例的性能。 使用负载压测工具对应用进行压测,查看 tps 和请求延时等指标。
逐步调大实例并发度,如果性能仍然良好,则继续调大;如果性能不符合预期,则调小并发度。
文中网址汇总(可滑动)
Spring Boot:https://spring.io/projects/spring-boot
Mall:https://github.com/macrozheng/mall
Serverless Devs 安装文档:http://serverlessdevs.com/zhcn/docs/installed/cliinstall.html
函数计算:https://www.aliyun.com/product/fc
奖励看到最后的你:
# 点个在看,并在下方留言互动
# 然后,将截图发送至后台,试试手气?
# 本周互动奖品是“阿里云定制数据线”
# 本期礼品开奖时间1月25日