Создание индекса Postgres на RDS намного медленнее, чем на более слабом хосте Linux

Справочная информация:

  • Postgres 10.9
  • БД работает как контейнер докеров на хостах разработчиков. (t3.large, хранилище gp2 500 ГБ)
  • База данных работает в RDS для подготовки и производства. (m5.2xlarge, хранилище gp2 1 ТБ)

Все работает отлично, так было долгое время, и мои временные интервалы изменения БД кажутся всегда быстрее в prod / staging по сравнению с dev (как и ожидалось).

Проблема / вопрос:

У меня есть специальный индекс, который в RDS (который является более мощным) создается в 20 раз дольше, чем на локальном хосте разработчика. Во всех остальных случаях, которые я видел за последние пару лет, хост RDS работает быстрее, потому что он имеет большую вычислительную мощность и более высокую скорость ввода-вывода.

  • Данные и схема идентичны между экземплярами. Использование pg_dump + pg_restore для загрузки свежих данных в базы данных разработчиков каждую ночь.
  • Таблица относительно велика (30 миллионов строк) по сравнению с другими таблицами в моей базе данных (в основном менее 1 миллиона)

Это простая операция с индексами:

CREATE INDEX idx_email_records_created ON email_records (created_at);

На локальном Linux-сервере разработчика:

db=> CREATE INDEX idx_email_records_created ON email_records(created_at);
CREATE INDEX
Time: 68523.557 ms (01:08.524)

На хосте RDS:

db=> CREATE INDEX idx_email_records_created ON email_records(created_at);
CREATE INDEX
Time: 1490902.929 ms (24:50.903)

Я проверил все нормальные вещи: Загрузка процессора (много свободного в все случаи), Память (много свободной во всех случаях). Блокировка / использование таблиц и т. Д.

Хосты dev восстанавливаются с помощью свежего клона prod db каждую ночь, поэтому нет никаких расхождений в количестве строк.

Я проверил max_parallel и экспериментировал с такими вещами, как ] ALTER TABLE email_records SET (parallel_workers = ##); но, похоже, ничего не меняет.

Любая помощь приветствуется

3
задан 30 September 2020 в 03:29
1 ответ

Вот краткое изложение основной причины:

Время было собрано после восстановления моментального снимка RDS. По-видимому, это нормально, что экземпляр работает медленно после нового восстановления. Я никогда раньше не сталкивался с этой проблемой, но мне никогда раньше не приходилось работать с таким большим набором данных сразу после восстановления.

Подробнее см. здесь.:https://stackoverflow.com/questions/47545414/aws-rds-instance-created-from-snapshot-very-slow

В моем случае я просто выбрал всю таблицу для таблицы-нарушителя, чтобы как бы "предварительно-извлечь" данные из первоначального восстановления. Затем я запустил создание индекса, и он быстро завершился .

Таким образом, восстановление моментальных снимков RDS будет иметь затишье в производительности после нового восстановления.

Дополнительная информация:https://cintia.me/blog/post/lazy-rds/

Новые тома, созданные из существующих моментальных снимков EBS, лениво загружаются в фоновом режиме. Это означает, что после создания тома из моментального снимканет необходимости ждать, пока все данные будут переданы из Amazon S3 на ваш том EBS, прежде чем ваш подключенный экземпляр сможет начать доступ к тому и всем его данным.

4
ответ дан 29 September 2020 в 23:38

Теги

Похожие вопросы