【发布时间】: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