Настроение 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 ГБ, согласны с этой формулой
shared_buffers = 1GB effective_cache_size = 3GB maintenance_work_mem = 256MB work_mem = 5242kB
shared_buffers = 1GB effective_cache_size = 3GB maintenance_work_mem = 320MB work_mem = 14MB
shared_buffers = 1GB effective_cache_size = 3GB maintenance_work_mem = 256MB work_mem = 32MB
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 - остаёмся на рекомендуемом всеми значением