• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Quarkus 3 application on AWS Lambda- Part 2 Reducing Lambda cold starts with Lambda SnapStart

Lomanu4 Оффлайн

Lomanu4

Команда форума
Администратор
Регистрация
1 Мар 2015
Сообщения
1,481
Баллы
155
Introduction


In the

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

of our series about how to develop, run and optimize Quarkus web application on AWS Lambda, we demonstrated how to write a

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

which uses the Quarkus framework, AWS Lambda, Amazon API Gateway and Amazon DynamoDB. We also made the first Lambda performance (cold and warm start time) measurements and observed quite a big cold start time. In the next parts of the series we'll introduce Lambda SnapStart and measure how it reduces the Lambda cold start time.

Sample application with the activated AWS Lambda SnapStart without using priming


We'll re-use the same

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

introduced in the

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

of our series.

As we saw in part 1, without any optimizations, Lamdba performance measurements showed quite high values, especially for the cold start times.

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

is one of the optimization approaches to reduce the cold start times.

Lambda SnapStart can provide a start time of a lambda function of less than one second. SnapStart simplifies the development of responsive and scalable applications without provisioning resources or implementing complex performance optimizations.

The largest portion of startup latency (often referred to as cold start time) is the time Lambda spends initializing the function, which includes loading the function code, starting the runtime and initialising the function code. With SnapStart, Lambda initializes our function when we publish a function version. Lambda takes a Firecracker microVM snapshot of the memory and disk state of the initialised execution environment, encrypts the snapshot and intelligently caches it to optimize retrieval latency.

To ensure reliability, Lambda manages multiple copies of each snapshot. Lambda automatically patches snapshots and their copies with the latest runtime and security updates. When we call the function version for the first time and as the calls increase, Lambda continues new execution environments from the cached snapshot instead of initialising them from scratch, which improves startup latency. More information can be found in the article

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

. I have published the whole series about

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

.

To activate Lambda SnapStart, we have to do the following in

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

for the Lambda function:


Globals:
Function:
Handler: io.quarkus.amazon.lambda.runtime.QuarkusStreamHandler::handleRequest
CodeUri: target/function.zip
Runtime: java21
SnapStart:
ApplyOn: PublishedVersions
....

This can be done in the globals section of the Lambda functions, in which case SnapStart applies to all Lambda functions defined in the AWS SAM template, or you can add the 2 lines


SnapStart:
ApplyOn: PublishedVersions

to activate SnapStart only for the individual Lambda function. To perform the performance measurement without priming techniques, as we will introduce in methods 3 and 4, please either comment out or remove

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

annotation in the following 2 Java classes

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

and

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

.

Measurements of cold and warm start times of our application with Lambda SnapStart


In the following, we will measure the performance of our GetProductByIdFunction Lambda function, which we will trigger by invoking curl -H "X-API-Key: a6ZbcDefQW12BN56WEV318" https://{$API_GATEWAY_URL}/prod/products/1. Two aspects are important to us in terms of performance: cold and warm start times. It is known that Java applications in particular have a very high cold start time. The article Understanding the

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

provides a good overview of this topic.

The results of the experiment are based on reproducing more than 100 cold starts and about 100,000 warm starts with the Lambda function GetProductByIdFunction (we ask for the already existing product with ID=1 ) for the duration of about 1 hour. We give Lambda function 1024 MB memory, which is a good trade-off between performance and cost. We also use (default) x86 Lambda architecture. For the load tests I used the load test tool

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

, but you can use whatever tool you want, like

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

or

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

.

We will measure with tiered compilation (which is default in Java 21, we don't need to set anything separately) and compilation option XX:+TieredCompilation -XX:TieredStopAtLevel=1. To use the last option, you have to set it in

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

in JAVA_OPTIONS environment variable as follows:


Globals:
Function:
Handler: io.quarkus.amazon.lambda.runtime.QuarkusStreamHandler::handleRequest
...
Environment:
Variables:
JAVA_TOOL_OPTIONS: "-XX:+TieredCompilation -XX:TieredStopAtLevel=1"

Please also note the effect of the

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

. This means that in the case of SnapStart activation, we get the largest cold starts during the first measurements. Due to the tiered cache, the subsequent cold starts will have lower values. For more details about the technical implementation of AWS SnapStart and its tiered cache, I refer you to the presentation by Mike Danilov:

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

. Therefore, I will present the Lambda performance measurements with SnapStart being activated for all approx. 100 cold start times (labelled as all in the table), but also for the last approx. 70 (labelled as last 70 in the table), so that the effect of Snapshot Tiered Cache becomes visible to you. Depending on how often the respective Lambda function is updated and thus some layers of the cache are invalidated, a Lambda function can experience thousands or tens of thousands of cold starts during its life cycle, so that the first longer lasting cold starts no longer carry much weight.

To show the impact of the SnapStart, we'll also present the Lambda performance measurements without SnapStart being activated from the

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

.

Cold (c) and warm (w) start time with tiered compilation in ms:

Scenario Numberc p50c p75c p90c p99c p99.9c maxw p50w p75w p90w p99w p99.9w max
No SnapStart enabled3344342234943633390439075.926.838.0019.4650.441233
SnapStart enabled but no priming applied, all1643170319532007208420845.686.357.3916.3949.231386
SnapStart enabled but no priming applied, last 701604166417281798179817985.646.307.3315.8747.301286

Cold (c) and warm (w) start time with -XX:+TieredCompilation -XX:TieredStopAtLevel=1 compilation in ms:

Scenario Numberc p50c p75c p90c p99c p99.9c maxw p50w p75w p90w p99w p99.9w max
No SnapStart enabled3357345635544039406040606.016.838.1319.7753.741314
SnapStart enabled but no priming applied, all1593162517221834193019305.556.217.1616.0850.441401
SnapStart enabled but no priming applied, last 701574162116851801180118015.556.207.1615.1449.231401
Conclusion


In this part of the series, we introduced Lambda SnapStart and measured how its enabling reduces the Lambda cold start time by more than 50%. We also clearly observed the impact of the AWS SnapStart Snapshot tiered cache in our measurements.

In the part of our article series, we'll introduce how to apply Lambda SnapStart priming techniques by starting with DynamoDB request priming with the goal to even further improve the performance of our Lambda functions.


Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

 
Вверх Снизу