Почему загрузка файлов ruby ​​aws-sdk на S3 занимает более 40 секунд при небольших размерах файлов - PullRequest
1 голос
/ 21 марта 2019

Я имел дело с очень медленной скоростью загрузки из моего приложения в S3.У меня есть приложение rails, работающее в среде одного докера на Elastic Beanstalk, и специальное хранилище, в котором хранятся файлы, созданные пользователем.Оба находятся в одном регионе и зоне доступности.Загружаемые файлы - это очень маленькие (<1 КБ) текстовые файлы, загрузка которых занимает в среднем 40 секунд.Это кажется мне смешным, учитывая, что я даже не перехожу за пределы центра обработки данных.Чтение файлов практически мгновенно, так как происходит перемещение и удаление файлов.Более того, 40 секунд - это базовая величина времени передачи.Я проверил это, загрузив 10-байтовый документ и документ размером 29 КБ, которые занимали одинаковое количество времени. </p>

Я использую 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, а не строку пути к файлу.Это не было ясно из моего предыдущего примера кода.

1 Ответ

1 голос
/ 21 марта 2019

Решение найдено: После опробования нескольких опций я обнаружил, что проблема заключается в передаче объекта File в метод upload_file(). Хотя в документации aws сказано, что это приемлемо, мои проблемы исчезли, когда я переключился на использование file.path.

...