Amazon Simple Storage Service
开发人员指南 (API 版本 2006-03-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon S3 的性能设计模式

当设计应用程序以从 Amazon S3 上传和检索存储时,使用我们的最佳实践设计模式,以实现应用程序的最佳性能。我们还提供性能准则,供您在规划您的应用程序架构时考虑。

要优化性能,您可以使用以下设计模式。

对频繁访问的内容使用缓存

许多在 Amazon S3 中存储数据的应用程序会提供用户反复请求的数据的一个“工作集”。如果工作负载针对一组常用对象发送重复的 GET 请求,您可以使用缓存(如 Amazon CloudFrontAmazon ElastiCacheAWS Elemental MediaStore)来优化性能。成功地采用缓存可能导致低延迟和较高的数据传输速率。使用缓存的应用程序还会向 Amazon S3 发送少量的直接请求,这可帮助降低请求成本。

Amazon CloudFront 是一个快速内容交付网络 (CDN),它透明地在大量的一组地理位置分散的接入点 (PoP) 中缓存 Amazon S3 中的数据。当可能从多个区域或通过 Internet 访问对象时,CloudFront 允许靠近访问对象的用户缓存数据。这可能导致高性能交付常用的 Amazon S3 内容。有关 CloudFront 的信息,请参阅 Amazon CloudFront 开发人员指南

Amazon ElastiCache 是托管的内存中缓存。通过 ElastiCache,您可以预配置在内存中缓存对象的 Amazon EC2 实例。这种缓存会导致 GET 延迟下降若干个数量级,并显著增加下载吞吐量。要使用 ElastiCache,您修改应用程序逻辑,以同时用热门对象填充缓存和检查缓存中的热门对象,然后从 Amazon S3 中请求它们。有关使用 ElastiCache 改进 Amazon S3 GET 性能的示例,请参阅博客文章使用 Amazon ElastiCache for Redis 增强 Amazon S3

AWS Elemental MediaStore 是一个专为 Amazon S3 中的视频工作流和媒体交付构建的缓存和内容分发系统。MediaStore 提供专用于视频的端到端存储 API,推荐用于性能敏感型视频工作负载。有关 MediaStore 的信息,请参阅 AWS Elemental MediaStore 用户指南

延迟敏感型应用程序的超时和重试

在某些情况下,应用程序从 Amazon S3 收到指示需要重试的响应。Amazon S3 将存储桶和对象名称映射到与它们关联的对象数据。如果应用程序生成高的请求率(通常针对少量对象持续超过每秒 5,000 个请求的速率),则它可能会收到 HTTP 503 速度下降 响应。如果出现这些错误,每个 AWS 开发工具包都会使用指数退避来实现自动重试逻辑。如果您不使用 AWS 开发工具包,则应在收到 HTTP 503 错误时实施重试逻辑。有关退避技术的信息,请参阅 Amazon Web Services 一般参考 中的 AWS 中的错误重试和指数退避

Amazon S3 自动扩展以应对持续的新请求速率,同时动态优化性能。尽管 Amazon S3 在内部针对新的请求速率进行优化,但您将临时收到 HTTP 503 请求响应,直至优化完成。当 Amazon S3 在内部针对新的请求速率优化性能后,通常无需重试就能正常应对所有请求。

对于延迟密集型应用程序,Amazon S3 建议跟踪和主动重试较慢的操作。当重试请求时,我们建议您使用到 Amazon S3 的新连接并执行全新 DNS 查找。

当您发出大型可变大小的请求(例如,超过 128 MB)时,我们建议跟踪所实现的吞吐量并重试最慢 5% 的请求。当您发出较小的请求(例如,小于 512 KB)时,其中,延迟时间中值通常处于数十毫秒的范围内,好的指导原则是在 2 秒后重试 GET 或 PUT 操作。如果需要更多重试,则最佳实践是退避。例如,我们建议您在 2 秒后发出一次重试,然后 4 秒后再发出一次重试。

如果应用程序对 Amazon S3 发出固定大小的请求,则应预期对于其中每个请求获得更一致的响应时间。在这种情况下,一个简单的策略是确定最慢的 1% 的请求并重试这些请求。甚至一次重试也会频繁、有效地减少延迟。

如果您使用 AWS Key Management Service (AWS KMS) 进行服务器端加密,请参阅 AWS Key Management Service Developer Guide 中的限制,以获取有关使用案例支持的请求速率的信息。

横向扩展和请求并行化以实现高吞吐量

Amazon S3 是一个非常大的分布式系统。为了帮助您利用其规模,我们鼓励您将并行请求横向扩展到 Amazon S3 服务终端节点。除了在 Amazon S3 中分布请求之外,这种类型的扩展方法还有助于将负载分布到整个网络中的多个路径。

对于高吞吐量传输,Amazon S3 建议使用并行利用多个连接来 GET 或 PUT 数据的应用程序。例如,AWS Java 开发工具包中的 Amazon S3 传输管理器支持上述功能,大多数其他 AWS 开发工具包提供类似的构造。对于某些应用程序,您可以实现并行连接,具体方法为:在不同的应用程序线程或不同的应用程序实例中并行启动多个连接。要采取的最佳方法取决于应用程序以及您访问的对象的结构。

您可以使用 AWS 开发工具包直接发出 GET 和 PUT 请求,而不是利用 AWS 开发工具包中的传输管理。这种方法让您可以更直接地调整工作负载,同时仍受益于软件工具包支持重试和处理任何可能发生的 HTTP 503 响应。通常来说,当您将某个区域中的大型对象从 Amazon S3 下载到 Amazon EC2 时,我们建议您以 8–16 MB 的粒度对对象的字节范围发出并行请求。对于每个 85–90 MB/s 的所需网络吞吐量发出一个并行请求。要使 10 Gb/s 网络接口卡 (NIC) 达到饱和,您可以通过单独的连接使用大约 15 个并行请求。您可以通过更多连接扩展并行请求以使速度更快的 NIC 达到饱和,如 25 Gb/s 或 100 Gb/s NIC。

当您调整并行发出的请求数量时,衡量性能至关重要。我们建议一次只用一个请求为起点。衡量所实现的网络带宽以及应用程序用于处理数据的其他资源的使用情况。然后,您可以确定瓶颈资源(也即使用率最高的资源),进而确定可能有用的请求数。例如,如果一次处理一个请求会导致 CPU 利用率达到 25%,则建议可以容纳多达四个并行请求。衡量是必不可少的,随着请求速率增加,务必确认资源使用情况。

如果应用程序使用 REST API 直接向 Amazon S3 发出请求,我们建议您使用 HTTP 连接池,并对一系列请求重用每个连接。通过避免逐个请求连接设置,可消除对每个连接执行 TCP 慢速启动和安全套接字层 (SSL) 握手的需要。有关使用 REST API 的信息,请参阅 Amazon Simple Storage Service API Reference

最后,务必注意 DNS 并仔细检查请求正在分散到广泛的 Amazon S3 IP 地址池。对于 Amazon S3 的 DNS 查询会循环经过一个很大的 IP 终端节点列表。但是,缓存解析程序或重用单一 IP 地址的应用程序代码不会受益于地址多样性和由此产生的负载平衡。网络实用工具(如 netstat 命令行工具)可以显示用来与 Amazon S3 通信的 IP 地址,并且我们提供要使用的 DNS 配置的准则。有关这些准则的更多信息,请参阅 DNS 注意事项

使用 Amazon S3 Transfer Acceleration 加快地理位置分散的数据传输

Amazon S3 Transfer Acceleration 通过使用 Amazon S3,有效地将由于全球分散的客户端与区域性应用程序之间的地理距离所导致的延迟降至最小甚至消除。Transfer Acceleration 使用 CloudFront 中的全球分布式边缘站点进行数据传输。AWS 边缘网络在超过 50 个站点具有接入点。目前,它用于通过 CloudFront 分布内容,并向针对 Amazon Route 53 发出的 DNS 查询提供快速响应。

边缘网络还有助于加速进出 Amazon S3 的数据传输。它对具有以下特点的应用程序是理想之选:跨大洲或在大洲之间传输数据、具有快速 Internet 连接、使用大型对象,或具有大量要上传的内容。当数据到达某个边缘站点时,会通过经过优化的网络路径路由至 Amazon S3。通常,您与 Amazon S3 区域之间的距离越远,使用 Transfer Acceleration 可预期获得的速度改进就越高。

您可以对新的或现有的存储桶设置 Transfer Acceleration。您可以通过单独的 Amazon S3 Transfer Acceleration 终端节点来使用 AWS 边缘站点。测试 Transfer Acceleration 是否有助于提高客户端请求性能的最佳方法是使用 Amazon S3 Transfer Acceleration 速度比较工具。网络配置和条件随时间或站点不同而可能发生变化。因此,我们只对 Amazon S3 Transfer Acceleration 可能会改进上传性能的传输向您收费。有关将 Transfer Acceleration 与不同的 AWS 开发工具包结合使用的信息,请参阅 Amazon S3 Transfer Acceleration 示例