AWS Параллельный вызов лямбда-лямбда ухудшил производительность по сравнению с локальным параллельным вызовом лямбда - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть лямбда "оркестратор", которая принимает список параметров и синхронно вызывает "лямбду" работника для каждого параметра в этом списке. Затем оркестратор ожидает завершения всех рабочих лямбд и возвращает совокупный результат. Оркестратору передан список, содержащий 122 элемента, и я столкнулся с некоторым странным поведением.

Когда я тестирую лямбду-оркестратор на моей хост-машине, она работает безупречно, параллельно вызывая все 122 рабочих лямбды и возвращая результат. Это завершается примерно за 1 минуту, что соответствует продолжительности самого длительного вызова отдельного работника. Это имеет смысл, поскольку все лямбды вызываются параллельно.

Но когда я запускаю лямбда-оркестратор в лямбда-среде, кажется, что он работает с ухудшенной производительностью. Я собрал метрики производительности, которые показывают, что локальная версия возвращает ~ 9 результатов / секунду, а версия с лямбда-кодом возвращает ~ 2 результата / секунду. Пожалуйста, см. Прилагаемые графики, которые иллюстрируют это.

На моем локальном хосте и в лямбда-среде используется одна и та же версия python (3.7.4), с 1,7 ГБ памяти и одним полным vCPU, выделенным для обоих оркестратора и рабочие лямбды. Для справки, код для лямбда-оркестратора здесь и здесь .

Локальное исполнение:

Local invocation

Производительность Lambda:

Lambda-hosted performance

Чем можно объяснить это несоответствие производительности между локальной и Lambda-версиями?

1 Ответ

0 голосов
/ 19 апреля 2020

Кажется, проблема была в том, как я использовал asyncio. Я вызывал рабочую лямбду с помощью лямбда-клиента boto3 следующим образом:

loop = asyncio.get_running_loop()  
await loop.run_in_executor(lambda_client.invoke, ...)

Похоже, что это блокировка в лямбда-среде, но не на моем хост-компьютере, что привело к снижению производительности. Я не уверен, почему.

Я решил эту проблему путем рефакторинга своего кода для использования библиотеки aioboto3, например:

async with aioboto3.client('lambda') as lambda_client:
    response = await lambda_client.invoke(...)

Это позволяет достичь той же производительности в лямбда-выражении, что и на моем хост-компьютере.

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