Как оптимизировать работу PostgreSQL под оборудование в Linux

Материал из largespace
Перейти к навигации Перейти к поиску

Вопрос:

Как оптимизировать работу СУБД PostgreSQL под оборудование в Linux?

Ответ:

Все параметры работы СУБД PostgreSQL хранятся в специальном файле, который располагается как правило в каталоге

/etc/postgresql/14/main/postgresql.conf

В данном файле указываются параметры оптимизации. Рекомендуется указывать собственные параметры оптимизации в конце файла.

Далее идет список параметров, рекомендуемые значения и комментарии

Параметр Рекомендуемое

значение

Комментарии
shared_buffers RAM/4 Объем памяти для совместного кеша страниц, разделяется между всеми процессами Postgres, рекомендуемое значение - четверть доступного объема памяти
temp_buffers 128MB Верхний лимит для временных таблиц в каждой сессии, рекомендуется фиксированное значение. Альтернативный вариант расчета - 1/128 RAM
work_mem (RAM - shared_buffers) / 32..256 Указывает объем памяти, который может быть использован для запроса прежде, чем будут задействованы временные файлы на диске. Применяется для каждого соединения и каждой операции, поэтому итоговый объем используемой памяти может существенно превосходить указанное значение. Рекомендуемое значение для  work_mem — (RAM - shared_buffers)/(16 x CPU cores)
effective_io_concurrency 2 для RAID, 200 для SSD, 500..1000 для NVMe Допустимое число одновременных операций ввода/вывода. Для жестких дисков указывается по количеству шпинделей, для массивов RAID5/6 следует исключить диски четности. Для SATA SSD это значение рекомендуется указывать равным 200, а для быстрых NVMe дисков его можно увеличить до 500-1000
synchronous_commit off Позволяет серверу не ждать сохранения данных на диске, прежде чем сообщить клиенту об успешном завершении операции. Позволяет достаточно безопасно повысить производительность работы. В случае внезапного выключения питания могут быть потеряны несколько последних транзакций, но сама база останется в рабочем состоянии, также, как и при штатной отмене потерянных транзакций.
seq_page_cost 1.0 Стоимость последовательного чтения с диска, является относительным числом, вокруг которого определяются все остальные переменные стоимости, данное значение является значением по умолчанию.
random_page_cost 1.5..2.0 для RAID, 0.5..1.3 для SSD Стоимость случайного чтения с диска, чем ниже это число, тем более вероятно использование сканирования по индексу, нежели полное считывание таблицы, однако не следует указывать слишком низких, не соответствующих реальной производительности дисковой подсистемы, значений, иначе вы можете получить обратный эффект, когда производительность упрется в медленный случайный доступ.
effective_cache_size RAM - shared_buffers Определяет эффективный размер кеша, который может использоваться при одном запросе. Этот параметр не влияет на размер выделяемой памяти, не резервирует ее, а служит для ориентировочной оценки доступного размера кеша планировщиком запросов. Чем он выше, тем большая вероятность использования сканирования по индексу, а не последовательного сканирования.
row_security off Отключает политику защиты на уровне строк, данная опция не используется платформой и ее отключение дает некоторое повышение производительности.
ssl off Отключает шифрование, если обеспечивается безопасность другими способами.
wal_sync_method fdatasync Способ синхронизации wal с диском.
cpu_operator_cost 0.0001 Стоимость операции CPU. Стандартное значение 0.0025. Можно уменьшать цифру при производительных CPU

Для применения изменений необходимо перезапустить службу используя команду

sudo service postgresql restart


Примечание:

Для версии PostgreSQL 14 рекомендуется выполнить перенос каталога со статистикой в RAM диск


Кейсы оптимальных конфигураций производительности PostgreSQL Linux

Заметки по изменению производительности

Стенд: AMD Ryzen 7 2700X, 32GB RAM, NVMe 500Gb, Green Linux 21.1, ядро 5.15.0-67, Postgresql 14

При включении shared_buffer = 8Gb: с 19,53 до 23,26 баллов Гилева

При включении synchronous_commit = off: с 23.26 до 21.01 баллов Гилева

При включении seq_page_cost и random_page_cost для NVMe: с 21.01 до 20.58 баллов Гилева

При отключении synchronous_commit = off и включенных остальных параметрах: с 20.58 до 23.58

При включении effective_io_concurrency = 500: без изменений

При включении effective_cache_size = 16GB: без изменений

При включении work_mem = 512MB: с 23.58 до 23.47 (в рамках погрешности)

При включении row_security, escape_string_warning, standard_conforming_string: с 23.47 до 22.83

При изменении work_mem = 128MB: с 22.83 до 23.81

При изменении seq_page_cost = 0.5 и random_page_cost = 0.5: с 23.81 до 24.04

При добавлении temp_buffers = 128MB: с 24.04 до 23.58

При отключении temp_buffers (стандартное значение 8MB): с 23.58 до 24.04

При включении temp_buffers = 24MB: с 24.04 до 23.04

При включении ssl = off и temp_buffers = 128MB: с 23.58 до 23.47 (в рамках погрешности)

При включении temp_buffers = 1024MB с 23.47 до 20.75

При включении wal_sync_method = fdatasync: с 20.75 до 24.39

При изменении effective_io_concurrency = 200: с 24.39 до 24.04

При изменении effective_io_concurrency = 1000: с 24.04 до 24.39

При отключении escape_string_warning, standard_conforming_string: без изменений

При отключении row_security: с 24.39 до 24.04

При включении row_security = off и synchronous_commit = off: с 24.04 до 21/01


Итого имеют влияния:

1) shared_buffer - крайне высокое

2) work_mem - среднее

3) random_page_cost - среднее

4) wal_sync_method - высокое

5) row_security - низкое

Отрицательное влияние:

1) temp_buffers (для однопоточных операций)

2) synchronous_commit (для однопоточных операций) (для NVMe)