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

AWS SnapStart — часть. Измерение холодного и горячего старта Java с использованием различных алгоритмов сборки мусора.

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

AWS SnapStart - Part Measuring cold and warm starts with Java using different garbage collection algorithms

Введение

В предыдущих частях нашей серии мы измерили холодный запуск функции Lambda во время выполнения Java 21 без включенного SnapStart, с включенным SnapStart, а также применили оптимизацию первичного вызова DynamoDB с различными настройками памяти Lambda, размерами артефактов развертывания Lambda, Java параметры компиляции, (а) синхронные HTTP-клиенты и использование различных слоев Lambda. Для всех этих измерений мы использовали алгоритмы сборки мусора по умолчанию G1.

В этой статье мы хотели бы изучить влияние алгоритмов сборки мусора Java на производительность функции Lambda во время выполнения Java 21. Мы также переизмерим все, чтобы G1 имел сопоставимые результаты с той же второстепенной версией Java 21, используемой для всех алгоритмов сборки мусора.

Алгоритмы сборки мусора Java

Для наших измерений мы будем использовать следующие алгоритмы сбора данных Java с настройками по умолчанию (более подробную информацию о каждом алгоритме см. в связанной документации):

  • Сборщик мусора «Garbage-First» (G1). Это алгоритм сборки мусора, используемый по умолчанию. Вы можете задать его явно в шаблоне AWS SAM, добавив -XX: UseG1GC в переменную среды JAVA_TOOL_OPTIONS.
  • Параллельный коллектор. Вы можете установить его явно в шаблоне AWS SAM, добавив -XX: UseParallelGC к переменной среды JAVA_TOOL_OPTIONS.
  • Шенандоа GC. Oracle JDK не предоставляет этого, но Amazon Corretto 21 JDK предоставляет. Вы можете установить его явно в шаблоне AWS SAM, добавив -XX: UseShenandoahGC в переменную среды JAVA_TOOL_OPTIONS.
  • Сборщик мусора Z. Существует 2 разных алгоритма ZGC: по умолчанию и более новый, относящийся к одному поколению. Вы можете задать его явно в шаблоне AWS SAM, добавив -XX: UseZGC или -XX: UseZGC -XX: ZGeneration к переменной среды JAVA_TOOL_OPTIONS.

Измерение холодных и теплых запусков с помощью Java 21 с использованием различных алгоритмов сборки мусора

В нашем эксперименте мы будем использовать слегка модифицированное приложение, представленное в части 9. Код приложения можно найти здесь. По сути, существует две функции Lambda, которые отвечают на запросы API-шлюза и извлекают продукт по идентификатору, полученному от API-шлюза из DynamoDB. Одну лямбда-функцию GetProductByIdWithPureJava21LambdaWithGCAlg можно использовать со SnapStart и без него, а вторая GetProductByIdWithPureJava21LambdaAndPrimingWithGCAlg использует инициализацию вызова SnapStart и DynamoDB.

Результаты эксперимента, приведенного ниже, были основаны на воспроизведении более 100 холодных и примерно 100 000 теплых запусков в ходе эксперимента, который длился примерно 1 час. Для этого (и экспериментов из моей предыдущей статьи) я использовал инструмент нагрузочного тестирования, но вы можете использовать любой инструмент, который захотите, например Serverless-artillery или Postman. Мы проводим эксперименты, предоставляя функциям Lambda 1024 МБ памяти и используя JAVA_TOOL_OPTIONS: "-XX: TieredCompilation -XX:TieredStopAtLevel=1" (компиляция Java-клиента без профилирования), что обеспечивает очень хороший компромисс между холодным и теплым временем запуска.

К сожалению, мне не удалось запустить функцию Lambda, когда сборщик мусора Z (как по умолчанию, так и по поколению) столкнулся с ошибкой:

Failed to commit memory (Operation not permitted)
[error][gc] Forced to lower max Java heap size from 872M(100%) to 0M(0%)
[error][gc] Failed to allocate initial Java heap (512M)
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

Он пробовал установить больший объем памяти: 1024, 2048 МБ и даже больше МБ, но ошибка все равно появлялась.

Давайте посмотрим на результаты наших измерений с помощью трех других алгоритмов сборки мусора.

Аббревиатура c означает холодный старт, а w означает теплый старт.

Время холодного (c) и теплого (w) запуска без включения SnapStart в мс:

Алгоритм GC c стр.50 c стр.75 c стр.90 c стр.99 c стр.99.9 максимум стр50 w стр75 w стр90 w стр.99 w p99.9 макс
G1 3655,17 3725,25 3811,88 4019.25 4027,30 4027,83 5.46 6.10 7.10 16,79 48.06 1929,79
Параллельный коллектор 3714.10 3789,09 3857,87 3959,44 4075,89 4078,25 5,55 6.20 7.10 15,38 130,13 2017.92
Шенандоа 3963,40 4019.25 4096,30 4221,00 4388,78 4390,76 5,82 6,45 7,39 17.06 71.02 2159.21

Время холодного (c) и теплого (w) старта с включенным SnapStart без заполнения в мс:

Алгоритм GC c стр.50 c стр.75 c стр.90 c стр.99 c стр.99.9 максимум стр50 w стр75 w стр90 w стр.99 w p99.9 макс
G1 1867,27 1935.68 2152.02 2416,57 2426,25 2427,35 5,47 6.11 7.05 17.41 51,24 1522.04
Параллельный коллектор 1990.62 2047.12 2202.07 2402.12 2418,99 2419.32 5,68 6,35 7,45 18.04 147,83 1577,21
Шенандоа 2195,47 2301.07 2563,37 3004,89 3029.01 3030.36 5,73 6,41 7,51 17,97 75.00 1843,34

Время холодного (c) и теплого (w) запуска с включенным SnapStart и запуском DynamoDB в мс:

Алгоритм GC c стр.50 c стр.75 c стр.90 c стр.99 c стр.99.9 максимум стр50 w стр75 w стр90 w стр.99 w p99.9 макс
G1 833,50 875,34 1089,53 1205.26 1269,56 1269,8 5.46 6.10 7.16 16,39 46,19 499,13
Параллельный коллектор 900,18 975,12 1058,41 1141,94 1253,17 1253,99 5,82 6,61 7,75 16,87 49,64 487,73
Шенандоа 1065,84 1131,71 1331,96 1473,44 1553,59 1554,95 5,77 6.40 7,39 17.20 65.06 500,48

Заключение

В этой статье мы исследовали влияние алгоритмов сборки мусора Java (G1, Parallel Collector и Shenandoah) на производительность функции Lambda во время выполнения Java 21. Мы увидели значительную разницу в производительности этих алгоритмов. Используя настройки по умолчанию с G1 (по умолчанию), мы получаем (иногда намного) наименьшее время холодного и теплого запуска. При использовании SnapStart с отправкой запроса DynamoDB результаты производительности, как и ожидалось, намного ближе друг к другу.

Пожалуйста, обратитесь к документации каждого алгоритма сборки мусора, чтобы настроить такие параметры, как смешивание и максимальный объем памяти, которые могут обеспечить значительное улучшение производительности, и выполните собственные измерения.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/aws-builders/aws-snapstart-part-26-measuring-cold-and-warm-starts-with-java-21-using-dependent-garbage-collection-. алгоритмы- 8h3?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

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

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

Copyright© 2022 湘ICP备2022001581号-3