我一直在处理从我的应用程序到 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
对象而不是文件路径字符串。从我之前的代码示例中并不清楚。