横向扩展和请求并行化以实现高吞吐量
Amazon S3 是一个非常大的分布式系统。为了帮助您利用其规模,我们建议您将并行请求横向扩展到 Amazon S3 服务终端节点。除了在 Amazon S3 中分布请求之外,这种类型的扩展方法还有助于将负载分布到整个网络中的多个路径。
对于高吞吐量传输,Amazon S3 建议使用并行利用多个连接来 GET 或 PUT 数据的应用程序。例如,AWS Java 开发工具包中的 Amazon S3 Transfer Manager 支持上述功能,大多数其他 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 S3 REST API 简介。
最后,务必注意 DNS 并仔细检查请求正在分散到广泛的 Amazon S3 IP 地址池。对于 Amazon S3 的 DNS 查询会循环经过一个很大的 IP 终端节点列表。但是,缓存解析程序或重用单一 IP 地址的应用程序代码不会受益于地址多样性和由此产生的负载均衡。网络实用工具(如 netstat 命令行工具)可以显示用来与 Amazon S3 通信的 IP 地址,并且我们提供要使用的 DNS 配置的准则。有关这些准则的更多信息,请参阅请求路由。