Вопрос или проблема
Мне пришлось срочно перенести веб-сайт ASP.NET из-за того, что SmarterAsp.net полностью исчез на 2 дня, что привело к отключению всех серверов и веб-сайтов клиентов, включая их собственный веб-сайт, который был недоступен в течение всего времени простоя.
Я остановился на AWS RDS с базой данных MSSQL 2022.
Но теперь веб-сайт невыносимо медленный.
Когда я подключаюсь с помощью HeidiSQL как к старой базе данных (теперь снова в сети), так и к новой базе данных AWS RDS, один и тот же простой запрос занимает 26,5 секунд против 1,0 секунды.
Это небольшая база данных размером 66 МБ, и этот запрос выполняется в таблице с 500 строками. Обе таблицы индексируются одинаково.
/* Вход в сеанс "MSSQL - SmarterAsp.net" */
SELECT TOP 1000 *
FROM dbo.AspNetUsers
ORDER BY NormalizedEmail;
/* Затронуто строк: 0 Найдено строк: 510 Предупреждений: 0 Время выполнения 1 запроса: 1,079 сек. */
/* Вход в сеанс "MSSQL - AWS RDS" */
SELECT TOP 1000 *
FROM dbo.AspNetUsers
ORDER BY NormalizedEmail;
/* Затронуто строк: 0 Найдено строк: 510 Предупреждений: 0 Время выполнения 1 запроса: 26,485 сек. */.
Что может быть причиной этого?
База данных работает на SQL Server Express Edition на db.t3.micro с 2 ГБ 1 vCPU (двигатель: 16.00.4175.1.v1 / default.sqlserver-ex-16.0). Даже когда база данных не используется, она работает на 35% CPU.
Amazon Web Services просто плохо подходит для размещения MSSQL?
Я даже не вижу никаких “Профессиональных” (в отличие от Dev/Testing или Free Tier) вариантов, которые стоили бы менее чем $220 в месяц на AWS.
[Обновление] Только что создал еще одну инстанцию MSSQL AWS RDS и импортировал резервную копию. При запуске запроса получаю почти идентичный результат:
SELECT TOP 1000 *
FROM dbo.AspNetUsers
ORDER BY NormalizedEmail;
/* Затронуто строк: 0 Найдено строк: 510 Предупреждений: 0 Время выполнения 1 запроса: 26,704 сек. */
За свои 20 лет работы инженером-программистом я никогда не видел ничего подобного.
AWS намеренно ограничивает запросы на уровне DEV/TEST?
Ответ или решение
Вопрос о значительном замедлении выполнения простого SQL-запроса на платформе AWS RDS с использованием Microsoft SQL Server 2022 действительно может внушать беспокойство, особенно в условиях, когда старый источник данных работал значительно быстрее. Давайте подробно рассмотрим возможные причины подобной ситуации и предложим пути её решения.
Теория
Производительность RDS и её зависимость от конфигурации: Amazon RDS предоставляет множество конфигурационных опций, однако для достижения высокой производительности необходимо учесть несколько факторов, таких как тип экземпляра, конфигурация ресурсов (память, CPU), а также используемую версию SQL Server. В данном случае используется т3.micro — это базовый уровень, предназначенный в первую очередь для девелоперских и тестовых целей, что может влиять на производительность ввиду ограничений ресурсов.
Дисковые операции и IOPS: Медленная обработка запросов также может быть связана с ограничениями на ввод-вывод операций (IOPS). Даже если таблица мала (500 строк и 66МБ), последовательные операции ввода-вывода могут повлиять на скорость выполнения запроса, особенно когда требуется выполнение сортировки (ORDER BY).
Сетевые задержки и использование ресурсов: Разница в производительности между локальным или другим размещением (например, SmarterAsp.net) и облачным провайдером может объясняться сетевыми задержками. AWS, как правило, старается минимизировать такие задержки, но если инстансы расположены в регионе, который географически далеко от вас или от архитектурных решений ASP.NET, это может внести вклад в замедление.
Пример
В данной ситуации запрос SELECT TOP 1000 * FROM dbo.AspNetUsers ORDER BY NormalizedEmail
выполняется значительно медленнее на AWS RDS. Это может быть связано с тем, что экземпляр t3.micro имеет ограниченные возможности в плане CPU и памяти — он предлагает всего 2 ГБ RAM и 1 vCPU, что в условиях высокой нагрузки может приводить к значительным замедлениям.
Применение
-
В первую очередь, следует рассмотреть возможность изменения класса экземпляра RDS: Переход на более мощный вариант, такой как t3.small или даже t3.medium, может обеспечить значительное улучшение производительности за счет увеличения числа vCPU и RAM. Это обеспечит более быструю обработку запросов и уменьшение времени их выполнения.
-
Оптимизация конфигурации базы данных: Возможно, имеет смысл перейти на другой класс хранения, например, с режимом General Purpose SSD (gp2) на Provisioned IOPS (io1). Это обеспечит более предсказуемую и надежную производительность ввода-вывода.
-
Проверка и оптимизация сетевых настроек: Убедитесь, что экземпляр RDS и серверы приложения максимально приближены друг к другу по географическому расположению в AWS регионах. Используйте AWS Direct Connect для минимизации задержек, если это возможно.
-
Рассмотрите возможность использования кэша или более сложных архитектур на базе AWS: Такие службы, как Amazon ElastiCache, могут помочь снизить нагрузку на RDS, кэшируя часто используемые запросы.
-
Рассмотрите сценарии использования AWS RDS: Возможно, текущие конфигурации и настройки не соответствуют вашим производственным потребностям и нужно перейти на более подходящий класс обслуживания.
-
Изучите возможность оптимизации самого SQL-запроса: Проверьте наличие индексов на колонке
NormalizedEmail
. Индексы могут значительно ускорить выполнение запроса, ведь сортировка данных происходит по индексированному столбцу. -
Контролируйте используемые ресурсы: Например, использование мониторинга через AWS CloudWatch для оценки нагрузок на сервер. Это поможет определить, не происходит ли перепотребление CPU или памяти.
Заключение
AWS RDS — это мощное средство для управления базами данных с большим количеством опций и настраиваемых параметров для достижения оптимальной производительности. Однако без должной конфигурации и понимания ограничений базовых инстансов, таких как t3.micro, могут возникать проблемы с производительностью. Нужно проявить гибкость, возможно, перейти на более подходящую платформу или конфигурацию, чтобы получить оптимальную производительность как для девелоперских, так и для производственных целей.