对于小文件,为什么将ruby aws-sdk上传到S3需要40秒以上

时间:2019-03-21 15:24:01

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

从应用程序到S3的上传速度一直很慢。我有一个Rails应用程序在Elastic Beanstalk的单个docker环境中运行,并且有一个特定的存储区,用于存储用户创建的文件。两者位于相同的区域和可用区中。正在上传的文件是非常小的(<1kb)文本文件,平均需要40秒才能上传。考虑到我什至没有转移到数据中心之外,这对我来说似乎很可笑。读取文件几乎就像移动和删除文件一样。此外,40秒似乎是传输时间的基础。我通过上传一个10字节的文档和一个29kb的文档进行了测试,这两个文档花费的时间相同。

我正在使用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对象,而不是文件路径字符串。从我以前的代码示例尚不清楚。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

该解决方案对我有用。非常感谢。为了使它起作用,我不得不刷新文件内容(我想应该叫close或rewind)。以下是解决此问题的最终解决方案。希望它可以帮助其他人。

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

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