Сохранять статистические данные из каталога stats_temp_directory Postgres по запросу

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

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

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

Это в сочетании с temp в имени конфигурации stats_temp_directory звучит так, как будто данные сохраняются где-то еще.

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

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

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

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

Спасибо!

1
задан 13 April 2017 в 15:14
1 ответ

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

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

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

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

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

0
ответ дан 4 December 2019 в 06:41

Теги

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