【问题标题】:Why does ruby aws-sdk uploading to S3 take over 40 seconds for small file sizes为什么小文件大小的 ruby​​ aws-sdk 上传到 S3 需要 40 秒以上
【发布时间】:2019-08-12 12:13:32
【问题描述】:

我一直在处理从我的应用程序到 S3 的上传速度非常慢的问题。我有一个在 Elastic Beanstalk 上的单个 docker 环境中运行的 rails 应用程序和一个存储用户创建的文件的特定存储桶。两者都在同一区域和可用区中。上传的文件是非常小的 (

我正在使用 ruby​​ aws-sdk 执行如下所示的上传:

file = Tempfile.new(file_name)
file.write(@content)
key = "resources/#{file_name}"
s3 = Aws::S3::Resource.new(region: ENV["AWS_REGION"])
obj = s3.bucket(bucket_name).object(key)

logger.info "** Uploading file #{file_name} to S3"
logger.info " - File size is #{file.size} bytes"
start_time = Time.now.to_i
obj.upload_file(file)
end_time = Time.now.to_i
seconds = end_time - start_time
elapse = Time.at(seconds).utc.strftime("%H:%M:%S")
logger.info "** File upload took #{elapse} to complete"

我看到这样的输出:

** Uploading file untitled-NUB3eAURYspbpdaBqu.md to S3
  - File size is 23 bytes
** File upload took 00:00:41 to complete

在阅读了关于 SO、aws 论坛和其他人的数百篇其他帖子后,我已经用尽了我在这个问题上的研究能力。任何关于我如何改进这一点的见解将不胜感激。

更新: 补充说我使用的是Tempfile 对象而不是文件路径字符串。从我之前的代码示例中并不清楚。

【问题讨论】:

  • 值得为 SDK 启用线路日志记录(线路跟踪)和最完整的调试/详细选项,看看这是否能解决问题?您看到从同一客户端上的 awscli 到同一存储桶的上传时间是多少?
  • 正如@jarmod所说,尝试使用awscli从终端上传文件并测量时间,这可能是一个时间网络问题
  • 有趣...启用线路跟踪时,我可以看到有两次尝试上传。第一次尝试以 400 Bad Request <Code>RequestTimeout</Code><Message>Your socket connection to the server was not read from or written to within the timeout period. Idle connections will be closed.</Message> 失败。第二次尝试成功完成。其他一切看起来都很正常。
  • @MattGrannary 这个问题只能针对这个确切的存储桶重现吗?如果可能的话,您能否更新问题并附上这些日志

标签: ruby amazon-web-services amazon-s3 aws-sdk-ruby


【解决方案1】:

找到的解决方案:尝试了几个选项后,我发现问题在于将 File 对象传递给 upload_file() 方法。尽管aws documentation 说这是可以接受的,但当我改用file.path 时,我的问题就消失了。

【讨论】:

  • 奇怪的是文档会指出一个不受支持的选项(一个打开的文件对象)。您使用的是最新的 SDK 吗?
  • 我链接的文档适用于我所指的版本 2。我不会说它不受支持,而是有一个错误。上传最终会成功完成,但第一次尝试必须失败。这就是导致我最初抱怨的 40 秒的原因:)。
  • 感谢您的提示。对上传缓慢的问题感到非常困惑。这完美解决了。
【解决方案2】:

该解决方案对我有用。非常感谢。为了让它工作,我必须刷新文件内容(我猜可能是关闭或倒带)。以下是我解决此问题的最终解决方案。希望对其他人有所帮助。

file = Tempfile.new
file.write("data")
file.flush

s3_object = Aws::S3::Object.new("bucket", "key")
s3_object.upload_file(file.path)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-27
    • 2012-12-01
    • 2022-01-14
    • 2016-05-10
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2013-03-26
    相关资源
    最近更新 更多