logo

故障排除

性能问题

虽然您可以通过 Vapor 驱动的 Laravel 应用程序实现极快的加载时间,但如果配置不当,您可能会遇到性能问题。

在本节中,我们将介绍 Vapor **最常见的基础设施性能技巧**,这些技巧可以提高您由 Vapor 驱动的 Laravel 应用程序的速度。在深入研究之前,请记住

  1. **首先优化您的应用程序**:通过使您的应用程序更快,您可能根本不需要进行任何基础设施更改。识别应用程序性能瓶颈,并尝试使用缓存、排队或数据库查询优化等简单技术来解决这些问题。

  2. **基础设施更改可能会影响您的 AWS 账单**:当然,为您的 Vapor 环境分配更多(或不同的)资源可能会导致您的 AWS 账单增加。因此,您可能需要研究这种更改的定价将如何影响您的 AWS 账单:aws.amazon.com/pricing

增加 memory 选项

Vapor - 通过 AWS Lambda - 按比例分配 CPU 能力给您的 Lambda 函数,该比例与为环境配置的内存量成正比。因此,增加内存可能会导致更好的性能,因为 Lambda 函数将有更多 CPU 能力来处理您的请求和排队的作业。

您可以使用 memoryqueue-memorycli-memory 选项分别在您的环境的 vapor.yml 配置中增加 HTTP Lambda 函数、队列 Lambda 函数或 CLI Lambda 函数的配置内存。

增加 warm 选项

如果您在规模化后遇到性能问题,这可能表明您的环境没有预先预热足够的容器。因此,一些请求会产生几秒钟的延迟,因为 AWS 会加载一个无服务器容器来处理请求。

为了缓解这个问题 - 通常称为“冷启动” - Vapor 允许您在 vapor.yml 文件中为环境定义一个 warm 配置值。warm 值表示 Vapor 将预热多少个无服务器容器,以便它们可以准备好处理请求。

使用“固定大小”数据库

无服务器数据库是自动扩展的数据库,没有固定的 RAM 或磁盘空间。但是,AWS 提供的“自动扩展”机制在您的环境需要更多数据库资源时,每次都会有长达几秒钟的冷启动时间。

为了缓解这个问题,请考虑使用“固定大小”数据库,其中资源已提前准备。您可以 创建“固定大小”数据库,使用 Vapor UI 或使用 database CLI 命令。

使用数据库代理

即使您的由 Vapor 提供支持的无服务器 Laravel 应用程序可以处理大量的网络流量,传统的关联数据库(如 MySQL)也会因连接限制而不堪重负并崩溃。

为了缓解这个问题,Vapor 允许使用 RDS 代理 来有效地管理您的数据库连接,并允许比通常情况下更多的连接。数据库代理 可以通过 Vapor UI 或 database:proxy CLI 命令添加。

扩展现有的“固定大小”资源

如果您在扩展时遇到性能问题,这可能表明现有的资源(例如“固定大小”数据库或“固定大小”缓存)可能无法跟上您的应用程序管理的任务数量。

为了缓解这个问题,请考虑扩展现有的“固定大小”资源(如果有)。例如,您可以 扩展“固定大小”数据库,通过 Vapor UI 的数据库详细信息屏幕或 database:scale CLI 命令。

考虑使用 Redis 而不是 DynamoDB

如果您的应用程序严重依赖缓存 - 这已经是极大地提高应用程序速度的好方法 - 使用 Redis 缓存而不是 DynamoDB 可以加快缓存 I/O。

您可以使用 Vapor UI 或 cache CLI 命令创建缓存

考虑使用 API Gateway v2 而不是 API Gateway v1

通过从 API Gateway v1 迁移到 API Gateway v2,您可以预期应用程序请求的延迟降低 50%。但是,API Gateway v2 是区域性的,这意味着来自与您的项目距离很远的区域的客户可能会受到此更改的负面影响。此外,某些功能,例如 Vapor 的托管防火墙,可能不可用。

如果您想使用 API Gateway 2.0,您可以在环境的 vapor.yml 配置中指定 gateway-version: 2

联系 AWS 支持

Laravel Vapor 在 AWS 基础设施上配置和配置您的项目。但是,为了获得有关您的基础设施的性能见解,我们建议您联系AWS 支持,因为他们可以深入检查您的基础设施的内部日志。

502 Bad Gateway 或“内部服务器错误”

通常,当 Lambda 函数无法在内部处理请求时,会抛出 502 Bad Gateway 或“内部服务器错误”。大多数情况下,这是因为请求已超时或因为有效负载/响应超过了 AWS 允许的大小。

您可以在环境日志中搜索“任务超时”消息以查看请求是否已超时。以下是一些解决“超时”问题的常见方法

  1. 更改 vapor.yml 文件上的timeout 值,然后再次部署您的应用程序。
  2. 尝试确定可能导致此“超时”问题的代码。这可能与配置不正确的相关资源有关,或者任务可能比预期花费的时间更长 - 在这种情况下,请考虑使用队列 来处理繁重的任务。
  3. 或者,您可以联系AWS 支持 - 因为他们可以深入检查您的基础设施的内部日志。

如果您在环境日志中没有看到任何“任务超时”消息,则表明错误可能是因为有效负载/响应超过了 AWS 允许的大小。请咨询 AWS 的API Gateway负载均衡器 配额。

沙盒 URL 返回 400 "message: null"

Lambda 函数 URL 的查询字符串中使用的方括号必须进行 URL 编码。未进行编码会导致应用程序返回 400 状态码错误。这是由于 AWS 在 URL 和 Lambda 函数之间的映射中存在限制。在尝试将数据数组作为 URL 的一部分发送时,最常遇到此问题。

https://xyz.lambda-url.us-east-1.on.aws?items[]=1 ❌

https://xyz.lambda-url.us-east-1.on.aws?items%5B%5D=1 ✅