2018 年 7 月 17 日,AWS 官方发布公告称,不再需要随机化每个 S3 对象键的第一个字符来实现最佳性能:https://aws.amazon.com/about-aws/whats-new/2018/07/amazon-s3-announces-increased-request-rate-performance/
Amazon S3 宣布提高请求率性能
发布于: Jul 17, 2018
Amazon S3 现已提供更高的性能,支持每秒至少 3,500 个添加数据请求和每秒 5,500 个检索数据请求,这可以节省大量处理时间且无需支付额外费用。每个 S3 前缀都可以支持这些请求速率,从而轻松显著提高性能。
目前在 Amazon S3 上运行的应用程序无需任何更改即可享受此性能改进,而在 S3 上构建新应用程序的客户无需进行任何应用程序自定义即可实现此性能。Amazon S3 对并行请求的支持意味着您可以根据计算集群的因素扩展 S3 性能,而无需对应用程序进行任何自定义。性能按前缀扩展,因此您可以并行使用任意数量的前缀来实现所需的吞吐量。前缀数量没有限制。
此次 S3 请求速率性能提升消除了之前关于随机化对象前缀以实现更快性能的任何指导。这意味着您现在可以在 S3 对象命名中使用逻辑或顺序命名模式,而不会对性能产生任何影响。此改进现已在所有 AWS 区域推出。有关更多信息,请访问 Amazon S3 开发人员指南。
这很好,但也令人困惑。它说每个 S3前缀可以支持这些请求率,从而轻松显著提高性能
但是,由于前缀和分隔符只是GET Bucket (List Objects)
列出存储桶内容时 API 的参数,因此谈论“每个前缀”的对象检索性能有什么意义呢?每次调用都GET Bucket (List Objects)
可以选择所需的任何前缀和分隔符,因此前缀不是预定义的实体。
例如,如果我的存储桶包含以下对象:
a1/b-2
a1/c-3
然后,每当我列出存储桶内容时,我可以选择使用“/”或“-”作为分隔符,因此我可能会考虑将前缀视为
a1/
或者
a1/b-
a1/c-
但是由于GET Object
API 使用整个密钥,因此对象检索不存在特定前缀或分隔符的概念。那么我是否可以预期 上的请求数为 5,500/秒,a1/
或者 上的请求数为 5,500/秒,a1/b-
上的请求数为 5,500 a1/c-
?
那么,有人可以解释一下公告中为“每个 s3 前缀”建议特定的性能水平(例如每秒 +5,500 个检索数据请求)是什么意思吗?
答案1
这里实际提到的前缀似乎过于简单,实际上指的是存储桶索引的每个分区。索引是词汇索引,因此拆分基于对象键中的前导字符进行。因此,它被称为字首。
S3 自动且透明地管理索引分区,因此这里“前缀”的精确定义实际上有些不精确:它是“S3 决定需要什么来支持存储桶的工作负载。” S3 根据工作负载拆分索引分区,因此今天可能具有相同“前缀”的两个对象明天可能会具有不同的前缀,所有这些都在后台完成。
现在,a1/a-... 和 a1/b-... 以及 a1/c-... 可能都是单个前缀。但是,如果向存储桶投入足够多的流量,S3 可能会决定拆分分区,这样明天,a1/a- 和 a1/b- 可能位于一个前缀中,而 a1/c- 可能位于其自己的前缀中。(也就是说,键 < a1/c- 位于一个分区中,而键 >= a1/c- 现在位于另一个分区中)。
何时何地以及具体什么阈值会触发拆分行为尚未记录,但它似乎只与请求数量有关,而与对象的数量或大小无关。以前,这些分区被限制为每秒几百个请求,而现在这个数字已经大大增加了。