Как управлять холодным запуском Lambda VPC и справиться со смертельной задержкой

1656597137 kak upravlyat holodnym zapuskom lambda vpc i spravitsya so smertelnoj

Натан Малышев

1*q7SupkVtOxSPIilJni9-1w
Фото Итана Ху на Unsplash

Все бессерверные вычисления страдают от боялсяхолодный пуск», и AWS Lambda ничем не отличается. Я уже исследовал холодные запуски в предыдущей статье. Но неизвестно, как использование Lambda в сочетании с виртуальным частным облаком влияет на задержку. Из разных отчетов в Интернете можно добавить холодные запуски в VPC до 10 секунд задержки! ?

Фон

AWS Lambda и бессерверные вычисления изменяют парадигму вычислений, выполняя код по требованию. И да, это значит, что вы платите только тогда, когда ваш код выполняется! ?

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

Но хорошие новости: ожидается, что эти холодные старты будут исключительными, повлияв лишь на 5% казней. Поэтому, хотя они встречаются не постоянно, их важно подумать при разработке программы.

1*HsUccdkDffywiUjM7AYdFw
Обычный холодный пуск (скриншот с видео)

Виртуальное частное облако (VPC) это частная сеть, в которой вы строго контролируете входящий и исходящий сетевой трафик. Они широко используются, и традиционно вы безопасно запускаете свои базы данных и серверы по вашему VPC, открывая только балансировщик нагрузки. Если у вас есть строгие требования к безопасности или услуги уже при VPC, к которым вам нужен доступ, возможно, вам придется развернуть свои функции Lambda в VPC.

Дополнительная сложность использования лямбда функции внутри VPC создает новые задержки. Эти задержки вызваны созданием эластичного сетевого интерфейса, а затем ожиданием, пока Lambda назначит себе этот IP-адрес. Также будьте осторожны, каждая функция Lambda требует IP-адреса, и вы не хотите, чтобы она истекла!

1*FCpFITtI7oxassyWOQdrKw
Холодный старт в VPC (скриншот с видео)

Это дополнительные затраты на сеть, с которыми вы ничего не можете сделать, кроме как избежать VPC. Итак, как это плохо?

Настройка

Чтобы проверить влияние VPC и холодных запусков, я создал два почти идентичных стека CloudFormation.

CloudFormation – это инфраструктура как код, поддерживаемый AWS. Возможно, вы слышали о таких продуктах, как Terraform или Ansible, которые являются прекрасной альтернативой. Большим преимуществом CloudFormation является тесная интеграция с AWS и ее внутренними функциями.

AWS Семь является превосходным расширением CloudFormation, значительно уменьшающим сложность развертывания лямбда-функции. Он связывает несколько ресурсов облачной формовки вместе, поэтому вам не нужно отдельно управлять ими для развертывания функции лямбда. Это также облегчает процесс развертывания, легко заархивируя и разворачивая ваш код на S3. Он также имеет особенности встроенные в развертывание Canary! Но есть прекрасные альтернативы, такие как бессерверный, если вам нравится быть агностиком от облака.

Эта статья не о CloudFormation и Сэме. но если вы хотите увидеть, оставьте комментарий 🙂

0*teE_0mjhNDaQCTRz
AWS Сэм отличный!

Два моих стека являются стеками CloudFormation с расширением AWS Sam. Они оба имеют простую функцию чтения и записи, написанную на Golang. Эти функции читаются и записываются в один экземпляр AWS Aurora RDS. Разница в том, что один стек находится в приватной подсети и требует дополнительных накладных расходов на холодный запуск.

Экземпляры VPC и RDS управляет только CloudFormation, в то время как функциями API Gateway и Lambda управляет расширение Sam.

1*LwyfJUjmHsFbdMgGpLj57g
Диаграмма пытается дать наглядное представление о двух стеках и как руководствуется их развертыванием.

Ниже приведена суть стека №1:

Другой стек и остальной код можно найти в моем репозитории GitHub здесь.

Результаты

Я запустил эти стеки с автоматизированным правилом CloudWatch, чтобы каждый час запускать функции Лямбда. Я развернул стеки с разной степенью оперативной памяти: 128 МБ, 1536 Мб и 3008 Мб. На графике ниже все значения выше 5-секундной отметки взяты из стека №2 (внутри VPC), а все значения ниже – из стека №1 (вне VPC).

1*16yC8qApBwQirGLItTPtjA
Лямбда – функции чтения и записи со стеков №1 и №2. Поиграйте с графиком здесь

Интересно отметить, что ко всем точкам данных добавление a VPC увеличило время холодного запуска в среднем на 8,83 с. Казалось, увеличение оперативной памяти снизило время холодного запуска, добавленное VPC.

1*GwWZRFPuYZ8qx0cBRFiH2A
Среднее время холодного запуска для стеков и конфигураций оперативной памяти

Похоже, Интернет был прав, и развертывание ваших функций Lambda в VPC добавляет огромные накладные расходы. Одна только задержка на 8 секунд – это ужасный опыт. Если программа правильно отделена, запуск нескольких холодных запусков окажет негативное влияние на работу пользователя.

Когда VPC?

Вы действительно должны размещать свои лямбда-функции в VPC только тогда, когда вам абсолютно нужен доступ к ресурсам, которые не могут быть открыты для внешнего мира. Иначе вы будете платить за это при запуске и это имеет значение. Как подчеркнул Ян Цуй в своей статье «Вы думаете о холодных запусках неправильно», холодные запуски могут произойти в любое время, особенно во время пикового использования услуг.

1*4RwbY1CiZC2jzsD7jBtIlQ
Дерево решений для Lambda и VPC из их бессерверной белой книги

Попался?

Если вам нужно использовать VPC, помните, что каждый раз, когда выполняется функция Lambda, она использует часть вашей емкости ENI из подсети. В документации AWS утверждается, что вы должны иметь достаточный потенциал ENI для поддержания ваших требований к масштабированию лямбда. Если у вас закончится емкость ENI, это приведет к отказу ваших лямбда-функций!

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

ENI Capacity = Projected peak concurrent executions * (Memory in GB / 3GB)

ENI Capacity = Количество IP-адресов в вашей подсети

Memory in GB = RAM, предназначенная для вашей функции лямбда

Например, подсеть 10.0.70.0/24 имеет 251 доступную подсеть. Если нам назначена лямбда-функция с 1,5 ГБ оперативной памяти:

251 = пиковое одновременное выполнение проекта *(1,5/3)

Прогнозируемый пик одновременных (лямбда) исполнения = 502

Так как ваше одновременное выполнение лямбда напрямую зависит от IP-адресов, доступных в подсетях, лучше использовать подсети, которая предоставляет вам более 1000 IP-адресов.

Если вы не уверены, вы можете выполнить вычисления и убедиться, что распределение оперативной памяти для всех ваших лямбда функций в определенной подсети соответствует вашим доступным IP-адресам.

Спасибо, что прочли! Если вам понравилось, не забудьте похлопать.

Ссылки

Первые слайды, показывающие варианты холодного запуска, взяты из доклада AWS Reinvent 2017 «Стань бессерверным черным поясом».

Модель AWS без сервера на GitHub.

Мой эксперимент Lambda VPC на GitHub.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *