В записи блога «Как создавать, публиковать и использовать слои для функций Lambda в Java 21» мы опубликовали наш первый уровень Lambda в Java 21. В этой статье мы создадим приложение, используя этот слой Lambda, а затем измерим холодный и теплый запуск. раз без включенного SnapStart, с включенным SnapStart, а также с примененной оптимизацией первичного вызова DynamoDB. Мы также сравним результаты с нашими измерениями без использования слоев Lambda и предоставления всех зависимостей в файле POM, что мы делали в статье Измерение холодных и теплых запусков с помощью Java 21 с использованием различных настроек памяти Lambda.
В нашем эксперименте мы будем использовать пример приложения. По сути, в шаблоне AWS SAM определены две функции Lambda, которые одновременно отвечают на запросы API-шлюза и извлекают продукт по идентификатору, полученному от API-шлюза из DynamoDB. Одну лямбда-функцию GetProductByIdWithPureJava21LambdaWithCommonLayer можно использовать со SnapStart и без него, а вторая GetProductByIdWithPureJava21LambdaAndPrimingWithCommonLayer использует инициализацию вызова SnapStart и DynamoDB.
Зависимости, предоставляемые через уровень Lambda, имеют область действия, «предусмотренную» в файле pom.xml нашего приложения.
Чтобы прикрепить слой Lambda, созданный в статье Как создать публикацию и использовать слои для функций Lambda Java 21 для функций Lambda в шаблоне AWS SAM, нам нужно добавить параметр Layers в функцию Lambda следующим образом:
Type: AWS::Serverless::Function Properties: FunctionName: GetProductByIdWithPureJava21LambdaWithCommonLayer AutoPublishAlias: liveVersion Layers: - !Sub arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:layer:aws-pure-java-21-common-lambda-layer:1 Handler: software.amazonaws.example.product.handler.GetProductByIdHandler::handleRequest
Пожалуйста, замените ARN слоя (включая версию) на свой собственный, который является результатом команды публикации слоя (aws лямбда-версия-публикации).
Результаты эксперимента, приведенного ниже, были основаны на воспроизведении более 100 холодных и примерно 100 000 теплых запусков в ходе эксперимента, который длился примерно 1 час. Для этого (и экспериментов из моей предыдущей статьи) я использовал инструмент нагрузочного тестирования, но вы можете использовать любой инструмент, который захотите, например Serverless-artillery или Postman.
Я провел все эти эксперименты, предоставив нашим функциям Lambda 1024 МБ памяти и передав следующую опцию компиляции через переменную среды: JAVA_TOOL_OPTIONS: "-XX: TieredCompilation -XX:TieredStopAtLevel=1" (компиляция клиента без профилирования), что обеспечивает очень хорошую компромисс между холодным и теплым временем запуска.
В таблицах ниже я также приведу результаты наших измерений без использования слоев Lambda, взятых из статьи Измерение холодного и теплого старта с помощью Java 21 с использованием различных настроек памяти Lambda, чтобы напрямую сравнить их.
Аббревиатура c означает холодный старт, а w означает теплый старт.
Время холодного (c) и теплого (w) запуска без SnapStart в мс:
Эксперимент | c стр.50 | c стр.75 | c стр.90 | c стр.99 | c стр.99.9 | максимум | стр50 | w стр75 | w стр90 | w стр.99 | w p99.9 | макс |
---|---|---|---|---|---|---|---|---|---|---|---|---|
с общим лямбда-слоем | 3497,91 | 3597,18 | 3695,58 | 3800,47 | 3908,33 | 4011,71 | 5,82 | 6,72 | 8.00 | 17,97 | 55,48 | 1709.13 |
без лямбда-слоя | 3157,6 | 3213,85 | 3270,8 | 3428.2 | 3601.12 | 3725.02 | 5,77 | 6,50 | 7,81 | 20,65 | 90,20 | 1423,63 |
Время холодного (c) и теплого (w) запуска с SnapStart без заполнения в мс:
Эксперимент | c стр.50 | c стр.75 | c стр.90 | c стр.99 | c стр.99.9 | максимум | стр50 | w стр75 | w стр90 | w стр.99 | w p99.9 | макс |
---|---|---|---|---|---|---|---|---|---|---|---|---|
с общим лямбда-слоем | 2047.12 | 2124.24 | 2439,49 | 2705,52 | 2735,43 | 2831,59 | 5,68 | 6.40 | 7,45 | 17.06 | 48,45 | 2139.74 |
без лямбда-слоя | 1626,69 | 1741.10 | 2040,99 | 2219,75 | 2319,54 | 2321,64 | 5,64 | 6,41 | 7,87 | 21.40 | 99,81 | 1355.09 |
Время холодного (c) и теплого (w) запуска с SnapStart и с вызовом DynamoDB. Загрузка в мс:
Эксперимент | c стр.50 | c стр.75 | c стр.90 | c стр.99 | c стр.99.9 | максимум | стр50 | w стр75 | w стр90 | w стр.99 | w p99.9 | макс |
---|---|---|---|---|---|---|---|---|---|---|---|---|
с общим лямбда-слоем | 713,88 | 766,38 | 1141,94 | 1181,41 | 1214,94 | 1215,32 | 5,59 | 6.30 | 7,39 | 16,39 | 45.09 | 574,61 |
без лямбда-слоя | 702,55 | 759,52 | 1038,50 | 1169,66 | 1179.05 | 1179,36 | 5,73 | 6,51 | 7,87 | 21,75 | 92,19 | 328,41 |
В этой статье мы создали приложение, используя уровень Lambda с общими зависимостями, а затем измерили время холодного и горячего запуска без включенного SnapStart, с включенным SnapStart, а также применили оптимизацию загрузки вызовов DynamoDB и сравнили результаты с нашими измерениями без использования Lambda. слоев и предоставление всех зависимостей в файле POM, что мы сделали в статье Измерение холодных и теплых запусков с помощью Java 21 с использованием различных настроек памяти Lambda.
Я несколько раз проводил измерения с использованием обычных слоев Lambda, чтобы действительно подтвердить результат моего эксперимента. Даже если у меня были некоторые отклонения в результатах между этими измерениями, тенденция всегда была одна и та же: при отключении SnapStart или включении его, но без использования первичного вызова DynamoDB, холодный запуск с использованием обычного Lambda Уровень был на несколько сотен миллисекунд выше по сравнению с упаковкой всех зависимостей только в файл POM. Только когда SnapStart был включен для функции Lambda и была применена подготовка вызова DynamoDB, холодные запуски при обоих подходах были очень близки, вероятно, из-за того, что все уже было в созданном снимке.
теплый запуск функции Lambda был довольно близким для обоих вариантов использования (с использованием слоев Lambda и без него), а также для всех экспериментов (с включенным SnapStart и без него) почти для всех процентилей, но я всегда получал более высокие результаты для максимального значения при использовании обычного слоя Lambda.
В следующей статье я продолжу эксперименты со слоями Lambda. На этот раз я создам, опубликую и буду использовать слой Lambda, содержащий не только общие зависимости (как в этой статье), но и все зависимости, необходимые для запуска этого приложения, а затем сравню результаты обоих экспериментов.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3