Перейти к основному содержимому

Утилита Pangolin Tuner. Тюнинг параметров

Разработана утилита Pangolin Tuner (pangolin-tuner), которая предоставляет гибкое и эффективное управление конфигурацией СУБД, оптимизируя ее производительность путем тонкой настройки параметров (список конфигурируемых параметров подробнее смотрите в подразделе «Формулы расчета параметров»).

Pangolin Tuner — это инструмент для работы с конфигурацией Postgres-like СУБД, предназначенный для оптимизации производительности баз данных в различных сценариях использования. Инструмент автоматически определяет оптимальные настройки в зависимости от профиля рабочей нагрузки / профиля использования. Это позволяет значительно сократить время настройки и минимизировать риски, связанные с неправильной конфигурацией.

Утилита поставляется в виде отдельного rpm/deb-пакета pangolin-tuner-{version_component}-{OS}.x86_64.rpm в основной части дистрибутива продукта СУБД Pangolin. При установке будет создан рабочий каталог /opt/pangolin-tuner.

Утилита не требует наличия установленной СУБД на целевом сервере и поддерживает опциональные параметры для расчета, что делает ее универсальным инструментом для различных сценариев установки Postgres-like СУБД.

Схема процесса работы утилиты:

Схема процесса работы утилиты Pangolin Tuner

Установка

Ручная установка

Для установки компонента ручным способом обратитесь к одноименному подразделу в разделе «Ручная пошаговая установка».

Автоматизированная установка

При запуске автоматизированной установки утилита Pangolin Tuner будет установлена и запущена автоматически с выбранным профилем.

Настройка

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

Утилита использует набор предопределенных формул для вычисления оптимальных значений параметров конфигурации СУБД. Эти формулы учитывают:

Важно

Минимальные значения для расчета параметров конфигурации:

CPU = 4
MEM = 8GB

Профили использования

Pangolin Tuner поддерживает три готовых профиля рабочей нагрузки, каждый из которых адаптирован под конкретные потребности:

  • OLAP: Оптимизация для аналитических запросов, характеризующихся обработкой больших объемов данных и сложными вычислениями. Настройки ориентированы на оптимизацию агрегации данных, параллельности выполнения задач и эффективного использования ресурсов памяти.
  • OLTP: Оптимизация для транзакционных операций, где приоритетом является высокая скорость обработки, низкая задержка и целостность данных. Настройки направлены на минимизацию блокировок, оптимизацию ввода/вывода и эффективное использование ресурсов процессора.
  • 1C: Специфическая конфигурация для интеграции с системой 1C:Предприятие. Настройки учитывают особенности взаимодействия с платформой 1C, оптимизируя производительность для типичных сценариев использования. Содержит рекомендации по параметрам с фиксированными значениями.

Опциональные параметры утилиты

Утилита предоставляет гибкие настройки для оптимизации выполнения задач в различных сценариях. Эти настройки позволяют пользователям адаптировать утилиту под конкретные требования, такие как тип дискового пространства, использование процессорных ресурсов, объем оперативной памяти и версия СУБД.

Важно

В случае, если утилита развернута не на том стенде, где будет эксплуатироваться СУБД — расчет будет производится на основе значений переданных параметров.

Параметр

Описание

Значение

dtype

Тип дискового пространства

Варианты значений: HDD (по умолчанию), SSD

cpu

Количество процессорных ядер или процессоров

Варианты значений: 4 и более

mem

Объем оперативной памяти (RAM)

Варианты значений: 8GB и более

platform

Платформа

Варианты значений: pangolin (по умолчанию) или postgresql

dbmsver

Версия СУБД

Значение в формате семантического версионирования x.x.x для platform=pangolin (значение по умолчанию - 8.2.0) или значение в формате major.minor для platform=postgresql (значение по умолчанию - 18.3)

Формулы расчета параметров

В таблицах описываются формулы, по которым утилита Pangolin Tuner формирует значение параметров конфигурации.

Параметры памяти

Параметр

Описание

Формула расчета

shared_buffers

Определяет количество памяти, выделенной для кеширования данных

Все профили: <br /> RAM32GBRAM \le 32\text{GB} : RAM0,25RAM*0,25 (25% от RAM)<br /> RAM &gt; 32\text{GB} : RAM0,40RAM*0,40 (40% от RAM)<br /> В случае, если итоговое значение превышает 50 Гбайт, автоматически устанавливается значение 50GB для корректного запуска СУБД. При этом добавляется комментарий: # для оптимальной производительности для данного объема MEM требуется установить shared_buffers в рекомендованное значение - {shared_buffers}GB, huge_pages=on, а также выставить на уровне ОС значения: vm.nr_hugepages=<количество больших страниц> vm.hugetlb_shm_group=<GID для группы postgres>, где {shared_buffers} — это реальное итоговое значение. Реальное итоговое значение будет использоваться в расчетах других рекомендованных параметров для настройки.

work_mem

Определяет количество памяти, выделенной для сортировки и хеширования

OLTP: 16MB<br /> : 256MB<br /> OLAP: min(512 MB,RAMshared_buffers50)\min(512\text{ MB}, \frac{\text{RAM}-\text{shared\_buffers}}{50})<br /> где 50 = 10 * 5: 10 — число параллельных запросов (потоков), 5 — число шагов плана, которые могут одновременно потреблять work_mem

maintenance_work_mem

Определяет количество памяти, выделенной для операций обслуживания базы данных, таких как VACUUM, CREATE INDEX, и ALTER TABLE

Все профили: <br /> RAM8GB\mathrm{RAM} \le 8\,\text{GB} : 512MB<br /> 8\,\text{GB} &lt; \mathrm{RAM} \le 32\,\text{GB} : 1GB<br /> 32\,\text{GB} &lt; \mathrm{RAM} \le 64\,\text{GB} : 2GB<br /> \mathrm{RAM} &gt; 64\,\text{GB} : 4GB<br />

effective_cache_size

Определяет предполагаемый размер кеша операционной системы

Все профили: RAM2GBshared_buffers\text{RAM} - 2\,\text{GB} - \texttt{shared\_buffers}

temp_buffers

Определяет количество памяти, выделенной для временных таблиц и временных файлов

OLTP:<br /> RAM32GBRAM \le 32\text{GB} : 8MB<br /> RAM &gt; 32\text{GB} : 16MB<br /> :<br /> RAM32GBRAM \le 32\text{GB} : 128MB<br /> 32\text{GB} &lt; RAM \le 128\text{GB} : 256MB<br /> RAM &gt; 128\text{GB} : 512MB<br /> OLAP:<br /> RAM &lt; 256\text{GB} : 32MB<br /> RAM256GBRAM \ge 256\text{GB} : 64MB<br />

random_page_cost

Определяет стоимость случайного чтения страницы с диска

OLTP: 1.1<br /> : 1.1<br /> OLAP: 2.0

seq_page_cost

Определяет стоимость последовательного чтения страницы с диска

Все профили: 1.0

cpu_tuple_cost

Определяет стоимость обработки одной строки данных

Все профили: 0.01

from_collapse_limit

Определяет максимальное количество таблиц в запросе, при котором планировщик будет пытаться объединить их в один подзапрос

OLTP: 8<br /> : 11<br /> OLAP: 8

join_collapse_limit

Определяет максимальное количество таблиц в запросе, при котором планировщик будет пытаться объединить их в один подзапрос

OLTP: 8<br /> : 11<br /> OLAP: 8

geqo

Управляет включением или отключением генетического оптимизатора запросов

Все профили: on

geqo_threshold

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

Все профили: 12

log_min_duration_statement

Определяет минимальную продолжительность выполнения запроса, при которой он будет записан в журнал, в миллисекундах

OLTP: 3000<br /> : 3000<br /> OLAP: 60000

Параметры производительности

Параметр

Описание

Формула расчета

max_prepared_transactions

Определяет максимальное количество подготовленных транзакций

OLTP: 0<br />: 256<br />OLAP: 0

max_worker_processes

Определяет максимальное количество фоновых процессов

Все профили:<br /> CPU12\mathrm{CPU} \le 12 : 12<br /> \mathrm{CPU} &gt; 12 : равно количеству CPU

effective_io_concurrency

Определяет количество одновременных операций ввода-вывода

Все профили:<br />- для машин с SSD: 200<br />- для машин с HDD: количество дисков в массиве, например 10

max_parallel_workers

Определяет максимальное количество параллельных рабочих процессов

OLTP: max_worker_processes2\frac{\text{max\_worker\_processes}}{2}<br /> : max_worker_processes2\frac{\text{max\_worker\_processes}}{2}<br /> OLAP: max_worker_processes45\text{max\_worker\_processes} * \frac{4}{5}

max_parallel_workers_per_gather

Определяет максимальное количество параллельных рабочих процессов для операции GATHER

OLTP: 2<br />: 0<br />OLAP: 4+max_parallel_workers84 + \frac{\text{max\_parallel\_workers}}{8}

max_files_per_process

Определяет максимальное количество открытых файлов для одного процесса

OLTP: 1000<br />: 10000<br />OLAP: 1000

max_locks_per_transaction

Определяет максимальное количество блокировок, которые могут быть удержаны одной транзакцией

OLTP: 64<br />: 256<br />OLAP: 64

Параметры журнала транзакций (WAL)

Параметр

Описание

Формула расчета (все профили)

wal_buffers

Определяет количество памяти, выделенной для буферов журнала транзакций

RAM8GBRAM \le 8\text{GB} : 16MB<br /> RAM8GBRAM \le 8\text{GB} : 64MB<br />

checkpoint_completion_target

Определяет целевую продолжительность контрольной точки

0.9

checkpoint_timeout

Определяет максимальное время между контрольными точками, в секундах

1800 (30 минут)

Параметры реликации

Параметр

Описание

Формула расчета

max_wal_size

Определяет максимальный размер WAL файлов

Все профили: CPUGB{CPU}\,\text{GB}

min_wal_size

Определяет минимальный размер WAL файлов

Все профили:<br /> max_wal_size8\text{max\_wal\_size} \le 8 : 1GB<br /> \text{max\_wal\_size} &gt; 8 : \frac{\text{max\_wal\_size}}{4}\,\text{GB}

wal_compression

Определяет сжатие WAL с использованием указанного метода сжатия

OLTP:<br /> \text{CPU} &gt; 8 : lz4<br /> CPU8\text{CPU} \le 8 : off<br />: lz4<br />OLAP: lz4

wal_sync_method

Определяет, как PostgreSQL будет обращаться к ядру, чтобы принудительно сохранить WAL на диск

Все профили: fdatasync

Параметры автоочистки

Параметр

Описание

Формула расчета

autovacuum

Определяет, включена ли автоочистка

Все профили: on

autovacuum_max_workers

Определяет максимальное количество рабочих процессов автоочистки

Все профили:<br /> CPU32:3+CPU8\text{CPU} \leq 32 : 3+\frac{\text{CPU}}{8}<br /> \text{CPU} &gt; 32 : 7 + \frac{\text{CPU}}{16}

autovacuum_vacuum_cost_delay

Определяет задержку между операциями автоочистки, в миллисекундах

Все профили: 20ms

log_autovacuum_min_duration

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

Все профили: 10s

autovacuum_naptime

Определяет время ожидания между запусками автоочистки, в секундах

Все профили: 20s

autovacuum_vacuum_scale_factor

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

Все профили: 0.2

autovacuum_analyze_scale_factor

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

Все профили: 0.1

bgwriter_delay

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

Все профили: 20ms

bgwriter_lru_maxpages

Определяет максимальное количество страниц, которые фоновый процесс может записать за один цикл

Все профили: 400

bgwriter_lru_multiplier

Определяет множитель, который используется для определения количества страниц, которые фоновый процесс должен записать за один цикл

Все профили: 4.0

pg_outline.enable

Включает или отключает использование планов выполнения запросов (outlines) для оптимизации запросов

Все профили: off

enable_monitor_object_modification_date

Включает или отключает мониторинг даты изменения объектов базы данных

Все профили: off

track_io_timing

Включает или отключает сбор статистики по времени ввода-вывода

Все профили: off

Прочие параметры (профиль 1С)

ПараметрОписаниеЗначение (только для профиля 1С)
optimize_for_1CВключение поддержки 1С на развернутом экземпляре Pangolinon
escape_string_warningВключает или отключает предупреждения о неправильных escape-последовательностяхoff
standard_conforming_stringsВключает или отключает соответствие строк стандарту SQLoff
row_securityОпределяет, включена ли функция Row-Level Security для текущей сессииoff
plantuner.fix_empty_tableВключает или отключает исправление пустых таблицon
commit_delayОпределяет задержку перед фиксацией транзакции, в микросекундах1000
enable_bitmapscanВключает или отключает использование битовых сканированийon
enable_hashaggВключает или отключает использование хеш-агрегацийon
enable_hashjoinВключает или отключает использование хеш-объединенийon
enable_indexscanВключает или отключает использование индексных сканированийon
enable_indexonlyscanВключает или отключает использование индексных сканирований только по индексуon
enable_materialВключает или отключает использование материализацииon
enable_nestloopВключает или отключает использование вложенных цикловon
enable_seqscanВключает или отключает использование последовательных сканированийon
enable_sortВключает или отключает использование сортировокon
enable_tidscanВключает или отключает использование сканирования по TIDon
enable_mergejoinВключает или отключает использование объединений слияниемon
lc_messagesНастройка нужной локали для объектов БДru_RU.UTF-8
lc_monetaryНастройка нужной локали для объектов БДru_RU.UTF-8
lc_numericНастройка нужной локали для объектов БДru_RU.UTF-8
lc_timeНастройка нужной локали для объектов БДru_RU.UTF-8
enable_temp_memory_catalogВключение in-memory каталога для временных объектовon
show_temp_catalog_entriesПараметр определяет, показывать или нет информацию о временных объектах во всех системных представлениях типа pg_class, а также psql метакомандах типа \dt. Имеет смысл только при enable_temp_memory_catalog = on.on
log2_temp_objects_hash_partitionsКоличество секций в общей внутренней структуре памяти для учета используемых временными объектами OID. Имеет смысл только при enable_temp_memory_catalog = on7
deferred_temp_table_placementВключение режима отложенной записи для временных объектовon
check_temp_relfile_on_createПеренос проверки при создании временной таблицы на то, что файл с таким именем уже существует, до того момента, когда временная таблица будет реально писаться на СХД; параметр работает только при deferred_temp_table_placement = onoff
enable_outer_join_limit_pushdownОптимизация для популярного в 1C шаблона запросов select ... from t1 left outer join t2 on ... where ... order by t1.f1, t1.f2 ... limit Xon

Иные параметры

ПараметрОписаниеЗначение (все профили)
autovacuum_work_memОпределяет количество памяти, которое автоочистка может использовать для сортировки таблиц и индексов-1
debug_pretty_printВключает или отключает форматирование отладочной информации для улучшения читаемостиon
hot_standby_feedbackВключает или отключает обратную связь от резервного сервера для улучшения производительностиon
log_connectionsВключает или отключает логирование успешных подключений к серверуon
log_disconnectionsВключает или отключает логирование отключений от сервераon
log_lock_waitsВключает или отключает логирование длительных ожиданий блокировокon
log_replication_commandsВключает или отключает логирование команд репликацииon
log_rotation_sizeОпределяет максимальный размер файла журнала, после которого происходит ротация100MB
log_temp_filesВключает или отключает логирование создания временных файлов (значение задается в килобайтах, -1 — отключить, 0 — логировать все)262144 (256 MB)
log_truncate_on_rotationВключает или отключает усечение старых файлов журнала при ротацииon
logging_collectorВключает или отключает сбор журналов в отдельные файлыon
cron.max_running_jobsОпределяет максимальное количество одновременно выполняемых задач cron3
track_activitiesВключает или отключает сбор статистики о выполнении функцийon
track_functionsВключает или отключает сбор статистики о выполнении функцийnone
wal_keep_sizeОпределяет минимальное количество WAL, которое должно быть сохранено для репликации8GB
wal_log_hintsВключает или отключает логирование подсказок WALon
wal_receiver_status_intervalОпределяет интервал времени для обновления статуса приемника WAL, в секундах1s
logical_decoding_work_memОпределяет количество памяти, используемой для логической декодировки64MB
pgaudit.logВключает или отключает логирование аудитаnone
performance_insights.enableВключает или отключает сбор данных для анализа производительностиoff
pg_stat_statements.trackОпределяет, какие операторы должны быть отслежены модулем pg_stat_statementsall
pg_stat_statements.maxОпределяет максимальное количество операторов, которые могут быть сохранены модулем pg_stat_statements5000
pg_hint_plan.parse_messagesВключает или отключает разбор сообщений подсказок планаwarning
pg_hint_plan.message_levelОпределяет уровень сообщений для подсказок планаlog
masking_modeОпределяет режим маскирования данныхdisabled
relnuffs_enableВключает или отключает сбор статистики о блоках отношенийoff
enable_monitor_object_modification_dateВключает или отключает мониторинг даты изменения объектовoff
log2_num_lock_partitionsОпределяет число частей, на которые будет поделена общая таблица блокировок, и количество легких блокировок в транше LWLock:LockManager (2^log2_num_lock_partitions)7
log2_fastpath_num_groupsОпределяет размер внутренней структуры fast-path (2^log2_fastpath_num_groups)-1
enable_wal_locking_reductionОптимизация в WAL подсистеме; при большом потоке WAL позволяет улучшить производительность на 20+%on

Управление

Интерфейс утилиты

Входные параметры:

Pangolin Tuner принимает следующие аргументы командной строки:

  • --config или -c: путь до конфигурационного файла (обязательный аргумент);
  • --output-file или -r: путь до файла для фиксации вывода работы утилиты;
  • --diff или -d: формат вывода рекомендаций в виде diff;
  • --profile или -p: профиль для формирования списка параметров (по умолчанию oltp);
  • --option или -o: опциональные параметры (возможные параметры: dtype, cpu, mem, platform, dbmsver);
  • --help или -h: вывод справки и завершение работы;
  • --version или -v: вывод текущей версии утилиты и завершение работы;
  • --log или -l: уровень логирования (по умолчанию info).
Вывод команды pangolin-tuner --help

pangolin-tuner --help
usage: pangolin-tuner -c CONFIG [-h] [-r OUTPUT_FILE] [-d DIFF] [-p {oltp,1c,olap}] [-o OPTION] [-v] [-l {info,debug}]
pangolin-tuner -c file tune configuration for profile by default
or: pangolin-tuner -c file -p oltp tune configuration for custom profile
or: pangolin-tuner -c file -l debug tune configuration for profile by default with custom log level
or: pangolin-tuner -c file -r /path/to/file.conf tune configuration for profile by default with custom path output file
or: pangolin-tuner -c file -o cpu=10 tune configuration for profile by default with custom options

Pangolin Tuner is a Pangolin DBMS configuration tool designed to optimize database performance in various usage scenarios.

options:
-h, --help show this help message and exit
-c CONFIG, --config CONFIG
path to the current configuration file
-r OUTPUT_FILE, --output-file OUTPUT_FILE
path to result configuration file
-d, --diff format result configuration file
-p {oltp,1c,olap}, --profile {oltp,1c,olap}
profile for parameter tuning
-o OPTION, --option OPTION
optional parameters
-v, --version show version and exit
-l {info,debug}, --log {info,debug}
logging level

Выходные параметры:

По умолчанию утилита генерирует результат в формате Key-Value в консоль, содержащий рассчитанные оптимальные значения параметров. При использовании аргументов --diff/ --output-file вывод будет сгенерирован в формате diff, либо записан в файл соответственно.

Поддерживаемые форматы исходного файла: yaml/conf. При повторной генерации Pangolin Tuner будет перезаписывать файл, если такой уже существует. Содержимое файла будет включать в себя не только рекомендованные параметры, но и основной состав параметров из исходного конфиграционного файла. Параметры из include-файлов не учитываются в расчете.

Важно

Необходимо отдельно учитывать особенности настройки параметров на стендах с включенной защитой конфигурации.

Пример вывода работы утилиты Pangolin Tuner + лог-сообщение

pangolin_tuner % pangolin-tuner --config /tmp/postgres.conf
archive_command = /opt/pangolin-backup-tools/bin/pg_probackup archive-push -B /pgarclogs/06 --instance clustername --wal-file-path=%p --wal-file-name=%f --compress --overwrite -j 4 --batch-size=100
archive_mode = False
archive_timeout = 180
auth_activity_period = 60
authentication_max_workers = 16
authentication_port = 5544
authentication_proxy = 1
autounite = True
autounite_max_children_count = 0
autounite_naptime = 60
autounite_parent_children_size_ratio = 0
autounite_pause_period =
autovacuum_work_mem = 165MB
checkpoint_completion_target = 0.9
checkpoint_timeout = 1800
client_min_messages = notice
cluster_name = clustername
cron.database_name = postgres
cron.max_running_jobs = 3
datestyle = iso, mdy
debug_pretty_print = False
default_statistics_target = 100
default_text_search_config = pg_catalog.english
disk_check_tablespaces_count = 128
disk_check_timeout = 5
disk_operation_timeout = 3
disk_retry_count = 3
effective_cache_size = 12GB
effective_io_concurrency = 10
enable_filesystem_checker = False
enable_monitor_object_modification_date = False
enabled_extra_auth_methods = cert
enabled_sec_admin_extra_auth_methods = cert,md5
force_failover_timeout = 160
fsync = True
full_page_writes = True
grace_authid_enable = False
grace_authid_period = 0
grace_authid_skip_error = False
hot_standby = on
hot_standby_feedback = True
installer.cluster_type = cluster-patroni-etcd-pgbouncer
installer.inner_role_model = True
is_tde_on = False
lc_messages = en_US.utf8
lc_monetary = en_US.utf8
lc_numeric = en_US.utf8
lc_time = en_US.utf8
listen_addresses = 0.0.0.0
log_checkpoints = True
log_connections = True
log_destination = stderr
log_directory = /pgerrorlogs/06
log_disconnections = True
log_file_mode = 420
log_filename = postgresql-%Y-%m-%d_%H%M%S.log
log_line_prefix = %t [%p]: [%l-1] app=%a,user=%u,db=%d,client=%h,type=%b
log_lock_waits = True
log_min_duration_statement = 3000
log_min_error_statement = WARNING
log_replication_commands = True
log_rotation_age = 1440
log_rotation_size = 100MB
log_statement = none
log_temp_files = 0
log_timezone = Europe/Moscow
log_truncate_on_rotation = True
logging_collector = True
logical_decoding_work_mem = 64MB
maintenance_work_mem = 1GB
max_connections = 110
max_locks_per_transaction = 64
max_parallel_workers = 6
max_parallel_workers_per_gather = 2
max_prepared_transactions = 0
max_replication_slots = 10
max_standby_archive_delay = 30s
max_standby_streaming_delay = 30s
max_wal_senders = 10
max_wal_size = 12GB
max_worker_processes = 12
min_wal_size = 3.0GB
monitoring_ldap_servers = ^<server_name>$
object_modification_date_keep_interval = 1 week
password_encryption = scram-sha-256
password_policy.allow_hashed_password = False
password_policy.alpha_numeric = 3
password_policy.check_syntax = True
password_policy.deduplicate_ssl_no_ssl_fail_auth_attepmts = True
password_policy.deny_default = False
password_policy.expire_warning = 7 days
password_policy.failure_count_interval = 0
password_policy.grace_login_limit = 0
password_policy.grace_login_time_limit = 3 days
password_policy.illegal_values = True
password_policy.in_history = 4
password_policy.lockout = True
password_policy.lockout_duration = 24 hours
password_policy.max_age = 0
password_policy.max_failure = 6
password_policy.max_inactivity = 0
password_policy.max_rpt_chars = 0
password_policy.min_age = 0
password_policy.min_alpha_chars = 0
password_policy.min_length = 16
password_policy.min_lowercase = 0
password_policy.min_special_chars = 1
password_policy.min_uppercase = 1
password_policy.password_strength_estimator_score = 3
password_policy.reuse_time = 365 days
password_policy.track_login = False
password_policy.transport_password_life_time = 0
password_policy.transport_password_mark_automatic = False
password_policy.use_password_strength_estimator = True
performance_insights.enable = False
performance_insights.masking = true
performance_insights.num_samples_in_files = 17280
performance_insights.num_samples_in_ram = 12
performance_insights.sampling_enable = true
performance_insights.sampling_period = 5s
pg_hint_plan.debug_print = False
pg_hint_plan.message_level = debug
pg_hint_plan.parse_messages = warning
pg_outline.enable = False
pg_plugins_path = /opt/pangolin-dbms-server/lib
pg_profile.max_sample_age = 7
pg_profile.topn = 20
pg_profile.track_sample_timings = False
pg_stat_kcache.linux_hz = -1
pg_stat_statements.max = 5000
pg_stat_statements.track = top
pgaudit.log = ddl, role, connection, misc_set, protection
port = 5433
psql.save_history = False
psql_encrypt_password = True
random_page_cost = 1.1
relnblocks_enable = False
relnblocks_hash_init_db = 20
relnblocks_hash_init_size = 1024
relnblocks_hash_max_db = 1024
relnblocks_hash_max_size = 1000000
rotate_password.num_rounds = 20
search_path = ext
serverssl.pkcs12_config_path = /pg_ssl/intermediate/server.p12.cfg
session_tracing_default_level = 0
session_tracing_default_path = /pgdata/08/data/tracing/
session_tracing_enable = True
session_tracing_file_limit = -1
session_tracing_roles =
shared_buffers = 4GB
shared_preload_libraries = auto_explain,pg_cron,pg_stat_statements,pg_stat_kcache,pg_hint_plan,pg_outline
ssl = True
ssl_crl_dir = /pg_ssl/crl
ssl_crl_file = /pg_ssl/crl/intermediate.crl
ssl_min_protocol_version = TLSv1.2
superuser_reserved_connections = 10
synchronous_commit = True
synchronous_standby_names = "<server_name>"
syslog_facility = LOCAL3
syslog_ident = postgres
syslog_sequence_numbers = True
syslog_split_messages = False
timezone = Europe/Moscow
track_activities = True
track_commit_timestamp = False
track_counts = True
track_functions = none
track_io_timing = False
unix_socket_directories = /var/run/postgresql/
wal_buffers = 64MB
wal_keep_size = 8GB
wal_level = replica
wal_log_hints = True
wal_receiver_status_interval = 1s
wal_sync_method = fsync
work_mem = 16MB
hba_file = /pgdata/08/data/pg_hba.conf
ident_file = /pgdata/08/data/pg_ident.conf
recovery_target =
recovery_target_lsn =
recovery_target_name =
recovery_target_time =
recovery_target_timeline = latest
recovery_target_xid =
temp_buffers = 8MB
seq_page_cost = 1.0
cpu_tuple_cost = 0.01
from_collapse_limit = 8
join_collapse_limit = 8
geqo = True
geqo_threshold = 12
max_files_per_process = 1000
wal_compression = lz4
autovacuum = True
autovacuum_max_workers = 4
autovacuum_vacuum_cost_delay = 20
log_autovacuum_min_duration = 10s
autovacuum_naptime = 20s
autovacuum_vacuum_scale_factor = 0.2
autovacuum_analyze_scale_factor = 0.1
bgwriter_delay = 20ms
bgwriter_lru_maxpages = 400
bgwriter_lru_multiplier = 4.0

2025-01-19 19:01:03,198 - INFO - Tuning process successfully finished
Пример логов работы утилиты Pangolin Tuner с аргументом --output-file

pangolin_tuner % pangolin-tuner --config /tmp/postgres.conf --output-file /tmp/postgres.conf.tuner-oltp
2025-01-19 19:03:08,373 - INFO - Configuration was tuned: {path}/postgresql.conf.tuner-oltp
2025-01-19 19:03:08,373 - INFO - Tuning process successfully finished
Пример вывода работы утилиты Pangolin Tuner с аргументом --diff + лог-сообщение

pangolin_tuner % pangolin-tuner --config /tmp/postgres.yml --diff
---
+++
@@ -69,10 +69,20 @@
archive_timeout: '180'
authentication_port: '5544'
authentication_proxy: '1'
+ autovacuum: 'True'
+ autovacuum_analyze_scale_factor: '0.1'
+ autovacuum_max_workers: '4.5'
+ autovacuum_naptime: 20s
+ autovacuum_vacuum_cost_delay: '20'
+ autovacuum_vacuum_scale_factor: '0.2'
autovacuum_work_mem: 165MB
+ bgwriter_delay: 20ms
+ bgwriter_lru_maxpages: '400'
+ bgwriter_lru_multiplier: '4.0'
checkpoint_completion_target: '0.9'
checkpoint_timeout: '1800'
client_min_messages: notice
+ cpu_tuple_cost: '0.01'
cron.database_name: postgres
cron.max_running_jobs: '3'
datestyle: iso, mdy
@@ -83,15 +93,18 @@
disk_check_timeout: '5'
disk_operation_timeout: '3'
disk_retry_count: '3'
- effective_cache_size: 3976MB
- effective_io_concurrency: '300'
+ effective_cache_size: '12'
+ effective_io_concurrency: ''
enable_filesystem_checker: 'False'
- enable_monitor_object_modification_date: 'True'
+ enable_monitor_object_modification_date: 'False'
enabled_extra_auth_methods: cert
enabled_sec_admin_extra_auth_methods: cert,md5
force_failover_timeout: '160'
+ from_collapse_limit: '8'
fsync: 'True'
full_page_writes: 'True'
+ geqo: 'True'
+ geqo_threshold: '12'
grace_authid_enable: 'False'
grace_authid_period: '0'
grace_authid_skip_error: 'False'
@@ -100,11 +113,13 @@
installer.cluster_type: cluster-patroni-etcd-pgbouncer
installer.inner_role_model: 'True'
is_tde_on: 'False'
+ join_collapse_limit: '8'
lc_messages: en_US.utf8
lc_monetary: en_US.utf8
lc_numeric: en_US.utf8
lc_time: en_US.utf8
listen_addresses: 0.0.0.0
+ log_autovacuum_min_duration: 10s
log_checkpoints: 'True'
log_connections: 'True'
log_destination: stderr
@@ -114,7 +129,7 @@
log_filename: postgresql-%Y-%m-%d_%H%M%S.log
log_line_prefix: '%t [%p]: [%l-1] app=%a,user=%u,db=%d,client=%h,type=%b '
log_lock_waits: 'True'
- log_min_duration_statement: '5000'
+ log_min_duration_statement: '3000'
log_min_error_statement: WARNING
log_replication_commands: 'True'
log_rotation_age: '1440'
@@ -124,17 +139,21 @@
log_timezone: Europe/Moscow
log_truncate_on_rotation: 'True'
logging_collector: 'True'
- maintenance_work_mem: 256MB
- max_parallel_workers: '32'
+ maintenance_work_mem: 1GB
+ max_files_per_process: '1000'
+ max_locks_per_transaction: '64'
+ max_parallel_workers: '6'
max_parallel_workers_per_gather: '2'
+ max_prepared_transactions: '0'
max_standby_archive_delay: 30s
max_standby_streaming_delay: 30s
- max_wal_size: 4GB
- min_wal_size: 2GB
+ max_wal_size: '12'
+ max_worker_processes: '12'
+ min_wal_size: '3.0'
monitoring_ldap_servers: ^<server_name>$
object_modification_date_keep_interval: 1 week
password_encryption: scram-sha-256
password_policy.allow_hashed_password: 'False'
password_policy.alpha_numeric: '3'
password_policy.check_syntax: 'True'
@@ -164,7 +183,7 @@
password_policy.transport_password_life_time: '0'
password_policy.transport_password_mark_automatic: 'False'
password_policy.use_password_strength_estimator: 'True'
performance_insights.masking: 'True'
performance_insights.num_samples_in_files: '17280'
performance_insights.num_samples_in_ram: '12'
@@ -183,10 +202,12 @@
pg_stat_statements.track: top
pgaudit.log: ddl, role, connection, misc_set, protection
port: '5433'
- proverca: 'False'
+ proverca: on
+ proverca1: on
+ proverca2: on
psql.save_history: 'False'
psql_encrypt_password: 'True'
- random_page_cost: '2.0'
+ random_page_cost: '1.1'
relnblocks_enable: 'False'
relnblocks_hash_init_db: '20'
relnblocks_hash_init_size: '1024'
@@ -194,6 +215,7 @@
relnblocks_hash_max_size: '1000000'
rotate_password.num_rounds: '20'
search_path: ext
+ seq_page_cost: '1.0'
serverssl.pkcs12_config_path: /pg_ssl/intermediate/server.p12.cfg
shared_buffers: 4GB
shared_preload_libraries: auto_explain,pg_stat_statements,pg_stat_kcache,pg_cron,pg_hint_plan,pg_outline,pg_pathman
@@ -206,17 +228,18 @@
syslog_ident: postgres
syslog_sequence_numbers: 'True'
syslog_split_messages: 'False'
- temp_buffers: 256
+ temp_buffers: '8'
timezone: Europe/Moscow
track_activities: 'True'
track_counts: 'True'
track_functions: none
- track_io_timing: 'True'
+ track_io_timing: 'False'
unix_socket_directories: /var/run/postgresql/
- wal_buffers: 16MB
+ wal_buffers: 64GB
+ wal_compression: lz4
wal_receiver_status_interval: 1s
wal_sync_method: fsync
- work_mem: 17MB
+ work_mem: 16MB
pg_hba:
- hostssl all postgres 127.0.0.1/32 cert
- host all profile_tuz 127.0.0.1/32 scram-sha-256

2024-12-11 13:50:25,491 - INFO - Tuning process successfully finished

Логирование

Логирование работы утилиты ведется только в режиме Runtime с выводом в консоль.

Перечень сообщений лога

Варианты сообщений, которые может вернуть утилита с описанием:

MSG = {
# main
1: 'Pangolin Tuner version: {}',
2: 'Current config file: {}',
3: 'Profile: {}',
4: 'Tuning process was started',
5: 'Tuning process successfully finished',
6: 'Configuration was tuned: {}',
7: 'Not tuned',
8: 'Operation was cancelled by user',
9: 'Tuning process finished with error: {}',
# base
10: 'File {} does not exist',
11: 'Incorrect file format: {}. Acceptable: .conf, .yml, .yaml',
12: 'Reading configuration: {}',
13: 'Error reading configuration {}: {}',
14: 'Building diff report for configurations: {}',
15: 'Got error while building diff report: {}',
16: 'Tuning configuration: {}',
17: 'Got error while tuning configuration: {}',
18: 'Writing configuration: {}',
19: 'Got error while writing configuration: {}',
# tuner
20: '--- CPU Info --- {}',
21: '--- Memory Info --- {}',
22: 'Profile {} is not recognized',
23: 'Invalid option format: {}. Expected format: key=value',
24: 'CPU value is unacceptable as DBMS Pangolin will not be able to work correctly with the suggested setting. The default value was used by tuning process: {}',
25: 'MEM value is unacceptable as DBMS Pangolin will not be able to work correctly with the suggested setting. The default value was used by tuning process: {}',
26: 'Providing recommendations for DBMS {} version: {}',
27: 'Error printing configuration contents',
28: 'The tool processes only the limited list of parameters. The parameters out of the list are not considered for optimizing. The detailed list can be found in the documentation of Pangolin product',
29: 'Invalid platform value: {}. Expected one of \'pangolin\', \'postgresql\'.',
30: 'Unsupported DBMS version: {}',
}

Утилита поддерживает следующие уровни логирования:

  • INFO (по умолчанию) - вывод базовых информационных сообщений о статусе работы утилиты.
  • DEBUG - вывод расширенных информационных сообщений о действиях работы утилиты.
  • ERROR - сообщения об ошибках, препятствующих корректной работе утилиты (например, отсутствие конфигурационного файла).

Уровень логирования можно настроить с помощью аргумента --log/-l. Пример команды:

pangolin-tuner --config /pgdata/data/data/postgresql.conf --log DEBUG

Формат вывода лога: <дата и время> - <уровень логирования> - <текст сообщения>.

Пример логов о работе Pangolin Tuner с различными уровнями логирования:

2024-12-11 13:59:14,330 - INFO - Configuration was tuned: /tmp/postgres.yml.tune-oltp
2024-12-11 13:59:14,330 - INFO - Tuning process successfully finished
---
2024-12-11 14:14:55,523 - DEBUG - Pangolin Tuner version: 1.0.0
2024-12-11 14:14:55,523 - DEBUG - Current config file: /tmp/postgres.yml
2024-12-11 14:14:55,523 - DEBUG - Profile: oltp
2024-12-11 14:14:55,523 - DEBUG - Providing recommendations for DBMS Pangolin version: 6.1.1
2024-12-11 14:14:55,523 - DEBUG - Tuning process was started
2024-12-11 14:14:55,523 - DEBUG - Reading configuration: /tmp/postgres.yml
---
2024-12-11 14:14:22,665 - ERROR - File /tmp/postgres_test.yml does not exist
---
2024-12-24 09:45:40,213 - WARNING - CPU value is unacceptable as DBMS Pangolin will not be able to work correctly with the suggested setting. The default value was used by tuning process: 4

Требования к запуску утилиты

Для успешного запуска утилиты необходимы:

  • Локальный доступ к конфигурационному файлу и права на его чтение.

    Настройку можно проводить не на сервере СУБД, а на рабочей станции пользователя, с последующим копированием на сервер;

  • Наличие прав у пользователя на запуск утилиты.

Ограничения

Обратите внимание на данные ограничения:

  • Рекомендации, полученные с помощью утилиты Pangolin Tuner, не следует рассматривать как окончательный вариант конфигурации.
  • Утилита обрабатывает только тот конфигурационный файл, который был передан ей на вход.
  • Утилита не отвечает за применение созданного файла конфигурации, перечитывания или перезапуск служб.
  • Кастомизация параметров, таких как shared_preload_libraries, search_path, ssl, включение/отключение расширений и другие подобные настройки, утилитой не выполняется. Однако она может предоставить рекомендации по их настройке в закомментированном виде.
  • Запуск утилиты Pangolin Tuner в Docker должен выполняться с опциональными параметрами, определяющими количество CPU и памяти, для корректного расчета значений. Это связано с особенностью вычисления значений утилитой этих характеристик. Формируемое значение соответствует общей памяти сервера и CPU, на котором развернут контейнер, а не значениям конкретного контейнера.

Сценарии использования

Использование функциональности утилиты доступно несколькими способами:

  • без использования скриптов автоматизации;
  • с использованием скриптов автоматизации.

Без использования скриптов автоматизации

  1. Установите rpm/deb-пакет pangolin-tuner:

    dnf install -y <distributive>/utilities/pangolin-tuner-{version_component}-{OS}.x86_64.rpm

    Пример:

    dnf install -y distributive/utilities/pangolin-tuner-{version_component}-sberlinux{version_OS}.x86_64.rpm
  2. Запустите утилиту с необходимыми настройками:

    Сконфигурируйте файл под нужный профиль:

    • Для конфигурации standalone:

      /opt/pangolin-tuner/bin/pangolin-tuner --config /pgdata/data/data/postgresql.conf --profile <профиль> --output-file /pgdata/data/data/postgresql.conf.oltp
    • Для кластерной конфигурации:

      /opt/pangolin-tuner/bin/pangolin-tuner --config /etc/pangolin-manager/postgres.yml --profile <профиль> --output-file /etc/pangolin-manager/postgres.yml.oltp
  3. Сохраните копию старого конфигурационного файла:

    sudo su - postgres
    • Для конфигурации standalone:

      cp /pgdata/data/data/postgresql.conf /pgdata/data/data/postgresql.conf.backup
    • Для кластерной конфигурации:

      cp /etc/pangolin-manager/postgres.yml /etc/pangolin-manager/postgres.yml.backup
  4. Примените новый конфигурационный файл:

    sudo su - postgres
    • Для конфигурации standalone:

      mv /pgdata/data/data/postgresql.conf.oltp /pgdata/data/data/postgresql.conf
    • Для кластерной конфигурации:

      mv /etc/pangolin-manager/postgres.yml.oltp /etc/pangolin-manager/postgres.yml
  5. Произведите перезапуск актуальной службы:

    sudo su - postgres
    • Для конфигурации standalone:

      /opt/pangolin-dbms-server/bin/pg_ctl reload
      /opt/pangolin-dbms-server/bin/pg_ctl restart
    • Для кластерной конфигурации:

      /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml reload clustername
      /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart clustername