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>();

Я надеюсь, что это поможет кому-то в будущем!

Другие вопросы по тегам