«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Производительность AWS Lambda с использованием Java xvs — начальные измерения части

Производительность AWS Lambda с использованием Java xvs — начальные измерения части

Опубликовано 2 августа 2024 г.
Просматривать:664

AWS Lambda performance with Java  xvs arm- Part nitial measurements

Введение

До сих пор я не измерял производительность (время горячего и холодного запуска) функций Lambda с использованием среды выполнения Java 21 для некоторых случаев использования (например, выполнение запроса DynamoDB) для архитектуры Arm64, поскольку она не поддерживает SnapStart. Lambda со средой выполнения Java 21 с архитектурой x86_64 с включенным SnapStart превзойдет (тем более с дополнительной оптимизацией заполнения) Lambda с архитектурой Arm64. Но 18 июля 2024 года AWS объявила, что AWS Lambda теперь поддерживает функции SnapStart для Java, использующие архитектуру ARM64. Поэтому теперь для меня имело смысл начать измерять время холодного и теплого старта, учитывая также выбор архитектуры лямбда-функции. Известно, что при текущих ценах на память и продолжительности выполнения AWS Lambda Lambda с архитектурой Arm64 составит ок. На 25 % дешевле, чем Lambda с архитектурой x86_64.

Я решил создать для этого отдельную серию статей и не добавлять эту тему в мою постоянно растущую серию статей об AWS Lambda SnapStart.

Измерение холодного и теплого запуска для примера приложения

В нашем эксперименте мы будем повторно использовать приложение, представленное в статье AWS Lambda SnapStart — измерение холодного запуска Java 21 Lambda. Вот код примера приложения. По сути, существует две основные функции Lambda, которые отвечают на запросы шлюза API о создании продукта с заданным идентификатором (см. функцию PutProductFunction Lambda) и извлекают продукт по заданному идентификатору (см. функцию GetProductByIdFunction Lambda). Вы можете использовать обе функции Lambda с включенным SnapStart и без него. Существует дополнительная функция Lambda GetProductByIdWithPrimingFunction, которую я написал для независимого измерения эффекта загрузки запроса DynamoDB для функции Lambda с поддержкой SnapStart. Подробнее об эффекте прайминга можно прочитать в моей статье AWS Lambda SnapStart — Измерение прайминга, сквозной задержки и времени развертывания.

Чтобы включить SnapStart для всех функций Lambda, раскомментируйте следующее в шаблоне SAM:

Globals:
  Function:
    CodeUri: target/aws-pure-lambda-snap-start-21-1.0.0-SNAPSHOT.jar
    ...
    SnapStart:
     ApplyOn: PublishedVersions  
   ...

Если я хочу использовать SnapStart только для отдельных, а не для всех функций Lambda, вам придется применить это определение SnapStart на уровне функции Lambda, а не на глобальном уровне функции.

Все функции Lambda имеют следующие начальные настройки:

  • Настройка памяти 1024 МБ
  • Клиент HTTP Apache по умолчанию, используемый для взаимодействия с базой данных DynamoDB
  • Опция компиляции Java "-XX: TieredCompilation -XX:TieredStopAtLevel=1", которая обеспечивает очень хороший компромисс между холодным и теплым временем запуска

В шаблоне SAM я добавил возможность определять архитектуру Lambda в разделе глобальной функции Lambda, например:

Globals:
  Function:
    CodeUri: target/aws-pure-lambda-snap-start-21-1.0.0-SNAPSHOT.jar
    ...
    Architectures:
      #- arm64
      - x86_64   

Просто раскомментируйте архитектуру, которую вы хотите использовать для своих функций Lambda.

Даже если Java - это «напиши один раз, запусти везде», я все равно скомпилировал и создал jar-файл приложения для моих измерений Arm64 на экземпляре t4g AWS EC2 с процессором Graviton (который основан на архитектуре Arm64/aarch64), предварительно установив Amazon Corretto 21 для Linux aarch64. Вы можете найти эту банку здесь.

Я также еще раз переизмерил все для архитектуры x86_64, чтобы получить сопоставимые результаты, используя ту же самую последнюю версию среды выполнения Corretto Java 21, которая на момент моих измерений была Java 21.v17 .

Результаты приведенного ниже эксперимента были основаны на воспроизведении более 100 холодных и примерно 100 000 теплых запусков. Для этого (и экспериментов из моей предыдущей статьи) я использовал инструмент нагрузочного тестирования, но вы можете использовать любой инструмент, который захотите, например Serverless-artillery или Postman. Также важно помнить, что я начал измерения сразу после (повторного) развертывания свежего исходного кода приложения. Обратите внимание, что многоуровневый кэш моментальных снимков также влияет на холодный запуск, когда первые вызовы обычно выполняются медленнее, а последующие становятся быстрее, пока не будет достигнуто определенное количество вызовов.

Теперь давайте объединим все измерения для «получения продукта по существующему идентификатору» (лямбда-функции GetProductByIdFunction и GetProductByIdWithPrimingFunction для включенного SnapStart и начальных измерений) вместе.

Время холодного (c) и теплого (m) старта в мс:

Подход c стр.50 c стр.75 c стр.90 c стр.99 c стр.99.9 максимум стр50 w стр75 w стр90 w стр.99 w p99.9 макс
x86_64, SnapStart не включен 3554,30 3615,21 3666,15 3800,47 4108.61 4111,78 5.42 6.01 6,88 14.09 40,98 1654,59
arm64, SnapStart не включен 3834,81 3904,42 3983,26 4047,47 4332.13 4335,74 5,96 6,66 7,69 16.01 43,68 1844,54
x86_64, SnapStart включен без загрузки 1794.09 1846,86 2090.54 2204.27 2239,80 2240.08 5.37 5,96 6,93 15,88 51,64 1578,34
arm64, SnapStart включен без загрузки 1845.01 1953.18 2591,70 2762,91 2793,45 2795,8 5,91 6,56 7,63 16,75 63,52 1779,14
x86_64, SnapStart включен с предварительной отправкой запроса DynamoDB 803.18 870,18 1103,78 1258,19 1439,95 1440,67 5,55 6,25 7,45 15.50 63,52 448,85
arm64, SnapStart включен с предварительной отправкой запроса DynamoDB 910.14 1001,79 1376,62 1623,44 1684,60 1686,19 6.05 6,72 7,81 16,66 74,68 550,59

Заключение

В этой статье мы сравнили измерения времени холодного и горячего запуска функции Lambda, подключающейся к базе данных DynamoDB, для трех вариантов использования:

  • без включения SnapStart в функции Lambda
  • с включенным SnapStart для функции Lambda, но без оптимизации заполнения
  • с включенным SnapStart для функции Lambda и с отправкой запроса DynamoDB

Мы увидели, что при использовании архитектуры x86_64 время холодного и горячего запуска было меньше по сравнению с архитектурой Arm64. Но поскольку цена Lambda на архитектуру arm64 на 25 % дешевле, чем на архитектуру x86_64 , это приводит к очень интересному компромиссу между затратами и производительностью.

Для наших измерений, для всех трех вариантов использования:

  • Время холодного запуска Lambda с архитектурой Arm64 для многих процентилей было всего на 10–20 % (и лишь в очень редких случаях на 25–27 %) медленнее по сравнению с архитектурой x86_64.
  • Время горячего запуска Lambda с архитектурой Arm64 для многих процентилей было всего на 5–10 % медленнее по сравнению с архитектурой x86_64.

Итак, выбор архитектуры Arm64 для этого примера приложения вполне разумен. Поскольку поддержка SnapStart для архитектуры Arm64 появилась совсем недавно, я также ожидаю некоторого улучшения производительности в будущем. Пожалуйста, сделайте свои собственные измерения для вашего случая использования!

В следующей части статьи мы проведем те же измерения производительности, но установим для памяти Lambda разные значения от 256 до 2048 МБ и сравним результаты.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/aws-builders/aws-lambda- Performance-with-java-21-x86-vs-arm64-part-1-initial-measurements-506?1Если есть какие-либо нарушение, пожалуйста, свяжитесь с [email protected], чтобы удалить
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3