В предыдущих частях нашей серии мы измерили холодный запуск функции Lambda во время выполнения Java 21 без включенного SnapStart, с включенным SnapStart, а также применили оптимизацию первичного вызова DynamoDB с различными настройками памяти Lambda, размерами артефактов развертывания Lambda, Java параметры компиляции, (а) синхронные HTTP-клиенты и использование различных слоев Lambda. Для всех этих измерений мы использовали алгоритмы сборки мусора по умолчанию G1.
В этой статье мы хотели бы изучить влияние алгоритмов сборки мусора Java на производительность функции Lambda во время выполнения Java 21. Мы также переизмерим все, чтобы G1 имел сопоставимые результаты с той же второстепенной версией Java 21, используемой для всех алгоритмов сборки мусора.
Для наших измерений мы будем использовать следующие алгоритмы сбора данных Java с настройками по умолчанию (более подробную информацию о каждом алгоритме см. в связанной документации):
В нашем эксперименте мы будем использовать слегка модифицированное приложение, представленное в части 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 результаты производительности, как и ожидалось, намного ближе друг к другу.
Пожалуйста, обратитесь к документации каждого алгоритма сборки мусора, чтобы настроить такие параметры, как смешивание и максимальный объем памяти, которые могут обеспечить значительное улучшение производительности, и выполните собственные измерения.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3