[英]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.