性能调优与优化技术

使用 AWS Lambda 构建无服务器应用

Claudio Canales

Senior DevOps Engineer

性能 = 时延 + 成本

  • 计费按耗时。
  • 做性能调优也是降本。
  • 先测量,再调优。
  • 一次只改一处。

秒表与成本

使用 AWS Lambda 构建无服务器应用

时间花在哪儿

  • 初始化。
  • Handler 执行。
  • 等待外部调用的时间。

Init vs handler vs 外部调用

使用 AWS Lambda 构建无服务器应用

冷启动 vs 热启动

冷启动

  • Lambda 需要新环境。

热启动

  • 复用现有环境。
  • Handler 运行开销更小。

冷启动 vs 热启动时间线

使用 AWS Lambda 构建无服务器应用

Init 工作 vs handler 工作

  • 导入和全局设置在 init 中运行。
  • init 越重,冷启动越慢。
  • 指标中会显示 init 时长。

Init 与 handler 分工

使用 AWS Lambda 构建无服务器应用

在 warm 调用间复用客户端

  • 每次调用都创建客户端会重复开销。
  • 环境为 warm 时复用它。

全局客户端复用

使用 AWS Lambda 构建无服务器应用

代码范式:在 handler 外创建客户端

import boto3
sts = boto3.client("sts")
def handler(event, context):
    return sts.get_caller_identity()

客户端只创建一次

使用 AWS Lambda 构建无服务器应用

能缓存就缓存

  • 将数据保存在内存中。
  • 小型临时文件用 /tmp
  • 谨慎缓存,需时失效。

内存与 /tmp 缓存

使用 AWS Lambda 构建无服务器应用

保持依赖精简

  • 大型包加载更慢。
  • 删去未使用内容。
  • 依赖尽量小。

精简 vs 臃肿依赖包

使用 AWS Lambda 构建无服务器应用

合理记录日志

  • 过多日志增加成本和噪声。
  • 采用短小、结构化消息。
  • 便于搜索,助于追踪和调试。

日志量与信号

使用 AWS Lambda 构建无服务器应用

降低外部调用开销

  • 调用外部服务最慢。
  • 减少调用;可批量处理。
  • 设定超时,避免挂起。

最小化外部调用

使用 AWS Lambda 构建无服务器应用

内存也影响 CPU

  • CPU 随内存一起提升。
  • CPU 受限代码可更快完成。
  • 增加内存可缩短时长或降本。
  • 测试以找最佳值。

内存 -> CPU -> 更快运行

使用 AWS Lambda 构建无服务器应用

找到成本甜点区

  • 最优内存设置可使总成本最小。
  • 曲线先降后持平或回升。
  • 变更后重新测试。

成本 vs 内存曲线

使用 AWS Lambda 构建无服务器应用

用 CloudWatch 度量

  • 关注 Duration 与 Init duration。
  • 跟踪错误和限流。
  • 观察尾部时延(p95、p99)。

CloudWatch 性能指标

使用 AWS Lambda 构建无服务器应用

减少冷启动

  • 缩减 init 中的工作量。
  • 保持包体精简。
  • 复用昂贵的初始化。
  • 考虑预置环境。

冷启动优化清单

使用 AWS Lambda 构建无服务器应用

要点回顾

  • 明确时间花在哪里。
  • 复用客户端并谨慎缓存。
  • 调整内存会影响 CPU 与时长。
  • 每次变更都要度量。

性能要点

使用 AWS Lambda 构建无服务器应用

Passons à la pratique !

使用 AWS Lambda 构建无服务器应用

Preparing Video For Download...