使用 aws cli 限制 S3 命令

Throttling S3 commands with aws cli

我正在 运行使用 AWS CLI 创建一个备份脚本,每晚在我的 MediaTemple 服务器上执行 S3 同步命令。这已经 运行 几个月没有失败,但我更新了我的 Plesk 安装,现在每天晚上,当备份脚本 运行s 时,MediaTemple 由于过度使用而禁用我的服务器。我似乎正在跨越的限制如下:

RESOURCE INFO:
Packets per second limit: 35000
Packets per second detected: 42229.11667000000306870788
Bytes per second limit: 50000000
Bytes per second detected: 61801446.10000000149011611938

他们还包括他们使服务器脱机时的网络快照,其中包括许多与 Amazon IP 地址的打开连接(快照时为 9 个)。

我能做些什么来限制与 AWS 的连接吗?最好我在 AWS API 中寻找一个选项(尽管我在文档中没有看到任何有用的东西),但除此之外,我可以做些什么来管理网络连接水平?

AWS CLI S3 传输命令(包括同步)具有以下相关configuration options

  • max_concurrent_requests -
    • Default: 10
    • The maximum number of concurrent requests.
  • multipart_threshold -
    • Default: 8MB
    • The size threshold the CLI uses for multipart transfers of individual files.
  • multipart_chunksize -
    • Default: 8MB
    • When using multipart transfers, this is the chunk size that the CLI uses for multipart transfers of individual files.

这不像每秒限制数据包那样精细,但设置较低的并发请求值并降低多部分阈值和块大小似乎会有所帮助。如果您粘贴的值接近平均值,我会从这些值开始并进行调整,直到您不再超过限制:

$ aws configure set default.s3.max_concurrent_requests 8
$ aws configure set default.s3.multipart_threshold 6MB
$ aws configure set default.s3.multipart_chunksize 6MB

我最终使用 Trickle 并将下载和上传速度限制在 20,000 kb/s。这让我无需太多修改即可使用现有脚本(我所要做的就是将 trickle 调用添加到命令的开头)。

此外,带宽限制似乎已作为一个问题添加到 AWS CLI 中,因此希望如果实施的话,这对人们来说都不是问题。

如果你不能像我一样使用 aws s3 命​​令进行 trickle 工作,你可以使用:

sudo apt-get install pv (or yum install pv) pv -L 1M local_filename 2>/dev/null | aws s3 cp - s3://bucket_name/remote_filename

其中 -L 1M 将带宽限制为 1M/s cp 后的破折号表示 stdin

注意:apt-get的awscli版本太旧,不支持stdin输入,需要通过pip升级

除了已经提到的更改最大默认连接数和块大小之外,您还可以设置 max_bandwidth。这在上传大型单个文件时非常有效。

aws configure set default.s3.max_bandwidth 50MB/s

我无法使用 aws-cli,但遇到了 s3cmd,它对我来说非常有用。它有一个速率限制选项。它可以在 Fedora 存储库中找到,我想其他发行版也打包了它。

s3cmd --progress --stats --limit-rate=50k sync ./my_photos/ s3://mybucket

s3cmd man page