Мы изучаем нагрузку ввода-вывода в одной из наших виртуальных машин и возможности ее оптимизации, и это показало, что большая часть нагрузки создается сборщиком статистики PostgreSQL. Он прыгает от 3,5 до 6,5 МБ / с. Я уже нашел некоторые интересные источники на Эта тема и они предложили использовать tmpfs для хранения большей части статистики в памяти, что имеет смысл для меня, и конкретная виртуальная машина имеет достаточно свободной оперативной памяти для поддержки такого сценария.
Источник 1 говорит следующее:
После перезапуска PostgreSQL скопирует файлы в новое место (и обратно при остановке).
Это в сочетании с temp
в имени конфигурации stats_temp_directory
похоже, что данные хранятся в другом месте.
Так что же происходит с временными данными в случае некорректного завершения работы процесса Postgres? Полностью ли потеряно, если всю последнюю неделю процесс работал без проблем? Или Postgres регулярно сохраняет данные вне временного каталога во время выполнения? Может ли он просто использовать доступные временные данные при перезапуске после нечистого завершения работы?
Я спрашиваю, потому что в настоящее время записанные данные сохраняются в локальной файловой системе, и операции для записи данных кажутся атомарными, но если мы переключимся на использование tmpfs, статистические данные за несколько недель могут быть потеряны, если весь сервер выйдет из строя на некоторая причина.
Может быть, есть способ заставить Postgres регулярно сохранять данные вне tmpfs, например, раз в час или около того?
Или мне нужно будет использовать какую-то наложенную / сложенную / любую файловую систему, установив постоянную как нижнюю, tmpfs как верхнюю и найти способ синхронизации вручную время от времени?
Спасибо!
В PostgreSQL нет встроенного инструмента для периодического сохранения статистики сборщика. Они считаются заменяемыми. Имейте в виду, что есть разница между статистикой таблицы, собранной анализатором, и статистикой, собранной сборщиком статистики. Последний - это то, что находится в stats_temp_directory.
Таким образом, ваш ответ здесь будет зависеть от того, почему вы хотите сохранить их в случае сбоя. Причин две:
Я бы сказал, что первая причина, скорее всего, несущественна, если только у вас нет причин, по которым PostgreSQL неожиданно отключается каждый день, и в этом случае вы должны это исправить. Кроме того, вы можете исправить ситуацию, просто запустив VACUUM для всей базы данных после перезапуска Postgres.
По второй причине просто накопление счетчиков само по себе не так уж и полезно. Я имею в виду, что если таблица имеет 100 000 удалений за время своего существования, означает ли это, что у нее было 1000 удалений в день в течение 100 дней, или это означает, что кто-то только что удалил половину таблицы вчера? Вы не знаете. Так что, если вам важны эти подсчеты, вы должны делать снимки своей статистики каждый день или каждый час, чтобы иметь не только количество, но и время. Вы можете посмотреть на эта попытка возродить pgStatsPack, инструмент, который сделал именно это.