AWS CLI S3 CP 性能非常缓慢

Chr*_*FNZ 5 amazon-s3 amazon-web-services aws-cli

我遇到了一个问题,即通过 aws cli 上传到 AWS S3 和从 AWS S3 下载非常慢。非常慢是指 211k 文件始终需要大约 2.3 秒,这表明平均下载速度低于 500Kb/s,这对于这么小的文件来说非常慢。我的 web 应用程序严重依赖于内部 API,我缩小了范围,API 的大部分往返性能主要与从 S3 上传和下载文件有关。

一些细节:

  • 在 AWS 托管的 EC2 实例上使用最新版本的 aws cli(aws-cli/1.14.44 Python/3.6.6、Linux/4.15.0-34-generic botocore/1.8.48)
  • 实例正在运行最新版本的 Ubuntu (18.04)
  • 实例位于区域 ap-southeast-2a(悉尼)
  • 实例通过最小权限策略被授予基于角色的 S3 访问权限(即它需要访问的存储桶的最小权限)
  • 类型是 t2.micro 应该有~60Mb左右的互联网带宽
  • S3 存储桶位于 ap-southeast-2
  • 加密(默认)和未加密文件的结果相同
  • 无论文件在对象名称中是否有随机的字母数字字符集合,结果都相同
  • 该问题始终存在,即使在多次 cp 尝试之后,并且在重新启动后,cp 尝试始终需要 2.3 秒
  • 这让我怀疑 S3 或 EC2 实例(使用标准 Internet 网关)是否受到限制
  • 我已经测试使用 wget 从同一个实例下载同一个文件到网络服务器,它需要 0.0008s(即 8ms)

所以总结一下:

  • 通过 AWS CLI 从 S3 下载文件需要 2.3 秒(即 2300 毫秒)
  • 通过 wget 从网络服务器(> Internet > Cloudflare > AWS > LB > Apache)下载相同的文件需要 0.0008s(即 8ms)

我需要改进 AWS CLI S3 下载性能,因为 API 将来会被大量使用。

任何建议将不胜感激。

Chr*_*FNZ 3

好吧,这是多种因素的结合。

我之前在使用 AWS PHP API SDK 时遇到了问题(主要与复制文件时的孤立线程有关),因此出于简单性和可靠性原因,我将 API 更改为使用 AWS CLI,虽然它们有效,但我遇到了一些性能问题:

  • 首先,因为我的实例对我的 S3 存储桶具有基于角色的访问权限,所以 aws CLI 需要大约 1.7 秒才能确定我的存储桶位于哪个区域。配置 CLI 以指向默认区域克服了这个问题
  • 其次,因为 PHP 在运行 exec() 命令时必须调用全新的 shell(例如 exec("aws s3 cp s3://bucketname/objectname.txt /var/app_path/objectname.txt)),这是一个非常慢的练习.我知道可以通过 Gearman 或类似的方式卸载 shell 命令,但由于简单性是我的目标之一,所以我不想走那条路
  • 最后,由于 AWS CLI 使用 Python,因此在开始处理命令之前,仅启动就需要近 0.4 秒的时间。这看起来可能不是很多,但当我的 API 投入生产使用时,这将对用户和基础设施产生相当大的影响

长话短说,我做了两件事:

  • 恢复为使用 AWS PHP API SDK 而不是 AWS CLI
  • 在我的 PHP 代码中引用正确的 S3 区域名称

我的 API 现在性能好多了,即从 2.3 秒缩短到平均 0.07 秒左右。

这并没有让我原来的问题消失,但至少性能好多了。