1

我一直在处理从我的应用程序到 S3 的上传速度非常慢的问题。我有一个在 Elastic Beanstalk 上的单个 docker 环境中运行的 rails 应用程序和一个存储用户创建的文件的特定存储桶。两者都在同一区域和可用区中。上传的文件是非常小的 (< 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对象而不是文件路径字符串。从我之前的代码示例中并不清楚。

4

2 回答 2

2

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

于 2019-03-21T18:12:38.453 回答
0

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

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

s3_object = Aws::S3::Object.new("bucket", "key")
s3_object.upload_file(file.path)
于 2020-05-15T17:33:12.873 回答