Рубрики
Uncategorized

Можем ли мы решить без серверов холодные запуска?

Поскольку все хорошее в жизни, Serverless также поставляется со своими недостатками. Один из них — печально известный … Tagged с помощью AWS, без серверов, DevOps, программирования.

Поскольку все хорошее в жизни, Serverless также поставляется со своими недостатками. Один из них — печально известный «холодный старт». В этой статье мы рассмотрим то, что они есть, что влияет на задержку запуска без сервера и как смягчить его воздействие в наших приложениях.

Что такое холодный старт?

Холодный старт относится к состоянию нашей функции при обслуживании конкретного запроса на вызов. Функция без сервера выполняется одним или несколькими микроконтенториями. Когда вступает запрос, наша функция проверит, есть ли контейнер, который уже работает для обслуживания вызова. Когда контейнер для холостого хода уже доступен, мы называем его «теплым» контейнером. Если контейнер легко доступен, функция развернет новую, и это то, что мы называем «холодным стартом».

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

Как работает начало холода?

Теперь, когда мы знаем, что такое «холодный старт», давайте покопаемся в том, как они работают. Внутренние работы могут отличаться от использования услуг, которую вы используете (AWS Lambda, Functions Azure и т. Д.) или проекта с открытым исходным кодом (OpenFAAS, Kubeless, OpenWhisk и т. Д.), Но в целом эти принципы применимы ко всем серверной вычислительной архитектуре.

После того, как запрос обслуживается контейнером без сервера, он обычно поддерживается в живых и простаивает в течение некоторого времени. Система оркестровки контейнеров будет иметь свои параметры, чтобы решить, следует ли отключить контейнер. Здесь есть компромисс: сохранение контейнера будет сэкономить ресурсы запуска и ускорить последующие запросы, но приведет к простоям временным затратам. AWS Lambda обычно поддерживает контейнеры в течение 30-45 минут. Иногда больше, чем это (особенно для лямбдов, работающих внутри VPC), но это не документированный или совершенный параметр, поэтому не доверяйте ему вслепую.

Когда контейнер начинается с холодного состояния, функция требует:

  1. Получите пакет, содержащий ваш код из внешнего постоянного хранилища;
  2. Раскрутить контейнер;
  3. Загрузите код пакета в память;
  4. Запустите метод/функцию обработчика вашей функции.

Эти шаги занимают некоторое время, особенно предметы от 1 до 3. Когда контейнер уже теплый, он прыгает прямо на № 4, что экономит много времени и заставляет наше приложение реагировать быстрее.

Что может улучшить задержку запуска?

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

  • Размер памяти : Чем больше памяти вы выделяете на свою функцию, тем быстрее она запустится;
  • Время выполнения : Обычно языки сценариев (Python, Ruby, JavaScript) работают намного лучше во время запуска по сравнению с составленным временем бега (Java, .net, C#); Я имею в виду, в 100 раз быстрее, это большое дело;
  • VPC : Функции, работающие в виртуальном частном облаке, будут страдать от дополнительной задержки, что обычно требует дополнительной секунды или двух для запуска; Попробуйте спроектировать ваши функции, чтобы запустить за пределами VPC;
  • Кодовый пакет размер : Чем больше размер, тем больше времени требуется, чтобы раскрутить новый контейнер, хотя это может быть наименее важным фактором, влияющим на задержку запуска;

Как решить — или смягчить — задержка запуска контейнера?

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

  • Мониторинг производительности и соответствующих индикаторов журнала
  • Увеличьте распределение памяти
  • Выберите более быстрое время выполнения
  • Сохраняйте общие данные в памяти
  • Сократить размер упаковки
  • Держите пул предварительно начисленных функций
  • Используйте прогнозирование временных рядов

Мониторинг производительности и соответствующих индикаторов журнала

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

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

Такие услуги, как Aws x-ray и Решетка Поддержите этот тип анализа вне коробки, сэкономив вам много времени в этом путешествии оптимизации производительности. Если вы выполняете функции без серверов в производстве для профессиональных проектов, использование такой услуги является обязательным.

Увеличьте распределение памяти

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

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

Языки сценариев, такие как Python и Ruby, могут работать значительно лучше, чем скомпилированное время выполнения. Ян Куй сделал Потрясающее сравнение языкового времени стартапа в AWS Lambda. Python был лучшим исполнителем, с более высоким временем запуска до 100 раз, чем другие претенденты, такие как Java, C#и Nodejs. Когда это возможно, подумайте о том, чтобы написать ваши без серверные функции на легком языке, таком как Python. Хотя выполнение сценария Python медленнее (из -за его интерпретированного характера), уменьшенная задержка запуска может компенсировать и обеспечить общую лучшую производительность (и более низкие счета от вашего облачного провайдера).

Держите общие данные в памяти, загрузив вне основной функции обработчика событий

Функции без серверов обычно имеют метод/функцию обработчика в качестве интерфейса между базовой инфраструктурой и нашей кодом. Функция обычно передает событие и контекст в качестве аргументов для нашей функции, и оттуда происходит наша магия.

Интересно, что у нас может быть код, работающий за пределами этого метода/функции. Допустим, каждый раз, когда наша функция вызывается, ей необходимо импортировать одни и те же сторонние библиотеки или, возможно, извлекать объект из внешнего хранилища. Вместо того, чтобы делать эти вещи после того, как метод/функция обработчика называется, мы можем сделать это за пределами обработчика, еще до того, как он будет вызван.

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

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

Сократить размер упаковки

Когда мы упаковываем наш код для функции без сервера, очень часто вкладывает файл Zippd, от файлов README до ненужных сторонних библиотек. Важно очистить наш пакет перед развертыванием в производстве, удаляя все, что не используется или не требуется для нашей функции для выполнения. Это будет способствовать более короткому временному началу запуска за счет сокращения внутренней задержки сетей — функция будет приносить меньший файл пакета.

Держите пул предварительно начисленных функций

Если вы все еще испытываете невыносимое время задержки холодного запуска, последняя среда-это регулярное задание, чтобы сохранить пул предварительно нагретых функций. Это работает так:

Настройте свои функции, чтобы идентифицировать вызовы потепления для короткого замыкания и очень быстро завершить запросы, не запустив весь код функции. Это может быть сделано путем передачи заранее определенного события в функцию, например: {«Тепло»: True}. Когда ваша функция обнаруживает этот аргумент события, просто остановите выполнение как можно быстрее.

Установите обычную работу (например, Cron), чтобы вызовать вашу функцию каждые несколько минут. Количество минут будет зависеть. AWS Lambda обычно поддерживает контейнеры в течение 30-45 минут, но это будет сильно различаться.

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

Джереми Дейл Открытый и интересный пакет Чтобы помочь управлять стратегиями потепления для AWS Lambda, вы можете проверить это. Серверная структура также имеет Полезный плагин .

Остерегайтесь последствий параллелистики: если вы сохраняете только один контейнер для вашей функции, а два параллельных запроса придут, один из них будет подан из теплого состояния, но второе будет холодным началом. Это потому, что только один контейнер теплый, и он может подавать только один запрос за раз. Если ваше приложение обычно обслуживает несколько параллельных запросов, рассмотрите это в своей стратегии потепления.

Получите фантазию с прогнозированием временных рядов для предварительной стратегии

Если вы действительно беспокоитесь о задержке холодного запуска, а нагрузка на приложение показывает большую дисперсию в количестве параллельных запросов, вы можете получить немного более причудливой. Вы можете использовать прогнозирование временных рядов, чтобы предвидеть, сколько контейнеров следует нагреваться в каждый момент времени. Statsmodels это проект с открытым исходным кодом, который предлагает наиболее распространенные алгоритмы для работы с временными сериями. Вот Хороший учебник Чтобы начать вас.

Нам нужно в основном образец временных рядов с двумя осями:

  1. Последовательность интервалов в течение определенного периода времени (например, интервалы 10 минут за последние 3 месяца)
  2. Максимальное количество одновременных запросов функция, обрабатываемая в течение этого интервала

На регулярной основе (например, каждые 10 минут) мы запустили бы прогнозирование временных рядов, чтобы предсказать, сколько контейнеров должно потребоваться одновременно, в течение следующего промежутка (например, в следующие 10 минут). Стратегия потепления будет скорректирована, чтобы убедиться, что это количество контейнеров было предварительно наряжено.

Одна положительная сторона использования статистического прогнозирования заключается в том, что оно вернет стандартное отклонение (SD). Учитывая вероятностное распределение ваших данных и SD, вы можете оценить уровень доверия ваших прогнозов. Скажем, вы хотите быть уверенным в своем прогнозе в 99% случаев; Вам необходимо взять прогнозируемое количество необходимых контейнеров и добавить SD, умноженный на коэффициент. Этот фактор будет зависеть от распределения ваших данных. Если обычно распределяется, фактор будет 2,58, например. Узнайте больше о Доверительный интервал В случае, если вы хотите глубже погрузиться в тему.

Дальнейшее чтение:

AWS Lambda Metrics Вы должны контролировать

Развертывание AWS Lambda с контейнерами Docker

Снимите свой счет AWS Lambda, увеличив размер памяти

Оригинал: «https://dev.to/dashbird/can-we-solve-serverless-cold-starts-pce»