Amazon S3 的性能准则
当构建用于从 Amazon S3 上传和检索对象的应用程序时,请遵循我们的最佳实践准则以优化性能。我们还提供了更详细的 Amazon S3 的性能设计规律 。
要在 Amazon S3 上获得应用程序的最佳性能,我们建议遵循以下准则。
主题
衡量性能
当优化性能时,查看网络吞吐量、CPU 和 DRAM 要求。根据针对这些不同资源的组合需求,可能需要评估不同的 Amazon EC2 实例类型。有关实例类型的信息,请参阅《Amazon EC2 用户指南》中的实例类型。
它还有助于在衡量性能时使用 HTTP 分析工具查看 DNS 查找时间、延迟和数据传输速度。
要了解性能要求并优化应用程序的性能,还可以监控收到的 503 错误响应。监控某些性能指标可能会产生额外费用。有关更多信息,请参阅 Amazon S3 定价
监控 503(减速)状态错误响应的数量
要监控收到的 503 状态错误响应的数量,可以使用以下选项之一:
使用 Amazon S3 的 Amazon CloudWatch 请求指标。CloudWatch 请求指标包括一个用于 5xx 状态响应的指标。有关 CloudWatch 请求指标的更多信息,请参阅使用 Amazon CloudWatch 监控指标。
使用 Amazon S3 Storage Lens 存储统计管理工具的高级指标部分中提供的 503(服务不可用)错误计数。有关更多信息,请参阅 使用 S3 Storage Lens 存储统计管理工具指标提高性能。
使用 Amazon S3 服务器访问日志记录。通过服务器访问日志记录,您可以筛选和查看所有收到 503(内部错误)响应的请求。还可以使用 Amazon Athena 解析日志。有关服务器访问日志记录的更多信息,请参阅 使用服务器访问日志记录来记录请求。
通过监控 HTTP 503 状态错误代码的数量,您通常可以获得宝贵的见解,了解哪些前缀、密钥或存储桶获得的节流请求最多。
水平扩展存储连接
跨许多连接分布请求是一种常用的横向扩展性能的设计模式。当构建高性能应用程序时,将 Amazon S3 视为非常大的分布式系统,而不是类似于传统存储服务器的单个网络端点。您可以通过将多个并行请求发到 Amazon S3 来实现最佳性能。将这些请求分布在不同的连接,以最大限度地利用 Amazon S3 的可访问带宽。Amazon S3 对与存储桶建立的连接数没有任何限制。
使用字节范围提取
通过在 GET Object 请求中使用 Range
HTTP 标头,您可以从对象中提取字节范围,而只传输指定的部分。您可以使用到 Amazon S3 的并行连接,从相同对象中提取不同的字节范围。这有助于您通过单一整个对象请求实现更高的聚合吞吐量。通过提取较小范围的大型对象,您的应用程序还可以在请求中断时改善重试次数。有关更多信息,请参阅 下载对象。
字节范围请求的典型大小为 8 MB 或 16 MB。如果使用分段上传来 PUT 对象,则最佳实践是以相同的分段大小来 GET 它们(或者至少与分段边界相符)以获得最佳性能。GET 请求可以直接面向单独的分段;例如,GET ?partNumber=N.
延迟敏感型应用程序的重试请求
大量的超时和重试会导致持续不断的延迟。考虑到 Amazon S3 的大规模,如果第一个请求较慢,则退出的请求可能采取不同的路径并快速成功。AWS SDK 具有可配置的超时和重试值,您可以进行调整以符合特定应用程序的容限。
在同一 AWS 区域中结合 Amazon S3(存储)和 Amazon EC2(计算)
尽管 S3 存储桶名称是全局唯一的,但每个存储桶都存储在您创建它时所选择的区域中。要了解有关存储桶命名准则的更多信息,请参阅存储桶概述和存储桶命名规则。为了优化性能,我们建议您尽可能从位于同一 AWS 区域的 Amazon EC2 实例中访问此存储桶。这可以减少网络延迟和数据传输成本。
有关数据传输成本的更多信息,请参阅 Amazon S3 定价
使用 Amazon S3 Transfer Acceleration 最大限度地减少因距离导致的延迟
使用 Amazon S3 Transfer Acceleration 配置快速、安全的文件传输 可在客户端与 S3 存储桶之间管理快速、轻松和安全的长地理距离文件传输。Transfer Acceleration 利用 Amazon CloudFront 中的全球分布式边缘站点。当数据到达某个边缘站点时,会通过经过优化的网络路径路由至 Amazon S3。Transfer Acceleration 适合定期跨大洲传输 GB 到 TB 的数据。它也适用于全球各地需要上传到集中式存储桶的客户。
可以使用 Amazon S3 Transfer Acceleration 速度比较工具
使用最新版本的 AWS SDK
AWS SDK 为许多用于优化 Amazon S3 性能的建议准则提供内置的支持。这些 SDK 提供了更简单的 API 以便从应用程序内部利用 Amazon S3,并定期更新以遵循最新的最佳实践。例如,这些 SDK 包含自动对 HTTP 503 错误重试请求的逻辑,并投资编写代码来应对和适应慢速连接。
这些 SDK 还提供传输管理器,以便在适当的时机使用字节范围请求来自动横向扩展连接,从而实现每秒数千个请求。务必使用最新版本的 AWS SDK,以获取最新的性能优化特征。
您还可以在使用 HTTP REST API 请求时优化性能。当使用 REST API 时,您应遵循属于 SDK 一部分的相同最佳实践。对于慢速连接允许超时和重试,并使用多个连接以允许并行提取对象数据。有关使用 REST API 的信息,请参阅 Amazon Simple Storage Service API 参考。