Я решил погрузиться в проблему холодного запуска Lambda, чтобы узнать, сколько времени занимает нормальный холодный запуск и какие конфигурации приводят к увеличению времени холодного запуска.
TL;DR
Наибольший вклад в увеличение времени холодного старта Lambda вносит общий размер пакета Lambda в S3.
Это означает, что чем больше кода в вашей лямбде или чем больше библиотек вы включаете в пакет, тем больше продолжительность холодного старта. Память, VPC, регион, уровни и архитектура набора команд оказывают минимальное влияние на время холодного старта.
Краткое определение холодного старта лямбда-функции
Когда функция Lambda получает запрос, служба сначала подготавливает среду выполнения. Подготовка среды выполнения включает в себя следующие задачи:
- Загрузить код из внутреннего ведра AWS S3.
- Создать среду с памятью, временем выполнения и заданной конфигурацией.
Эксперимент
Конфигурация лямбды
Я использовал следующую конфигурацию лямбд по умолчанию, а затем изменял одну конфигурацию для каждого тестового сценария:
- Время выполнения: Node.js 14
- Архитектура: X86_64
- Регион: eu-west-1
- Память: 128MB
- Не внутри VPC
Лямбда выполняла простой HTTP-вызов и возвращала данные с конечной точки, используя встроенную библиотеку https.
Как я собирал метрики
Я использовал AWS X-Ray для наблюдения и сбора метрик для выполнения Lambda. X-Ray измеряет время инициализации, вызова и накладных расходов (подробнее здесь) для каждого запроса Lambda, как показано ниже:
Для данного эксперимента нас интересует инициализация, поскольку она относится к тому, что более известно как время холодного старта. Именно на эту метрику я буду ссылаться как на время холодного старта в этой статье.
Результаты
Давайте посмотрим на некоторые цифры. Ниже я привожу результаты моего тестирования при анализе времени холодного старта для следующих конфигураций:
- Память
- Архитектура набора инструкций
- Регион
- VPC
- Библиотеки
- Лямбда-слои
Память
Уменьшает ли увеличение памяти лямбды время холодного запуска?
Я развертывал лямбду при различных объемах памяти, начиная от 128 МБ и заканчивая 10240 МБ.
Короткий ответ — нет, не совсем. Потенциальная экономия задержки за счет увеличения памяти, доступной для Lambda, составляет 15 миллисекунд.
Архитектура набора команд
Есть ли разница в холодном старте между архитектурой arm64 и x86_64?
Короткий ответ снова — нет, не совсем. Я обнаружил, что arm64 обеспечивает снижение времени холодного старта на 1 мс.
Регион
В некоторых регионах время холодного старта меньше, чем в других?
Я протестировал время холодного старта в 3 регионах AWS: eu-west-1, us-east-1 и ca-central-1.
И снова короткий ответ — нет, никакой реальной существенной разницы между регионами нет. Ни один из протестированных регионов не показал заметно более медленного или более быстрого времени холодного старта.
VPC
Я уже слышал, что Lambdas внутри VPC имеют более медленное время холодного старта по сравнению с Lambdas, не находящимися в VPC. Заметил ли я это во время тестирования?
Опять же, нет. Находится ли Lambda в VPC или нет, похоже, не влияет на время холодного старта. Lambda внутри VPC потребовалось на 1 мс больше для инициализации среды Lambda, что опять же не является существенной разницей для задержки.
Библиотеки
Увеличивает ли количество библиотек, включенных в ваш пакет Lambda, время холодного старта?
Я использовал следующие 5 пакетов для тестирования этого сценария, добавляя по одному пакету за тест:
- axios
- winston
- lodash
- момент
- ramda
Наконец-то я нашел конфигурацию, которая увеличивает время холодного запуска.
Количество библиотек, включенных в пакет Lambda, действительно влияет на время инициализации среды Lambda.
Без библиотек время холодного старта составляет 173 мс, что довольно мало. Но когда мы включаем в Lambda 5 пакетов, это время подскакивает до 515 мс. Почти на полсекунды больше. Что для API является существенной разницей, и потребитель API это заметит.
Это имеет смысл, если задуматься. Холодный старт — это время, которое требуется для загрузки пакета Lambda из S3. Поэтому если у нас больший размер пакета, то на его загрузку потребуется больше времени, что приведет к увеличению времени холодного старта.
Слой Lambda
Влияет ли наличие слоя, прикрепленного к Lambda, на время холодного старта?
Опять же, при добавлении слоя на Lambda время холодного старта не сильно отличалось. Время холодного старта без слоя на Lambda было всего на 2,5 мс быстрее.
Заключение
При использовании среды выполнения NodeJS 14 вы столкнетесь с временем холодного старта около 170 мс при конфигурации по умолчанию.
Единственным существенным фактором, влияющим на время холодного старта, было количество пакетов, используемых в Lambda. Другие конфигурации имели очень небольшую разницу во времени холодного старта, но могут привести к большей разнице, если использовать их в комбинации.
Например, вы можете увидеть разницу, если используете Lambda в VPC с несколькими уровнями Lambda.
Сводка всех собранных данных:
Память
Лямбда с памятью 2048 МБ имела более медленный холодный старт на 15 мс по сравнению с Лямбдой с памятью 8192 МБ или 10240 МБ.
Архитектура набора команд
У x86_64 время холодного старта составило 173 мс по сравнению с arm64, у которой время холодного старта было на 1 мс меньше — 172 мс.
Регион
us-east-1 имел самое высокое время холодного старта — 179,5 мс. ca-central-1 имел самое быстрое время холодного старта — 168,5.
VPC
Лямбда внутри VPC на 1 мс медленнее, чем Лямбда, не находящаяся внутри
VPC.
Библиотеки
У лямбды без библиотек холодный старт был на 342,5 мс быстрее, чем у лямбды с 5 библиотеками.
Слой лямбды
Лямбда без слоя была на 2,5 мс быстрее, чем лямбда с 1 слоем.
Обеспеченный параллелизм
Отмечу, что я также экспериментировал с обеспеченным параллелизмом, который действительно приводит к 0 мс времени инициализации. Если вас беспокоит время холодного старта, возможно, стоит обратить на это внимание.