Состояния документации AWS S3 (https://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html):
. Amazon S3 автоматически масштабируется до высокой частоты запросов. Например, ваше приложение может выполнить не менее 3500 запросов PUT / POST / DELETE и 5500 запросов GET в секунду.для каждого префикса в сегменте.
Для проверки этого у меня есть следующий код NodeJS (с использованием aws-sdk), который асинхронно инициирует 1000 загрузок нулевых байтов (следовательно, просто добавляя пустые записи в сегмент).Имеется таймер для измерения пропускной способности:
var t0 = new Date().getTime()
for (var i = 0; i < 1000; i++) {
var s3 = new AWS.S3()
var id = uuid()
console.log('Uploading ' + id)
s3.upload({
Bucket: bucket,
Body : '',
Key : "test/" + id
},
function (err, data) {
if (data) console.log('Uploaded ' + id + ' ' + (new Date().getTime() - t0))
else console.log('Error')
})
}
Для выполнения всех запросов на загрузку требуется приблизительно 25 секунд. Это, очевидно, далеко не заявленные 3500 запросов в секунду, а скорее приблизительно 40 запросов в секунду.
У меня примерно 1 МБ скорости загрузки по сети, и статистика сети показывает, что в большинстве случаев полоса пропускания заполнена только на 25%. В равной степени загрузка ЦП также низкая.
Так что вопрос:
Как я могу увеличить пропускную способность загрузки S3, чтобы достичь чего-то около 3500 рчто может быть достигнуто в секунду, что может быть достигнуто?
РЕДАКТИРОВАТЬ:
Я изменил код следующим образом:
var t0 = new Date().getTime()
for (var i = 0; i < 1000; i++) {
var s3 = new AWS.S3()
var id = String.fromCharCode('a'.charCodeAt(0) + (i % 26)) + uuid()
console.log('Uploading ' + id)
s3.upload({
Bucket: bucket,
Body: '',
Key: id
},
function (err, data) {
if (data) console.log('Uploaded ' + id + ' ' + (new Date().getTime() - t0))
else console.log('Error')
})
}
Это использует26 различных префиксов, которые, как утверждает документация AWS, должны масштабировать пропускную способность в 26 раз.
"Производительность чтения или записи просто экспоненциально увеличить.Например, если вы создаете 10 префиксов в корзине Amazon S3 для распараллеливания операций чтения, вы можете увеличить производительность чтения до 55 000 запросов на чтение в секунду. "
Однако никакой разницы в пропускной способности не видно.Существует некоторое различие в поведении, так что кажется, что запросы выполняются более параллельно, а не последовательно - но время завершения примерно одинаково.
Наконец, я попытался запустить приложение вx4 отдельных потока bash (4 потока, 4 ядра, 4x1000 запросов). Несмотря на добавленный параллелизм от использования нескольких ядер, общее время выполнения составляет около 80 секунд и, следовательно, не масштабируется.
for i in {0..3}; do node index.js & done
IИнтересно, ограничивает ли S3 скорость отдельных клиентов / IP-адресов (хотя это, по-видимому, не задокументировано)?