Приложение 5. Комментарии к настройке серверов БД
Производитель VALO Cloud рекомендует ознакомиться:
- с документацией на PostgreSQL и утилитой pgtune;
- сайтом https://postgresqlco.nf/doc/ru/param/
Стартовая конфигурация мастер-реплик:
- тип СУБД принимается как OLTP;
- тип накопителя - SSD;
- размер RAM – 32 Gb;
- количество CPU – 8;
- максимальное количество соединений c БД – 200;
- Комментарии по основным параметрам конфигурации postgresql.conf, напрямую зависящим от аппаратной конфигурации
| № п/п | Наименование параметра | Значение | Описание |
|---|---|---|---|
| 1 | max_connections | 200 | Максимальное количество соединений к БД. Зависит от условий эксплуатации и количества конкурентных пользователей Системы. Если это значение будет сильно расти, то значения параметров, связанных с выделением памяти следует пересмотреть |
| 2 | shared_buffers | RAM/4 | Размер разделяемых буфферов памяти |
| 3 | effective_cache_size | RAM – shared_buffers | Оценка размера кеша файловой системы |
| 4 | maintenance_work_mem | RAM/16 | Объем памяти обслуживающих задач (вакуум, индексы ..) |
| 5 | checkpoint_completion_target | 0.9 | Коэффициент скорости записи во время checkpoint (0.7 – 0.9). По сути определяет длительность исполнения checkpoint |
| 6 | wal_buffers | wal_buffers = 16MB | Объём разделяемой памяти, который будет использоваться для буферизации данных, перед сбросом на диск журнала. Более высокое значение при большом количестве подключений может повысить производительность |
| 7 | default_statistics_target | 100 | Объем собираемой статистики таблиц для выполнения analyze. Чем выше значение, тем выше издержки за счет процессов autoanalyze/autovacuum, но тем точнее план запроса |
| 8 | random_page_cost | 1.1 | Приблизительная стоимость чтения страницы с диска. Значение характерно для указанного типа накопителя. Регулируется на основе процента попаданий в кэш |
| 9 | effective_io_concurrency | 200 | Оценочное значение одновременных запросов к дисковой системе. Значение характерно для указанного типа накопителя |
| 10 | work_mem | 10485kB | Лимит памяти для обработки одного запроса (например с использованием сортировок) |
| 11 | min_wal_size, max_wal_size | 2GB (от 2 до 4) * max_wal_size = от 4GB до 8GB | Минимальное и максимальный объем WAL файлов |
| 12 | max_parallel_workers_per_gather | 4 | Максимальное число рабочих процессов, которые могут запускаться одним узлом Gather при параллельном выполнении запроса |
| 13 | max_parallel_workers | 8 | Максимальное число рабочих процессов, которое система сможет поддерживать для параллельных операций |
| 14 | max_parallel_maintenance_workers | 4 | Максимальное число рабочих процессов, которые могут запускаться одной служебной командой (CREATE INDEX) |
| 15 | max_worker_processes | 8 | Максимальное число фоновых процессов максимальное число фоновых процессов. Для серверов, находящихся в резерве, этот параметр должен быть не менее того значения, которое указано на сервере БД, обслуживающем мастер-реплику |
| 16 | huge_pages | try | БД попробует использовать Huge Pages, если не получится переключится на обычные |
Настраиваем huge_pages в ОС:
grep HUGETLB /boot/config-XXX - $(uname -r)
head -1 /var/lib/pgsql/11/data/postmaster.pid
19408
grep ^VmPeak /proc/19408/status
VmPeak : 2609244 kB
echo $((2609244/work_mem + 1))
5097
echo ’vm.nr_hugepages = 5097 ’ >> /etc/sysctl.conf
echo always > /sys/kernel/mm/transparent_hugepage/defrag
echo always > /sys/kernel/mm/transparent_hugepage/enabled
shutdown -r now
- Комментарии по параметрам конфигурации postgresql.conf для сбора статистики и функционирования приложений VALO Cloud
| № п/п | Наименование параметра | Значение | Описание |
|---|---|---|---|
| 1 | join_collapse_limit | 1 | Предложения JOIN переставляться планировщиком не будут и явно заданный в запросе порядок отношений определит фактический порядок. Запросы в Системе оптимизированы под явно заданный порядок отношений |
| 2 | autovacuum | on | Автоочистка старых версий записей в таблицах. Работает совместно с процессом autoanalyze. Прежде чем трогать параметры этих процессов рекомендую тщательно ознакомиться с документацией. Дополнительно рекомендуется планировщиком запускать ‘vacuum full analyze’ |
| 3 | track_counts | on | Включает сбор статистики активности в базе данных |
| 4 | checkpoint_timeout | 1min | Параметр используется для установки времени между контрольными точками WAL. Установка слишком низкого значения уменьшает время восстановления после сбоя, поскольку на диск записывается больше данных, но это также снижает производительность, поскольку каждая контрольная точка потребляет системные ресурсы. |
| 5 | shared_preload_libraries | ‘pg_stat_statements’ | Включаем отслеживание статистики (после включения параметра выполнить в консоли CREATE EXTENSION pg_stat_statements;). Включаем анализ буфферного кэша ‘CREATE EXTENSION pg_buffercache;’ |
| 6 | track_activity_query_size | 32kB | Размер строки запроса, помещающийся в pg_stat_statements |
| 7 | max_pred_locks_per_transaction | 256 | Устанавливает максимальное количество предикатных блокировок на транзакцию |
| 8 | max_locks_per_transaction | 256 | Усредненное количество блокировок на одну транзакцию |
| 9 | max_prepared_transactions | 200 | Максимальное количество подготовленных транзакций |
| 10 | idle_in_transaction_session_timeout | 30000 | Отключаем по таймауту (мс.) простаивающие соединения. Их количество может увеличиваться из-за утечки JDBC-соединений |
| 11 | synchronous_commit | off | Отключена синхронная запись в WAL. Крайне рекомендуется ознакомиться с поведением |
- Примеры запросов для оценки состояния экземпляров БД
Использование буфферов кэша таблицами
SELECT c.relname, count(*) AS buffers
FROM pg_buffercache b INNER JOIN pg_class c
ON b.relfilenode = pg_relation_filenode(c.oid) AND
b.reldatabase IN (0, (SELECT oid FROM pg_database
WHERE datname = current_database()))
GROUP BY c.relname
ORDER BY 2 DESC
LIMIT 20;
Расположение объектов в кэше
SELECT c.relname, pg_size_pretty(count(*) * 8192) as buffered ,
round (100.0 * count(*) /
(SELECT setting FROM pg_settings WHERE name= 'shared_buffers') :: integer ,1)
AS buffers_percent, round(100.0 * count(*) * 8192/pg_table_size(c.oid) ,1)
AS percent_of_relation
FROM pg_class c
INNER JOIN pg_buffercache b
ON b.relfilenode = c.relfilenode
INNER JOIN pg_database d
ON (b.reldatabase = d.oid AND d.datname = current_database() )
GROUP BY c.oid , c.relname
ORDER BY 3 DESC
LIMIT 20;