通过性能设计模型优化S3最佳实践

译者序

S3是最常见的云服务之一,也是用量最大的云服务之一,了解S3服务,优化S3服务,可以更好的优化应用性能,节省成本。

本手册是Amazon S3设计和优化指南,但是对其他公有云的S3使用也很有指导意义,新钛云服特意翻译了本手册,希望对S3的使用能够带来一些帮助。

摘要

构建从Amazon S3上载和检索存储的应用程序时,请遵循我们的最佳实践指南来优化性能。我们还提供更多详细的性能设计模型。

介绍

在从Amazon S3上载和检索存储时,应用程序可以轻松地在请求性能方面实现每秒数千个事务。Amazon S3会自动扩展到高请求率,例如,应用程序每存储桶/每prefix/每秒至少可以达到3,500 PUT/COPY/POST/DELETE和5,500 GET/HEAD请求,存储桶中的prefix数量没有限制。你可以通过并行读取来提高读取或写入性能,例如,如果在Amazon S3存储桶中创建10个prefix以并行化读取,则可以将读取性能扩展到每秒55,000个。

Amazon S3上的某些数据湖应用程序扫描数百万或数十亿个对象,以运行超过PB级数据的查询。这些数据湖应用程序实现单实例传输速率,最大化其亚马逊的网络接口以使用EC2实例,在单个实例上最高可达100Gb/s。然后,这些应用程序在多个实例之间聚合吞吐量,以获得每秒几兆兆位。

其他应用程序对延迟敏感,例如社交媒体消息传递应用程序。这些应用程序可以实现大约100-200毫秒的一致小对象延迟(以及较大对象的首字节输出延迟)。

其他AWS服务还可以帮助提高不同应用程序体系结构的性能。例如,如果希望在单个HTTP连接或单位数毫秒延迟上获得更高的传输速率,请使用AmazonCloudFront或Amazon ElastiCache进行使用Amazon S3进行缓存。

此外,如果希望在客户端和S3存储桶之间进行长距离快速数据传输,请使用AmazonS3传输加速。Transfer Acceleration使用CloudFront中的全球分布式边缘位置来加速地理距离上的数据传输。

如果你的Amazon S3工作负载使用AWS Key Management Service(SSE-KMS)进行服务器端加密,请参阅AWSKey Management Service开发人员指南中的AWS KMS限制,以获取有关用例支持的请求率的信息。

以下主题描述了用于优化使用AmazonS3的应用程序性能的最佳实践指南和设计模式。

本指南取代之前关于优化AmazonS3性能的任何指导。例如,以前的Amazon S3性能指南建议使用散列字符随机化前缀命名,以进行优化频繁数据检索的性能。不再需要为性能随机化前缀命名,并且可以为前缀使用基于日期的顺序命名。有关AmazonS3性能优化的最新信息,请参阅性能指南和性能设计模式。

Amazon S3的性能指南

要在Amazon S3上获得应用程序的最佳性能,我们建议遵循以下准则

衡量绩效

优化性能时,请查看网络吞吐量,CPU和DRAM要求。根据对这些不同资源的需求组合,可能值得评估不同的Amazon EC2实例类型。有关实例类型的更多信息,请参阅Amazon EC2用户指南(适用于Linux实例)中的实例类型。

在测量性能时,使用HTTP分析工具查看DNS查找时间,延迟和数据传输速度也很有帮助。

水平扩展存储连接

跨多个连接传播请求是水平扩展性能的常见设计模式。构建高性能应用程序时,请将Amazon S3视为一个非常大的分布式系统,而不是像传统存储服务器那样的单个网络端点。可以通过向Amazon S3发出多个并发请求来实现最佳性能。通过单独的连接传播这些请求,以最大化Amazon S3的可访问带宽。Amazon S3对存储桶的连接数没有任何限制。

使用字节范围提取

在GET对象请求中使用Range HTTP标头,可以从对象获取字节范围,仅传输指定的部分。可以使用与Amazon S3的并发连接,从同一对象中获取不同的字节范围。与单个完整对象请求相比,这有助于实现更高的聚合吞吐量。获取较大范围的较大对象,还允许应用程序在请求中断时改善重试次数。

字节范围请求的典型大小为8 MB或16 MB。如果使用分段上传对象是PUT,那么最好以相同的零件尺寸(或至少与零件边界对齐)获取它们以获得最佳性能。GET请求可以直接处理各个部分;例如,GET?partNumber= N.

重试延迟敏感应用程序的请求

激进的超时和重试有助于提高一致的延迟。鉴于Amazon S3的规模很大,如果第一个请求很慢,重试的请求可能会采取不同的路径并快速成功。AWS开发工具包具有可配置的超时和重试值,可以将其调整为特定应用程序的容差。

在同一AWS区域中合并Amazon S3(存储)和Amazon EC2(计算)

虽然S3存储桶名称是全局唯一的,但每个存储桶都存储在创建存储桶时选择的区域中。为了优化性能,我们建议尽可能从同一AWS区域中的Amazon EC2实例访问存储桶。这有助于减少网络延迟和数据传输成本。

有关数据传输成本的更多信息,请参阅Amazon S3定价。

使用Amazon S3传输加速最大限度地减少距离引起的延迟

AmazonS3 Transfer Acceleration可在客户端和S3存储桶之间的较长地理距离上管理快速,轻松,安全的文件传输。Transfer Acceleration利用Amazon CloudFront中全球分布的边缘位置。当数据到达边缘位置时,它将通过优化的网络路径路由到Amazon S3。传输加速非常适合在各大洲定期传输千兆字节到数TB的数据。它对于从世界各地上传到集中式存储桶的客户端也很有用。

可以使用AmazonS3传输加速速度比较工具,来比较Amazon S3区域的加速和非加速上传速度。速度比较工具使用分段上传将文件从浏览器传输到各种AmazonS3区域,无论是否使用Amazon S3传输加速。

使用最新版本的AWS开发工具包

AWS软件开发工具包为许多优化AmazonS3性能的建议指南提供内置支持。SDK提供了一个更简单的API,可以在应用程序中利用Amazon S3,并定期更新以遵循最新的最佳实践。例如,SDK包括自动重试HTTP 503错误请求的逻辑,并且正在投资代码以响应和适应慢速连接。

SDK还提供传输管理器,它可以在适当的情况下使用字节范围请求自动进行水平扩展连接,以实现每秒数千个请求。使用最新版本的AWS开发工具包获取最新的性能优化功能非常重要。

还可以在使用HTTPREST API请求时优化性能。使用REST API时,应遵循作为SDK一部分的相同最佳实践。允许对慢速请求进行超时和重试,以及允许并行获取对象数据的多个连接。有关使用REST API的信息,请参阅Amazon Simple StorageService API参考。

Amazon S3 性能设计模型

在设计从Amazon S3上传和检索存储的应用程序时,请使用我们的最佳实践设计模式,以便为你的应用程序实现最佳性能。我们还提供了性能指南,供你在规划应用程序体系结构时考虑。

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

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

许多在Amazon S3中存储数据的应用程序都提供用户反复请求的“工作集”数据。如果工作负载正在为一组公共对象发送重复的GET请求,则可以使用AmazonCloudFront,Amazon ElastiCache或AWS ElementalMediaStore等缓存来优化性能。成功的缓存采用可以带来低延迟和高数据传输速率。使用缓存的应用程序也会向AmazonS3发送较少的直接请求,这有助于降低请求成本。

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

Amazon ElastiCache是一个托管的内存缓存。使用ElastiCache,可以配置在内存中缓存对象的AmazonEC2实例。这种缓存导致GET延迟的数量级减少和下载吞吐量的显着增加。要使用ElastiCache,可以修改应用程序逻辑,以便使用热对象填充缓存,并在从Amazon S3请求热门对象之前检查缓存。有关使用ElastiCache提高Amazon S3 GET性能的示例,请参阅使用AmazonElastiCache for Redis的博客文章Turbocharge Amazon S3。

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

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

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

Amazon S3会根据持续的新请求率自动扩展,从而动态优化性能。虽然Amazon S3在内部针对新请求率进行优化,但你将暂时收到HTTP 503请求响应,直到优化完成。在Amazon S3内部优化新请求率的性能之后,通常会在不重试的情况下提供所有请求。

对于对延迟敏感的应用程序,AmazonS3建议跟踪并积极地重试较慢的操作。当重试请求时,我们建议使用与Amazon S3的新连接并执行全新的DNS查找。

当进行大量可变大小的请求(例如,超过128 MB)时,我们建议跟踪正在实现的吞吐量并重试最慢的5%请求。当发出较小的请求(例如,小于512 KB)时,中位数延迟通常在几十毫秒范围内,一个好的指导方针是在2秒后重试GET或PUT操作。如果需要进行额外的重试,最佳做法是退出。例如,我们建议在2秒后发出一次重试,再过4秒后再次重试。

如果应用程序向AmazonS3发出固定大小的请求,则应该期望每个请求的响应时间更加一致。在这种情况下,一个简单的策略是识别最慢的1%的请求并重试它们。即使单次重试也常常有效减少延迟。

如果使用AWSKey Management Service(AWS KMS)进行服务器端加密,请参阅AWS Key Management Service开发人员指南中的限制,以获取有关用例支持的请求率的信息。

高吞吐量的水平扩展和请求并行化

Amazon S3是一个非常大的分布式系统。为了帮助你利用其规模,我们建议横向扩展对Amazon S3服务端点的并行请求。除了在Amazon S3中分发请求之外,这种类型的扩展方法还有助于通过网络在多条路径上分配负载。

对于高吞吐量传输,AmazonS3建议使用多个连接的应用程序并行获取GET或PUT数据。例如,AWS Java SDK中的AmazonS3 Transfer Manager支持此功能,并且大多数其他AWS开发工具包提供类似的结构。对于某些应用程序,可以通过在不同的应用程序线程或不同的应用程序实例中并发启动多个请求来实现并行连接。最佳方法取决于应用程序和正在访问的对象的结构。

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

在调整并发发出的请求数时,衡量性能非常重要。我们建议一次只能使用一个请求。测量正在实现的网络带宽以及应用程序在处理数据时使用的其他资源。然后,可以识别瓶颈资源(即使用率最高的资源),从而识别可能有用的请求数。例如,如果一次处理一个请求导致CPU使用率为25%,则表明最多可以容纳四个并发请求。

测量是必不可少的,随着请求率的增加,确定资源使用是值得的。

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

最后,值得关注DNS并仔细检查请求是否分布在广泛的Amazon S3 IP地址池中。Amazon S3的DNS查询循环通过大量IP端点。但缓存解析器或重用单个IP地址的应用程序代码不会受益于地址分集和随之而来的负载平衡。诸如netstat命令行工具之类的网络实用工具可以显示用于与AmazonS3通信的IP地址,并且我们提供了要使用的DNS配置的指南。有关这些准则的详细信息,请参阅DNS注意事项。

使用Amazon S3传输加速来加速地理上不同的数据传输

AmazonS3 Transfer Acceleration可有效减少或消除全球分散的客户端与使用AmazonS3的区域应用程序之间的地理距离所导致的延迟。传输加速使用全局分布的边缘CloudFront中用于数据传输的位置。AWS边缘网络在50多个位置具有存在点。今天,它用于通过CloudFront分发内容,并提供对Amazon Route 53的DNS查询的快速响应。

边缘网络还有助于加速进出AmazonS3的数据传输。它非常适用于在各大洲之间或之间传输数据,具有快速Internet连接,使用大型对象或需要上载大量内容的应用程序。当数据到达边缘位置时,数据将通过优化的网络路径路由到Amazon S3。通常,离Amazon S3区域越远,使用传输加速可以提高速度。

你可以在新存储桶或现有存储桶上设置传输加速。你可以使用单独的Amazon S3 Transfer Acceleration端点来使用AWS边缘位置。测试Transfer Acceleration是否有助于客户端请求性能的最佳方法是使用AmazonS3传输加速速度比较工具。网络配置和条件随时间和地点不同而不同。因此,你只需为AmazonS3传输加速可以提高上传性能的转移付费。有关将转移加速与不同AWS SDK一起使用的信息,请参阅Amazon S3传输加速示例。