Улучшение производительности PostgreSQL pg_restore с 130 часов - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь сократить время восстановления резервной копии базы данных PostgreSQL, используя pg_restore. Файл резервной копии, сжатый gzip, размером 29 ГБ, создается из базы данных 380 ГБ PostgreSQL с использованием pg_dump -Z0 -Fc, переданной в pigz.

. В течение pg_restore размер базы данных увеличивается со скоростью 50 МБ / минута, оцененная с использованием запроса SELECT pg_size_pretty(pg_database_size()). При такой скорости потребуется приблизительно 130 часов для завершения восстановления, что является очень длительным временем.

При дальнейшем исследовании выясняется, что загрузка ЦП низкая, несмотря на установку pg_restore для использования 4 рабочих.

enter image description here

Скорость записи на диск и IOPS также очень низки:

enter image description here enter image description here

Сравнительный анализ ввода-вывода системы с использованием fio показал, что он может выполнять запись 300 МБ / с и 2000 операций ввода-вывода в секунду, поэтому мы используем только около 20% потенциальных возможностей ввода-вывода.

Есть ли способ ускорить восстановление базы данных?

Система

  • Ubuntu 18.04.3
  • 1 vCPU, 2 ГБ оперативной памяти, 4 ГБ подкачки
  • 500 ГБ ZFS (двухсторонняя зеркальная матрица)
  • PostgreSQL 11,6
  • TimescaleDB 1,60

Шаги, предпринятые для выполнения восстановления:

  1. Распакуйте файл .gz в /var/lib/postgresql/backups/backup_2020-02-29 (~ 40 минут)

  2. Изменить postgresql.conf настройки

work_mem = 32MB
shared_buffers = 1GB            
maintenance_work_mem = 1GB      
full_page_writes = off
autovacuum = off
wal_buffers = -1

pg_ctl restart

Выполните следующие команды внутри psql:

CREATE DATABASE database_development;
\c database_development
CREATE EXTENSION timescaledb;
SELECT timescaledb_pre_restore();

\! time pg_restore -j 4 -Fc -d database_development /var/lib/postgresql/backups/backup_2020-02-29

SELECT timescaledb_post_restore();

1 Ответ

1 голос
/ 02 марта 2020

Ваша система баз данных привязана к вводу / выводу, как вы можете видеть из значения %iowait 63,62.

Увеличение maintenance_work_mem может немного улучшить ситуацию, но, по сути, вам нужно более быстрое хранилище.

...