Производительность AWS Lambda: JavaScript, Python и Golang
Какой язык использовать для AWS Lambda?
Мы можем написать функцию lambda для развертывания на AWS на нескольких языках. Давайте сравним производительность (почти пустых) функций, написанных на JavaScript, Python и Golang…
TL;DR
Кратко:
Язык | Время работы с учетом нагрева (в миллисекундах) | Время работы (в миллисекундах) | Размер памяти | Максимальный объем использованной памяти |
---|---|---|---|---|
Python | 197 мс | 2 мс | 128 МБ | 32 МБ |
Python S3 | 516 мс | 35 мс | 128 МБ | 77 МБ |
JavaScript | 2 мс | 2 мс | 128 МБ | 63 МБ |
JavaScript S3 | 120 мс | 72 мс | 128 МБ | 89 МБ |
Golang | 11 мс | 1 мс | 128 МБ | 20 МБ |
Golang S3 | 30 мс | 29 мс | 128 МБ | 38 МБ |
- Python имеет самое длительное время нагрева на 128 ГБ ОЗУ,
- JavaScript является самым медленным в целом
- Golang является лучшим из трех, но не значительно
Интересный вариант — ускорить функцию Python lambda, добавив больше памяти, и одновременно CPU. Я думаю, это только уменьшит время нагрева. Вызов к S3 не станет менее запаздывающим.
В синтетическом тесте простые числа
от AWS — стоимость выполнения функции Python lambda такая же, как при использовании 128 МБ и 512 МБ лимита памяти,
а производительность настройки с 512 МБ значительно выше.
https://docs.aws.amazon.com/lambda/latest/operatorguide/computing-power.html
Что такое AWS SAM
Мы используем SAM для тестирования различных функций lambda здесь.
AWS SAM — это модель серверного приложения.
Проект AWS SAM включает в себя шаблон AWS SAM и код функции. Шаблон AWS SAM описывает, как развертывать, запускать и тестировать функцию lambda, разрешения и другие важные параметры для создания стека CloudFormation.
Для использования нам нужно aws cli
и sam cli
.
Установка AWS cli
Локальная инструкция: Установка AWS CLI в документе Reinstall linux
Или на сайте AWS: https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
Установка SAM cli
В общем случае — получить архиватор SAM cli с сайта AWS, распаковать и установить
wget https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip
unzip aws-sam-cli-linux-x86_64.zip -d sam-installation
sudo ./sam-installation/install
# проверить установку SAM
sam --version
Очистить файлы установщика
rm -rf sam-installation
rm aws-sam-cli-linux-x86_64.zip
Создание функций lambda
Вызовить скрипт трижды
sam init
и каждый раз выбирать шаблон hello-world, но на разных языках, мы создаем три приложения SAM
Функция AWS Lambda на основе Python 3.12
выход sam init
:
-----------------------
Генерация приложения:
-----------------------
Имя: t1-py
Среда выполнения: python3.12
Архитектуры: x86_64
Управление зависимостями: pip
Шаблон приложения: hello-world
Каталог вывода: .
Файл конфигурации: t1-py/samconfig.toml
Далее можно найти в файле README в t1-py/README.md
Команды, которые можно использовать далее
=========================
[*] Создать пайплайн: cd t1-py && sam pipeline init --bootstrap
[*] Проверить шаблон SAM: cd t1-py && sam validate
[*] Тестировать функцию в облаке: cd t1-py && sam sync --stack-name {stack-name} --watch
Функция AWS Lambda на основе JavaScript и nodejs20.x
выход sam init
:
-----------------------
Генерация приложения:
-----------------------
Имя: t2-js
Среда выполнения: nodejs20.x
Архитектуры: x86_64
Управление зависимостями: npm
Шаблон приложения: hello-world
Каталог вывода: .
Файл конфигурации: t2-js/samconfig.toml
Далее можно найти в файле README в t2-js/README.md
...
Функция AWS Lambda на основе Golang (образ aws al2023)
выход sam init
:
-----------------------
Генерация приложения:
-----------------------
Имя: t3-go
Среда выполнения: go (provided.al2023)
Архитектуры: x86_64
Управление зависимостями: mod
Шаблон приложения: hello-world
Каталог вывода: .
Файл конфигурации: t3-go/samconfig.toml
Далее можно найти в файле README в t3-go/README.md
Сборка, тестирование, развертывание и выполнение — функция Lambda на основе Python
тестирование локально
sam build --use-container
выход показывает в конце:
Команды, которые можно использовать далее
=========================
[*] Проверить шаблон SAM: sam validate
[*] Вызвать функцию локально: sam local invoke
[*] Тестировать функцию в облаке: sam sync --stack-name {{stack-name}} --watch
[*] Развернуть: sam deploy --guided
после выполнения трех раз
sam local invoke
выход, который мы видим:
REPORT RequestId: 3b36575a-629d-40ba-adb7-018bdb8cae63 Init Duration: 0.09 ms Duration: 46.95 ms Billed Duration: 47 ms Memory Size: 128 MB Max Memory Used: 128 MB
...
REPORT RequestId: e1233b8a-99c6-49d9-ab91-f02408a5ec6f Init Duration: 0.07 ms Duration: 44.56 ms Billed Duration: 45 ms Memory Size: 128 MB Max Memory Used: 128 MB
...
REPORT RequestId: 34772494-39ff-457d-a1c1-16cd5e177b42 Init Duration: 0.02 ms Duration: 26.35 ms Billed Duration: 27 ms Memory Size: 128 MB Max Memory Used: 128 MB
если мы добавим вызов S3, выход будет отличаться
...
REPORT RequestId: 158b806c-852d-4f6b-ab28-cdd6e0868fa1 Init Duration: 0.02 ms Duration: 675.64 ms Billed Duration: 676 ms Memory Size: 128 MB Max Memory Used: 128 MB
...
REPORT RequestId: d4cc689c-f944-49fa-9254-555266816b97 Init Duration: 0.79 ms Duration: 465.80 ms Billed Duration: 466 ms Memory Size: 128 MB Max Memory Used: 128 MB
...
REPORT RequestId: b8d30096-cd93-4787-84d7-e8f52d7e2e13 Init Duration: 0.02 ms Duration: 447.83 ms Billed Duration: 448 ms Memory Size: 128 MB Max Memory Used: 128 MB
Хорошо, каждый вызов занимает 0.5 секунды, и использованная память составляет 128 МБ
тестирование на AWS
sam build --use-container
sam deploy --guided
SAM cli попросит о имени стека CloudFormation, затем подтверждение, затем развернет нашу функцию на AWS. Последняя страница выхода SAM будет выглядеть примерно так
Предварительный просмотр изменений CloudFormation
======================================================
Развернуть этот изменений CloudFormation? [y/N]: Y
2024-08-17 20:19:30 - Ожидание завершения создания/обновления стека
События CloudFormation из операций стека (обновление каждые 5.0 секунд)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus ResourceType LogicalResourceId ResourceStatusReason
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE_IN_PROGRESS AWS::CloudFormation::Stack t1-py User Initiated
CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole -
CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole Resource creation Initiated
CREATE_COMPLETE AWS::IAM::Role HelloWorldFunctionRole -
CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction -
CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction Resource creation Initiated
CREATE_COMPLETE AWS::Lambda::Function HelloWorldFunction -
CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi -
CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi Resource creation Initiated
CREATE_COMPLETE AWS::ApiGateway::RestApi ServerlessRestApi -
CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermissionProd -
CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d5f9d -
CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermissionProd Resource creation Initiated
CREATE_COMPLETE AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermissionProd -
CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d5f9d Resource creation Initiated
CREATE_COMPLETE AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d5f9d -
CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage -
CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRest