AWS RDS MSSQL 2022 занимает чрезвычайно много времени на простой запрос в небольшой таблице (26 секунд против 1,5 секунд)

Вопрос или проблема

Мне пришлось срочно перенести веб-сайт 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, что в условиях высокой нагрузки может приводить к значительным замедлениям.

Применение

  1. В первую очередь, следует рассмотреть возможность изменения класса экземпляра RDS: Переход на более мощный вариант, такой как t3.small или даже t3.medium, может обеспечить значительное улучшение производительности за счет увеличения числа vCPU и RAM. Это обеспечит более быструю обработку запросов и уменьшение времени их выполнения.

  2. Оптимизация конфигурации базы данных: Возможно, имеет смысл перейти на другой класс хранения, например, с режимом General Purpose SSD (gp2) на Provisioned IOPS (io1). Это обеспечит более предсказуемую и надежную производительность ввода-вывода.

  3. Проверка и оптимизация сетевых настроек: Убедитесь, что экземпляр RDS и серверы приложения максимально приближены друг к другу по географическому расположению в AWS регионах. Используйте AWS Direct Connect для минимизации задержек, если это возможно.

  4. Рассмотрите возможность использования кэша или более сложных архитектур на базе AWS: Такие службы, как Amazon ElastiCache, могут помочь снизить нагрузку на RDS, кэшируя часто используемые запросы.

  5. Рассмотрите сценарии использования AWS RDS: Возможно, текущие конфигурации и настройки не соответствуют вашим производственным потребностям и нужно перейти на более подходящий класс обслуживания.

  6. Изучите возможность оптимизации самого SQL-запроса: Проверьте наличие индексов на колонке NormalizedEmail. Индексы могут значительно ускорить выполнение запроса, ведь сортировка данных происходит по индексированному столбцу.

  7. Контролируйте используемые ресурсы: Например, использование мониторинга через AWS CloudWatch для оценки нагрузок на сервер. Это поможет определить, не происходит ли перепотребление CPU или памяти.

Заключение

AWS RDS — это мощное средство для управления базами данных с большим количеством опций и настраиваемых параметров для достижения оптимальной производительности. Однако без должной конфигурации и понимания ограничений базовых инстансов, таких как t3.micro, могут возникать проблемы с производительностью. Нужно проявить гибкость, возможно, перейти на более подходящую платформу или конфигурацию, чтобы получить оптимальную производительность как для девелоперских, так и для производственных целей.

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

Капча загружается...