【问题标题】:AWS CLI S3 CP performance is painfully slowAWS CLI S3 CP 性能非常缓慢
【发布时间】:2018-10-02 09:49:50
【问题描述】:

我遇到了一个问题,即通过 aws cli 向 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,其 Internet 带宽应为 ~60Mb 左右
  • S3 存储桶位于 ap-southeast-2 中
  • 加密(默认)和未加密文件的结果相同
  • 文件的结果相同,无论对象名称中是否包含随机的字母数字字符集合
  • 此问题始终存在,即使在多次 cp 尝试和重新启动后,cp 尝试始终需要 2.3 秒
  • 这让我想知道是否 S3 或 EC2 实例(使用标准 Internet 网关)被限制了
  • 我已经测试过使用 wget 从同一个实例将同一个文件下载到网络服务器,它需要 0.0008 秒(即 8 毫秒)

总结一下:

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

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

如有任何建议,我们将不胜感激。

【问题讨论】:

  • Ubuntu bug 1796469跟踪这个问题。
  • 我认为您指的是 Josh 下面的问题,这与我的完全不同,但无论如何谢谢。

标签: amazon-web-services amazon-s3 aws-cli


【解决方案1】:

好吧,这是一个组合。

我之前在使用 AWS PHP API 开发工具包时遇到过问题(主要与复制文件时的孤立线程有关),因此出于简单和可靠的原因,我更改了我的 API 以使用 AWS CLI,尽管它们有效,但我遇到了一些性能问题:

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

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

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

我的 API 现在的性能要好得多,即从 2.3 秒到平均大约 0.07 秒。

这不会让我原来的问题消失,但至少性能要好得多。

【讨论】:

    【解决方案2】:

    我发现如果我尝试使用aws s3 cp 下载对象,当对象大小大于 500MB 时,下载将挂起。

    但是,直接使用get-object 不会导致任何挂起或减速。因此,而不是使用

    aws s3 cp s3://my-bucket/path/to/my/object .

    获取对象

    aws s3api get-object --bucket my-bucket --key path/to/my/object out-file

    我没有减速。

    【讨论】:

    • 我使用 get-object 只获得了 0.1/0.2s
    • 不同之处在于指定 --region(即使已在配置文件中设置)
    • @MarcoMarsala 0.1s 应该在误差范围内。我不知道手动设置区域。我的主要问题是挂起大文件,我不确定它是否会为那些只会遇到持续减速的人提高速度。
    【解决方案3】:

    AWS S3 速度慢且非常复杂,您无法轻松搜索文件。如果与 cloudfront 一起使用,它会更快并且应该有优势,但是复杂性从非常复杂转变为非常复杂,因为缓存会混淆任何文件更改,并且除非您更改涉及更改文件名的文件名,否则会使缓存无效。页面中引用该文件的文件名。

    在实践中,特别是如果您的所有或大部分流量与负载均衡器位于同一区域,我发现即使位于同一区域的低规格 Web 服务器速度也快 10 倍。如果您需要多个Web 服务器连接到一个公共卷,AWS 只在某些区域提供这个,所以我通过使用 NFS 在多个 Web 服务器上共享卷来解决这个问题。这为您提供了一个安装在服务器上的文件系统,您可以登录并列出和查找文件。 S3 已成为解决几十年前得到较好解决的问题的统包解决方案。

    【讨论】:

      猜你喜欢
      • 2010-10-24
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 2021-05-24
      • 2018-08-02
      • 2020-12-22
      • 2016-05-16
      • 1970-01-01
      相关资源
      最近更新 更多