AWS S3 速率限制和减速错误

Mic*_*ulo 5 amazon-s3 boto amazon-web-services python-asyncio

我正在重构一个将约 120 万个小文件上传到 AWS 的作业;以前,此上传是在具有进程的 64 个 CPU 机器上逐个文件进行的。我按照S3 速率限制和最佳实践以及性能指南切换到异步 + 多进程方法,以使其更快。使用示例数据,我可以实现低至 1/10 的执行时间。对于生产负载,S3 返回“SlowDown”错误。

实际上业务逻辑使文件夹结构如下所示:

s3://bucket/this/will/not/change/<shard-key>/<items>
Run Code Online (Sandbox Code Playgroud)

对象将平均分配到 ~30 个分片键,使每个前缀包含 ~40k 项。

我们让每个进程都写在自己的前缀上,并以异步方式启动一批 3k PUT 请求,直到完成。批量写入操作后有一个睡眠,以确保我们不会在 1.1 秒过去之前发送另一个批次,因此我们将尊重每秒 3500 个 PUT 请求。

问题是我们在大约 1 小时内收到 SlowDown 错误,然后作业在大约 15 分钟内写入所有文件。如果我们将限制降低到 1k/sec,情况会更糟,运行数小时并且永远不会完成。

这是 3k/sec 限制的错误随时间的分布: 在此处输入图片说明

我们使用带有aiobotocore 的Python 3.6来运行异步。

进行某种试验和错误以试图了解如何减轻这种情况需要永远对生产数据进行测试,而使用较少数量的数据进行测试会给我们不同的结果(完美无缺)。

我是否错过了有关如何正确扩展系统的任何文档?