Сохранять статистические данные из stats_temp_directory Postgres по требованию

Мы исследуем нагрузку ввода-вывода в одной из наших виртуальных машин и возможности ее оптимизации, и она показала, что большая часть нагрузки генерируется сборщиком статистики PostgreSQL. Он прыгает между 3,5 и 6,5 МБ / с. Я уже нашел несколько интересных источников по этой теме, и они предложили использовать tmpfs для хранения большей части статистики в памяти, что имеет смысл для меня, и у конкретной виртуальной машины достаточно ОЗУ для поддержки такого сценария.

Источник 1 говорит следующее:

После перезапуска PostgreSQL копирует файлы в новое место (и обратно, когда оно остановлено).

Это в сочетании с temp в имени конфигурации stats_temp_directory Похоже, данные хранятся в другом месте.

Так что же происходит с временными данными в случае нечистого завершения процесса Postgres? Это полностью потеряно, если процесс запустился за последнюю неделю без проблем? Или Postgres регулярно сохраняет данные вне временного каталога во время выполнения? Может ли он просто использовать доступные временные данные при перезагрузке после нечистого выключения?

Я спрашиваю, потому что в настоящее время, когда записанные данные сохраняются в локальной файловой системе, и операции по записи данных кажутся атомарными, но если бы мы переключились на использование tmpfs, статистические данные за несколько недель могли бы быть потеряны, если весь сервер вышел из строя для некоторая причина.

Есть ли способ заставить Postgres регулярно сохранять данные вне tmpfs, например, раз в час или около того?

Или мне нужно было бы использовать некоторую оверлейную / стекованную / любую файловую систему, монтируя постоянную как нижнюю, tmpfs как верхнюю и найти какой-то способ синхронизации вручную один раз?

Спасибо!

1 ответ

Решение

В PostgreSQL нет встроенного инструмента для периодического сохранения статистики сборщика. Они считаются заменяемыми. Имейте в виду, что существует разница между статистикой таблицы, собираемой анализатором, и статистикой, собираемой сборщиком статистики. Последнее - то, что идет в stats_temp_directory.

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

  1. Вы не хотите, чтобы Autovacuum пропускал таблицы, потому что он потерял счет их количества обновлений;
  2. Вы используете количество обновлений таблицы как часть вашего мониторинга где-то.

Я бы сказал, что первая причина, скорее всего, несущественна, если у вас нет какой-либо причины, почему PostgreSQL неожиданно закрывается каждый день, и в этом случае вам следует это исправить. Кроме того, вы можете исправить ситуацию, просто запустив VACUUM для всей базы данных после перезапуска Postgres.

По второй причине, просто накопление счетчиков само по себе не очень полезно. Я имею в виду, что если у таблицы 100000 удалений за время ее жизни, значит ли это, что в течение 100 дней у нее было 1000 в день, или это означает, что кто-то вчера только что удалил половину таблицы? Вы не знаете Так что, если вы заботитесь об этих подсчетах, вы должны делать снимки вашей статистики каждый день или каждый час, чтобы вы получали время и подсчеты. Вы можете посмотреть на эту попытку возродить pgStatsPack, инструмент, который сделал именно это.

Другие вопросы по тегам