У меня есть бэкэнд C #, работающий на AWS Lambda. Он подключается к базе данных PostgreSQL в том же регионе.
Я заметил очень медленное время запуска при холодном запуске после добавления кода подключения к БД. После выделения большего объема памяти для моей лямбда-функции время выполнения значительно сократилось.
Время выполнения, измеренное с помощью лямбда-консоли:
- 128 МБ (~ 15,5 с)
- 256 МБ (~ 9 секунд)
- 384 МБ (~ 6 секунд)
- 512 МБ (~ 4,5 с)
- 640 МБ (~ 3,5 с)
- 768 МБ (~ 3 с)
Напротив, после комментирования кода подключения к БД:
- 128 МБ (~ 5 с)
- 256 МБ (~ 2,5 с)
Таким образом, открытие соединения с БД сильно повлияло на время выполнения.
Согласно документации AWS:
В модели ресурсов AWS Lambda вы выбираете объем памяти, который вы
хотите для вашей функции, и выделяются пропорциональные мощности процессора и
другие ресурсы.
Поскольку пиковое использование памяти постоянно оставалось на уровне ~ 45 МБ, это явление, по-видимому, предполагает, что установление соединения с базой данных является вычислительно-интенсивной операцией. Если так, то почему?
Код, о котором идет речь (я использую Npgsql ):
var conn = new NpgsqlConnection(Db.connStr);
conn.Open();
using(conn)
{ // print something }
Обновление 1
Я установил экземпляр MariaDB с той же конфигурацией и провел некоторое тестирование.
Использование MySql.Data для синхронной работы:
- 128 МБ (~ 12,5 с)
- 256 МБ (~ 6,5 с)
Использование MySqlConnector для асинхронной работы:
- 128 МБ (~ 11 сек)
- 256 МБ (~ 5 с)
Интересно, что время выполнения на моем ноутбуке увеличилось с ~ 4 секунд (для Npgsql) до 12 ~ 15 секунд (для MySql.Data и MySqlConnector).
На этом этапе я просто выделю больше памяти для функции Lambda, чтобы решить эту проблему. Но если кто-нибудь знает, почему установление соединения заняло так много времени, я был бы признателен за ответ. Я могу опубликовать некоторые результаты профилирования позже.