July 3, 2023

Настроение PostgreSQL

Установка PostgreSQL - задача довольно простая, просто просим наш пакетный менеджер загрузить и установить необходимую версию PostgreSQL

Но дальше, нужно все настроить, а это нужно делать исходя из серверных ресурсов. А как определить, сколько и чего у меня?

Точно нужно знать сколько ядер у нашего процессора: nproc

И сколько у нас памяти: free -h --si

Что дальше? Какие параметры PostgreSQL требуют настройки и зависимы от ресурсов сервера?

Самый главный, на мой взгялд - это буферный кэш - shared_buffers

Значение по умолчанию - 128МБ, чего для некоторых систем достаточно

shared_buffers

Универсальная формула для этого параметра - 25% от общей RAM, т.е. 1024 МБ при RAM равной 4096 МБ. Нужно понимать, что это лишь отправная точка, если размеры БД больше выделенного shared_buffers, Однако - это лишь стартовое значение, которое мы устанавливаем при свежей установки. Определить финальное значение нам поможет расширение pg_buffercache

Автоматические сервисы с этим согласны и всегда указывают величину 25% от RAM

work_mem

cybertec советует 32 МБ, pgtune - 5242kB, а pgconfig говорит вовсе 14 МБ. Кто все же прав? Скорее всего, вы правы! Для каждого свое, но нужно помнить, что у нас может быть 100 одноверменных подключений, поэтому 32 МБ - много, а 5 МБ - мало, мы рекомендуем начинать со значения в 16 МБ (для 4 ГБ) и примерно формула выглядит так: ROUND(RAM*0.4)

Конечно же, если мы видим, что у нас много необхоимых и неподчиняемых индексам и другим опитимацзиям запросы - то мы меняем work_mem соотвественно.

maintenance_work_mem

Реомендация сервисов от 4% до 7% от общей RAM. Это действтеьлное адекватное значение, но стоит помнить, что есть ограничение в использование 1 ГБ этой памяти для операции очистки. Исходя из этого, для системы с 4 ГБ памяти мы ставим значение в 256 МБ, а формула остаётся такой: RAM/16, но не более 1024 МБ

effective_cache_size

Это значение руководствуется формулой RAM * 0.75, т.е. для нашей тестовой системы мы бы выстваили значение в 3 ГБ, согласны с этой формулой

Сравнение всех сервисов

PgTune:

shared_buffers = 1GB
effective_cache_size = 3GB
maintenance_work_mem = 256MB
work_mem = 5242kB

cyber:

shared_buffers = 1GB
effective_cache_size = 3GB
maintenance_work_mem = 320MB
work_mem = 14MB

config:

shared_buffers = 1GB
effective_cache_size = 3GB
maintenance_work_mem = 256MB
work_mem = 32MB

DBI:

shared_buffers = 1GB
effective_cache_size = 3GB
maintenance_work_mem = 256MB
work_mem = 16MB

Теперь посмотрим, как обстоят дела с параметрами, затрагивающими CPU, но прежде всего вспомним, что есть параметр, от которого зависит успешны запуск реплики

Также, будем подбирать параметры под 4 ядра

max_worker_processes

Значение по умолчанию - 8, и мы от него не откажемся. В силу того, что не всегда есть понимание, куда уйдут ядра - на pg_cron, на автовакуум, на параллельное параллельное выполнение запроса (все верно написано). Для того чтобы не допустить просадки по CPU, мы будем менять другие параметры.

Калькуляторы чаще все выбирают этот параметр равным количеству CPU. Мы в свою очередь рекомендуем использовать значение 8 при CPU от 1 до 8, а при более высоких значениях сравнивать с количеством CPU

max_parallel_workers_per_gather

Тут все солдарны друг с другом: CPU / 2. Тоже самое мы делаем и с max_parallel_workers

max_parallel_maintenance_workers - остаёмся на рекомендуемом всеми значением