Amazon S3 PutObject работает очень медленно
Я помещаю файлы в хранилище S3, используя приведенный ниже код. Я нахожу это очень медленно. Секундомер показывал 18 секунд +. Есть предложения или другие впечатления?
// upload the file to S3
AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretAccessKey);
PutObjectRequest request = new PutObjectRequest();
FileStream fs = new FileStream(sourceFileName, FileMode.Open);
request.WithInputStream(fs);
request.WithBucketName(bucketName);
request.WithKey(keyName);
Stopwatch stp1 = new Stopwatch();
stp1.Start();
client.PutObject(request);
stp1.Stop();
fs.Close();
Этот код C#. Я использую Amazon .NET SDK.
Размер файла составляет всего 56 КБ, а пропускная способность моей загрузки составляет 1,87 Мбит / с.
3 ответа
Это звучит очень похоже на проблему, с которой я столкнулся в последнее время, которая была вызвана настройками автоматического определения прокси в "Свойствах обозревателя" в Windows.
Amazon SDK использует WebRequest
сделать его HTTP-запросы и по умолчанию WebRequest
придерживается на компьютерах настроек "Internet Option" для обнаружения локальных прокси. к счастью WebRequest
имеет статическое свойство WebRequest.DefaultWebProxy
который при установке на null
, удаляет автоматическое обнаружение прокси.
Все, что вам нужно сделать, это установить его null
прежде чем начать использовать AmazonS3
:
WebRequest.DefaultWebProxy = null; // here
AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(accessKey, secretAccessKey);
[...]
Стоит отметить, что это статическое свойство нужно устанавливать только один раз для домена приложения, а не каждый раз, когда вы хотите создать AmazonS3
объект.
Альтернативный подход:
Если вы не против перенастройки машины, перейдите по ссылке:
Windows Control Panel > Internet Options > Connections > Lan Settings
и снимите флажок "Автоматически определять настройки". Если вы используете этот подход, вам не нужно устанавливать DefaultWebProxy
собственность вообще.
Дополнительная информация:
Когда я столкнулся с проблемой, я задал следующий вопрос о SO:
Как отключить автоматическое определение прокси в объекте `AmazonS3`?
Здесь есть больше деталей, чем мой ответ, если вам интересно.
Вам нужно изменить BufferSize на AmazonS3Config
var config = new AmazonS3Config
{
BufferSize = 65536 // 64KB Use a larger buffer size, normally 8K default.
};
Мой новый проект построен на .Net 6 и пакете Nuget AWSSDK.S3 .
Запуск приложения был молниеносным, но первое использование/создание экземпляра (через внедрение) заняло от 8 до 10 секунд.
Что помогло мне установитьDefaultConfigurationMode
вProgram.cs
.
var awsOptions = builder.Configuration.GetAWSOptions();
awsOptions.DefaultConfigurationMode = DefaultConfigurationMode.Standard;
[...]
builder.Services.AddDefaultAWSOptions(awsOptions);
builder.Services.AddAWSService<IAmazonS3>();
Я надеюсь, что это поможет кому-то в будущем!