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