Что является причиной задержки холодного запуска в AWS Lambda?

У меня есть лямбда-функция, написанная на Java, доступ к которой осуществляется через API Gateway. В сценариях "холодного старта" фактическому коду требуется 1,5 секунды для завершения выполнения (проверено из журналов Cloudwatch), но для получения окончательного ответа в API Gateway требуется более 10 секунд. Это раздражает.

Я захватил рентгеновские трассировщики для сценариев холодного старта и горячего старта.

Может кто-нибудь помочь мне в решении этой проблемы производительности?

Холодный запуск: Холодный запуск

Горячий старт: Горячий старт

1 ответ

Возможное решение для устранения "холодных" запусков, написанных на Java: добавление большего объема памяти для лямбды, а также есть еще один подход для уменьшения "холодных" запусков: используйте инструмент Graal native-image. Баночка переводится в байт-код. По сути, мы будем выполнять часть работы, которая выполняется на AWS. Когда вы создаете свой код, при загрузке в AWS - выберите "Custom runtime", а не java8.

Полезная статья: https://engineering.opsgenie.com/run-native-java-using-graalvm-in-aws-lambda-with-golang-ba86e27930bf

Осторожно:

но это также имеет свои ограничения; он не поддерживает динамическую загрузку классов, а поддержка отражений также ограничена

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

Среда выполнения Java имеет самый длинный холодный запуск, а среда выполнения Python имеет самый короткий.

https://medium.com/@nathan.malishev/lambda-cold-starts-language-comparison-%EF%B8%8F-a4f4b5f16a62

Здесь есть два пути вперед: а) Как уже говорили другие, увеличьте память. б) Отправить запрос в функцию лямбда-функции для ее прогрева, и поскольку лямбда-контейнеры AWS не имеют длительного срока службы, вам придется делать это довольно часто.

Есть несколько факторов, которые могут способствовать длительному прогреву: а) Если лямбда находится в vpc, присоединение ENI может занять некоторое время. б) HTTPS звонки в вашей лямбде.

Под капотом находится контейнер с лямбдой. Срок службы этого контейнера не очень велик, и каждый раз, когда он запускается, первоначальному запросу требуется некоторое время, чтобы прогреть контейнер. Дело в том, что вы не можете избежать холодных запусков, они всегда будут происходить. Я лично обнаружил, что при написании Java очень заметно, что первоначальный запрос всегда занимает намного больше времени.

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

Холодные запуски случаются, когда вы некоторое время не запускаете работу с лямбда-функцией. Амазонка просто закрывает контейнер, содержащий ваш код. Замедление, которое вы видите, - это просто время, потраченное amazon на пробуждение контейнера, загрузку вашей лямбда-функции (может потребоваться больше времени, если вы используете технологию статического кода, такого как Java, должно быть медленнее с JS, например) и ее фактический запуск (что кажется в вашем случае незначительным по сравнению со всем временем работы амазонки).

Взгляните на этот интересный пост в блоге о лямбда-холодных запусках: https://medium.com/thundra/dealing-with-cold-starts-in-aws-lambda-a5e3aa8f532

Хитрость здесь заключается в том, чтобы червить вашу функцию либо с помощью поддельного вызова (программы schedler), либо с помощью плагинов, таких как лямбда-подогреватель

Примечание. Лямбда-дизайн предназначен для обработки событий, а не для реальных веб-приложений. Если вы сохраняете лямбду-червя, вы получите такую ​​же цену, как EBS или EC2.

Если ваш сценарий использования требует миллисекунды, выбирайте компьютерные или кубернатику.

Другие вопросы по тегам