簡體   English   中英

為什么 ruby​​ aws-sdk 上傳到 S3 需要超過 40 秒的小文件大小

[英]Why does ruby aws-sdk uploading to S3 take over 40 seconds for small file sizes

我一直在處理從我的應用程序到 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對象而不是文件路徑字符串。 從我之前的代碼示例中並不清楚。

找到的解決方案:嘗試了幾個選項后,我發現問題是將 File 對象傳遞給upload_file()方法。 盡管aws 文檔說這是可以接受的,但當我改用file.path時,我的問題就消失了。

該解決方案對我有用。 非常感謝。 為了讓它工作,我必須刷新文件內容(我猜可以調用 close 或 rewind )。 以下是我解決此問題的最終解決方案。 希望它可以幫助別人。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM