Производительность AWS Lambda: JavaScript, Python и Golang

Какой язык использовать для AWS Lambda?

Содержимое страницы

Мы можем написать функцию lambda для развертывания на AWS на нескольких языках. Давайте сравним производительность (почти пустых) функций, написанных на JavaScript, Python и Golang…

Логотип функции AWS Lambda

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