Почему только 50 экземпляров работают на AWS лямбда? - PullRequest
2 голосов
/ 12 июня 2019

Я использую context.logStreamName для идентификации лямбда-экземпляра.Параллелизм устанавливается на незарезервированный.Но из журнала видно, что работает только 50 экземпляров.

Не понимаю ли я logStream (предварительно экземпляр logStream pre)?Я получил информацию из этого блога

Ниже мой соответствующий код:

let instances = {};
for (let i = 0; i < each_invokes; i++) {
    lambda.invoke(params, function (err, data) {
        if (err) {
            console.log(err, err.stack);
        } else {
            // console.log(data);
            let logs = Buffer.from(data.LogResult, 'base64').toString('utf8');
            let instanceID = logs.match(new RegExp("\\$InstanceID: (.*?) \\$END", "ig"))[0].split(" ")[1];
            if (instanceID) {
                if (instances.hasOwnProperty(instanceID)) {
                    instances[instanceID] += 1
                } else {
                    instances[instanceID] = 0
                }
                console.log(instanceID, instances[instanceID], 'StatusCode:', data.StatusCode);
            } else {
                console.log('missing instanceID:', data.StatusCode)
            }
        }
        console.log(Object.keys(instances).length)
    });
}

I console.log(context.logStreamName) на моей функции лямбдаи используйте RegExp для деформирования идентификатора экземпляра.

В хвостовом журнале отображаются следующие выходные данные:

b4afda96edf04e07ab819589d298521d 3 StatusCode: 200
50
a1ef1f4b518d47398daedda434ddd48c 3 StatusCode: 200
50
8dedc647796545ada94770895a8b190a 3 StatusCode: 200
50
7c4f48d72de0486e86e47c76ed3269ec 3 StatusCode: 200
50
2aa1f0dc9b0440fcac3d3127d123edb8 3 StatusCode: 200
50
3d1abeb38e7a45a4b933b669ad0c12d7 3 StatusCode: 200
50
531883ce26ac43b9bb0976726a2e5aa6 3 StatusCode: 200
50
cb9d0611a2e24244bd9ee98967a768c2 3 StatusCode: 200
50

Так значит ли это, что лямбда AWS может запускать только 50 экземпляров?Если это произойдет, как я могу увеличить количество параллелизма в AWS Lambda?

Ответы [ 3 ]

2 голосов
/ 14 июня 2019

Помимо мягкого ограничения числа одновременных выполнений в 1000, необходимо учитывать и другие вещи.

Если вы используете лямбда-функции для обработки событий, которые не основаны на опросе, то фактическое количество функций, которые вы можете запустить в один момент времени, не равно 1000. Формула для вычисления числа:

invocations per second * average execution duration in seconds

Это означает, что если вашей функции в среднем требуется 20 секунд для выполнения, то число экземпляров этой функции, которую вы можете запустить одновременно, равно 1000/20, что равно 50.

Я не говорю, что это именно тот случай с вашим кодом, но это определенно нужно учитывать при работе с лямбда-ограничениями.

Если мы говорим о функциях, основанных на опросе (лямбда-интеграция с потоками Kinesis,DynamoDB), то еще одна вещь, которая вступает в игру, это количество осколков в потоке.Каждый сегмент в потоке может обрабатываться не более чем одним экземпляром конкретной лямбда-функции за раз (обратите внимание, что разные лямбда-функции могут обрабатывать один и тот же шард одновременно).Таким образом, если в вашем потоке 50 осколков, тогда ваша лямбда-функция может масштабироваться до 50 ее экземпляров, но вышеупомянутая формула остается в силе, так что если вашей функции требуется более 20 секунд для обработки сообщения, тогда число одновременных выполнений будетменее 50.

1 голос
/ 14 июня 2019

Я думаю, что одной из причин, по которой я получил 50 экземпляров журнала, является баланс между временем задержки последнего процесса лямбда-функции и временем следующего холодного запуска.Параметр конфигурации Concurrency не говорит мне, что он мгновенно запустит 1000 незарезервированных параллельных аккаунтов.Он получает 1000 запросов, но сразу же освобождается для следующего запроса, поэтому нет необходимости холодного запуска другого экземпляра.Но я не уверен, правда это или нет.

Другая причина, которую я могу подтвердить, - это ограничение по умолчанию для AWS.

"У AWS Lambda по умолчанию установлен дроссель безопасности 100 одновременных выполнений для каждой учетной записи на регион. Если вы хотите подать запрос на увеличение скорости 100 одновременных выполнений, вы можете посетить наш Центр поддержки ..."

Я не нашел официальный документ, но нашел ограничение вручную:

Когда я установил параллелизм на 100, запустил два сценария вызова на локальной машине, каждый изСкрипты отправляют 500 вызовов одновременно.Он получит журнал результатов в очереди.Число экземпляров в журнале будет постепенно увеличиваться до 100 экземпляров, а не 50 экземпляров, что является результатом одного сценария вызова.

Но что, если параллелизм равен 100, но я запускаю три сценария вызова?Будет ли запуск 150 экземпляров?Нет, это выдаст ошибку TooManyRequestsException.

Этот тест не является строгим, все еще расследуется.Хотя это и не серьезная проблема с производством, я действительно хочу понять, почему эта проблема возникла.

- ОБНОВЛЕНИЕ -

В: Есть ли предел дляколичество функций AWS Lambda, которые я могу выполнить одновременно?

Нет.AWS Lambda предназначена для параллельного запуска многих экземпляров ваших функций.Однако в AWS Lambda по умолчанию установлен дроссель безопасности - 100 одновременных выполнений на учетную запись в каждом регионе.Если вы хотите подать запрос на увеличение количества одновременных казней, равных 100, вы можете посетить наш Центр поддержки, нажать «Открыть новое дело» и подать запрос на увеличение лимита обслуживания.

В: Что произойдет, если мойУчетная запись превышает ограничение газа по умолчанию при одновременном выполнении?

При превышении ограничения газа функции AWS Lambda, вызываемые синхронно, возвращают ошибку регулирования (код ошибки 429).Лямбда-функции, вызываемые асинхронно, могут поглощать разумные всплески трафика в течение примерно 15-30 минут, после чего входящие события будут отклоняться при регулировании.В случае, если функция Lambda вызывается в ответ на события Amazon S3, события, отклоненные AWS Lambda, могут сохраняться и повторяться S3 в течение 24 часов.События из потоков Amazon Kinesis и потоков Amazon DynamoDB повторяются до тех пор, пока функция Lambda не завершится успешно или не истечет срок действия данных.Amazon Kinesis и Amazon DynamoDB Streams хранят данные в течение 24 часов.

--- ОБНОВЛЕНИЕ ---

Как я и Матус Дубрава упомянули, яуправлял сложностью лямбда-функции, чтобы контролировать время выполнения функции.Метрики показаны ниже:

Ясно, что мы видим, что есть взаимосвязь между Duration (300k Max) и ConcurrentExecutions (я установил максимальный параллелизм на 100).

pic

1 голос
/ 12 июня 2019

По состоянию на июнь 2019 года для одновременных выполнений Lambda установлено значение 1000 .

AWS налагает ограничения на обслуживание своих ресурсов по различным причинам.Большинство ограничений могут быть сняты или увеличены с помощью увеличения лимита обслуживания на вашей консоли .

У лямбды есть специальная страница , описывающая ее пределы и объяснение того, как понять, как Лямбда-шкалы .Только concurrency и Function and Layer Storage могут быть увеличены.

Нам нужна дополнительная информация по вашей проблеме, чтобы определить, почему вы ограничены 50.

Если бы я угадал, ядумаете, что вы получаете доступ к журналу CloudWatch через GetMetricData, который имеет ограничение в 50 в секунду?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...