K.3. Настройка параметров сервера

В этом документе описывается, как настроить параметры конфигурации сервера Postgres Pro для максимальной производительности и стабильности при работе с решениями 1C. Эти параметры редактируются в файле конфигурации postgresql.conf. Учтите, что приведённые значения параметров являются приблизительными. Они могут рассматриваться как начальная точка для дальнейшей тонкой настройки.

Для быстрой автоматической настройки Postgres Pro можно также использовать утилиту pgpro_tune. Она предоставляет пресет 1c.tune, который задаёт оптимальные значения параметров конфигурации, специфичные для 1C. За подробностями об использовании этой утилиты обратитесь к её документации.

K.3.1. Параметры подключения

Увеличьте максимальное количество возможных одновременных подключений к серверу баз данных, используя параметр конфигурации max_connections. Решения 1C могут открывать большое количество соединений, даже если не все из них используются. Поэтому рекомендуется разрешить не менее 500 подключений. Чем больше количество клиентских сеансов, тем больше должно быть значение параметра.

-- max_connections = 500..10000

K.3.2. Параметры потребления памяти

  1. Увеличьте объём памяти, который будет использоваться базой данных для кеширования данных. Для этого используйте параметр конфигурации shared_buffers. Для хорошей производительности рекомендуется устанавливать для этого параметра как минимум 25% от доступного объёма оперативной памяти.

    -- shared_buffers = ОЗУ/4
  2. Увеличьте максимальный объём памяти, который будет использоваться для временных буферов в каждом сеансе базы данных, чтобы обеспечить корректную работу временных таблиц. Для этого используйте параметр конфигурации temp_buffers.

    Рекомендуемое значение должно быть между 32MB и 256MB. Точное значение зависит от объёма памяти на сервере и количества одновременных подключений. Чем больше подключений и меньше объём памяти, тем меньше должно быть значение параметра.

    -- temp_buffers = 32..256MB
  3. Увеличьте максимальный объём памяти, который будет использоваться одной операцией запроса перед записью на временные файлы диска. Для этого используйте параметр конфигурации work_mem.

    При выборе значения параметра учтите, что сложные запросы могут одновременно выполнять несколько операций сортировки и хеширования, и при этом каждая операция может использовать указанный объём памяти. Кроме того, такие операции могут выполняться одновременно в нескольких сеансах. Таким образом, общий объём используемой памяти может быть в несколько раз больше указанного значения. Тонкую настройку параметра можно выполнить, отслеживая количество создаваемых в системе временных файлов.

    -- work_mem = ОЗУ/32..64 или 32MB..256MB
  4. Увеличьте максимальный объём памяти, который будет использоваться одной операцией обслуживания базы данных, например VACUUM или CREATE INDEX. Для этого используйте параметр конфигурации maintenance_work_mem.

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

    -- maintenance_work_mem = ОЗУ/16..32 или work_mem * 4 или 256MB..4GB
  5. В случае существенной фрагментации памяти укажите следующую переменную окружения в файле /etc/systemd/system/postgresql.service:

    -- Environment = MALLOC_MMAP_THRESHOLD_= 8192

K.3.3. Параметры использования ресурсов ядра

Увеличьте максимальное число файлов, которые могут быть одновременно открыты каждым серверным подпроцессом. Для этого используйте параметр конфигурации max_files_per_process.

Рекомендуемое значение — 10000, но оно может быть увеличено в зависимости от нагрузки. Максимальное допустимое значение зависит от операционной системы. Если сервер достигает указанный предел, он начинает открывать и закрывать файлы, что влияет на производительность. Отслеживать открытые файлы можно с помощью команды lsof.

-- max_files_per_process = 10000

K.3.4. Параметры фоновой записи

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

    -- bgwriter_delay = 20ms
  2. Увеличьте значения для параметров конфигурации bgwriter_lru_multiplier и bgwriter_lru_maxpages, которые управляют количеством «грязных» буферов, записанных процессом фоновой записи в каждом раунде активности.

    -- bgwriter_lru_multiplier = 4.0
    -- bgwriter_lru_maxpages = 400

K.3.5. Параметры асинхронного поведения

  1. Укажите количество одновременных операций ввода-вывода на диск, которое каждый отдельный сеанс Postgres Pro пытается выполнять параллельно. Для этого используйте параметр конфигурации effective_io_concurrency. В настоящее время этот параметр влияет только на сканирование по битовой карте.

    Для магнитных носителей хорошим начальным значением этого параметра будет число отдельных дисков, составляющих массив RAID 0 или RAID 1, который используется для базы данных. Однако слишком большое значение параметра будет полностью загружать дисковый массив, что приведёт к дополнительной нагрузке на процессор.

    Диски SSD часто могут обрабатывать множество параллельных запросов, так что лучшим значением может быть несколько сотен.

    -- effective_io_concurrency = 2
  2. Установите для параметра конфигурации max_parallel_workers_per_gather значение 0. Это выключает параллельные запросы, которые могут быть запущены узлами Gather и Gather Merge. Параллельные запросы могут потреблять значительно больше ресурсов, чем не параллельные.

    -- max_parallel_workers_per_gather = 0

K.3.6. Параметры журнала предзаписи (WAL)

  1. Оставьте для параметра конфигурации fsync значение on (по умолчанию). В этом случае сервер Postgres Pro пытается добиться, чтобы изменения были записаны на диск физически, выполняя системные вызовы fsync(). Это гарантирует, что кластер баз данных сможет вернуться в согласованное состояние после сбоя операционной системы или оборудования.

    Хотя отключение параметра fsync часто даёт повышение производительности, это может привести к неисправимой порче данных в случае отключения питания или сбоя системы.

    -- fsync = on

    Важное замечание: если ваш диск RAID имеет кеш и работает в режиме отложенной записи, убедитесь, что у кеша контроллера диска есть рабочая батарея. В противном случае данные, записанные в кеш, могут быть потеряны при отключении питания, и сервер Postgres Pro не сможет их восстановить.

  2. Установите для параметра конфигурации synchronous_commit значение off. Это означает, что сервер Postgres Pro не дожидается сброса записей WAL на диск, но возвращает клиенту подтверждение об успешном выполнении.

    В отличие от fsync, указание значения off для этого параметра не угрожает целостности данных. Сбой операционной системы или базы данных может привести только к потере последних транзакций. Таким образом, выключение параметра synchronous_commit полезно, когда очень важна высокая производительность.

    -- synchronous_commit = off
  3. Увеличьте значения для параметров конфигурации checkpoint_timeout, min_wal_size и max_wal_size для сокращения частоты контрольных точек. Слишком частые контрольные точки приводят к значительной нагрузке на дисковую систему.

    -- checkpoint_timeout = 15min
    -- min_wal_size = 512MB..4G
    -- max_wal_size = 2 * min_wal_size
  4. Укажите параметр конфигурации commit_delay, если среднее количество транзакций в секунду (TPS) больше 1000. Этот параметр добавляет паузу перед выполнением сброса WAL и может увеличить быстродействие при фиксировании группы транзакций.

    -- commit_delay = 1000

K.3.7. Параметры планирования запросов

  1. Укажите параметр конфигурации effective_cache_size, чтобы определить предположение планировщика об эффективном размере дискового кеша, доступном для одного запроса.

    Производительность оптимизатора запросов зависит от выделенного объёма оперативной памяти. При высоких значениях, как правило, используется сканирование по индексу, при низких — последовательное сканирование.

    -- effective_cache_size = ОЗУ - shared_buffers
  2. Укажите параметр конфигурации random_page_cost, чтобы определить приблизительную стоимость чтения одной произвольной страницы с диска.

    Значение этого параметра задаётся относительно параметра seq_page_cost, для которого по умолчанию установлено значение 1.0. При уменьшении значения random_page_cost система начинает выбирать сканирование по индексу вместо последовательного сканирования. Рекомендуемое значение зависит от времени поиска дисковой системы. Чем ниже время поиска, тем ниже должно быть значение параметра (но не меньше 1.0).

    -- random_page_cost = 1.5-2.0 (для RAID) или 1.1-1.3 (для SSD)
  3. Увеличьте значение для параметра конфигурации from_collapse_limit. Планировщик будет объединять вложенные запросы с внешними запросами, если результирующий список FROM будет содержать не больше указанного количества элементов. Учтите, что при меньших значениях параметра сокращается время планирования, но планы запросов могут стать менее эффективными.

    -- from_collapse_limit = 20
  4. Увеличьте значение параметра конфигурации join_collapse_limit. Планировщик будет переписывать явные конструкции JOIN (за исключением FULL JOIN) на списки элементов FROM каждый раз, когда список содержит не больше указанного количества элементов. Учтите, что при меньших значениях параметра сокращается время планирования, но планы запросов могут стать менее эффективными.

    -- join_collapse_limit = 20
  5. Оставьте для параметра конфигурации geqo значение on (по умолчанию). Это включает генетический оптимизатор запросов (Genetic Query Optimizer, GEQO), который осуществляет планирование запросов, применяя эвристический поиск. GEQO сокращает время планирования для сложных запросов, объединяющих множество отношений, но иногда создаёт планы, которые менее эффективные, чем планы, выбираемые при обычном алгоритме полного перебора.

    Для управления использованием GEQO укажите параметр конфигурации geqo_threshold. GEQO будет использоваться для планирования запросов, которые содержат не менее указанного количества элементов FROM.

    -- geqo = on
    -- geqo_threshold = 12
  6. Укажите для параметра конфигурации jit значение off для выключения компиляции Just-in-Time (JIT). Эта компиляция имеет преимущество в первую очередь для длительных запросов, нагружающих процессор, например для аналитических запросов. Для быстрых запросов добавляемые накладные расходы будут выше, чем время, которое может сохранить компиляция JIT.

    -- jit = off

K.3.8. Параметры автоматической очистки

  1. Оставьте для параметра конфигурации autovacuum значение on (по умолчанию) для запуска демона автоочистки. Обратите внимание, что выключение демона автоочистки будет приводить к увеличению размера базы данных и значительному ухудшению производительности.

    -- autovacuum = on
  2. Увеличьте максимальное количество процессов автоочистки, которые могут выполняться одновременно, используя параметр конфигурации autovacuum_max_workers. Чем больше запросов на запись выполняется в системе, тем больше требуется процессов автоочистки.

    -- autovacuum_max_workers = ядра ЦП/4..2 (но не менее 4)
  3. Сократите минимальную задержку между раундами автоочистки, используя параметр конфигурации autovacuum_naptime. Если значение параметра слишком большое, может не хватить времени для очистки всех требуемых таблиц. Это приведёт к увеличению размера базы данных и значительному снижению производительности. Однако слишком маленькое значение приведёт к бесполезной нагрузке.

    -- autovacuum_naptime = 20s

K.3.9. Параметры клиентских подключений

  1. Укажите каталог, в котором будут создаваться временные таблицы и индексы временных таблиц, используя параметр конфигурации temp_tablespaces. Обычно решения 1C используют множество временных таблиц. Для увеличения производительности при работе с такими таблицами расположите этот каталог на отдельных быстрых дисках.

    Перед этим сначала необходимо создать табличное пространство, используя команду CREATE TABLESPACE. Если характеристики целевых дисков отличаются от основных дисков, укажите в этой команде соответствующее значение для параметра random_page_cost.

    -- temp_tablespaces = 'имя_табличного_пространства'
  2. Укажите для параметра конфигурации row_security значение off, чтобы выдавать ошибку, если результаты запроса фильтруются политикой безопасности на уровне строк.

    -- row_security = off

K.3.10. Параметры управления блокировками

Увеличьте значение для параметра конфигурации max_locks_per_transaction до 256. Оно задаёт количество объектов для каждого серверного процесса или подготовленной транзакции, которые могут быть одновременно заблокированы.

Обычно решения 1C используют множество временных таблиц. Каждый обслуживающий процесс обычно содержит много временных таблиц. При закрытии соединения Postgres Pro пытается удалить все временные таблицы в одной транзакции, при этом транзакция может использовать множество блокировок. Если число блокировок превысит значение max_locks_per_transaction, транзакция прервётся, оставляя множество потерянных временных таблиц.

-- max_locks_per_transaction = 256

K.3.11. Параметры для совместимости с 1C

  1. Установите для параметра конфигурации standard_conforming_strings значение off, чтобы включить экранирование символом обратной косой черты (\) для всех строк.

    -- standard_conforming_strings = off
  2. Установите для параметра конфигурации escape_string_warning значение off, чтобы выключить предупреждение об использовании символа обратной косой черты.

    -- escape_string_warning = off

K.3.12. Путь к подкаталогу pg_stat_tmp

Измените путь по умолчанию к подкаталогу PGDATA/pg_stat_tmp, чтобы разместить его отдельно от каталога кластера. Этот подкаталог содержит временные файлы для подсистемы статистики. Эти файлы интенсивно изменяются, что создаёт значительную нагрузку на дисковую систему. Рекомендуется размещать этот подкаталог в tmpfs (хранилище временных файлов).