Настройка производительности PostgreSQL для 1С и высоконагруженных систем

Проблема

PostgreSQL по умолчанию устанавливается с очень консервативными настройками, ориентированными на работу в системах с минимальным объёмом оперативной памяти около 512 МБ или даже меньше. Такой подход гарантирует, что сервер баз данных запустится практически на любом оборудовании, однако совершенно не подходит для продуктивной эксплуатации, особенно в связке с платформой «1С:Предприятие». На сервере с десятками гигабайт ОЗУ и быстрым NVMe-диском база данных внезапно начинает «тормозить»: запросы выполняются медленно, блокировки растут, а мониторинг показывает высокий %util на дисках. Причина почти всегда кроется в том, что администратор не адаптировал параметры конфигурации postgresql.conf под реальное «железо». PostgreSQL настройка производительности это обязательный этап, без которого невозможно получить стабильно высокую скорость работы, будь то обслуживание сотен пользователей 1С или нагруженного веб-приложения.

Решение

Применим методику расчёта основных параметров на основе объёма оперативной памяти сервера. Этот подход задокументирован в официальном руководстве PostgreSQL Configuration и в рекомендациях компании Postgres Professional для высоконагруженных систем Настройка PostgreSQL для 1С. Дополнительно учтём требования «1С:Предприятие» к СУБД, описанные на сайте its.1c.ru. Настроим три группы параметров: память, планировщик и ввод-вывод. Все команды выполняются на сервере под управлением Linux (Debian/Ubuntu/Astra Linux) с PostgreSQL версии 14, 15 или 16. После изменения конфигурации обязательно протестируем производительность с помощью pgbench.

Пошаговая инструкция

Шаг 1. Определение доступного объёма памяти

Прежде чем править конфигурацию, необходимо понять, сколько ОЗУ можно выделить PostgreSQL. Общее правило: для выделенного сервера баз данных PostgreSQL отдают до 70% физической памяти, оставляя остальное под страничный кеш ОС и служебные нужды. Если на сервере работает ещё и платформа 1С (сервер приложений), долю снижают до 50%.

bash

free -h

Пример: общий объём ОЗУ — 32 ГБ. Под PostgreSQL выделим 22 ГБ (70%).

Шаг 2. Базовые параметры памяти

Откройте файл postgresql.conf (обычно /etc/postgresql/16/main/postgresql.conf) и задайте значения.

shared_buffers — кеш страниц данных, аналог буферного кеша Oracle. Главное правило для начала: 25% от доступной ОЗУ.

shared_buffers = 8GB

effective_cache_size  оценка объёма страничного кеша ОС плюс shared_buffers. Не выделяет память, но планировщик использует её для выбора оптимального плана запроса. Рекомендуется 50–75% от ОЗУ.

effective_cache_size = 16GB

work_mem  память, выделяемая для сортировки и хеш-таблиц на каждую операцию в рамках одного запроса. Ошибка новичков установить слишком большим. Расчёт: (ОЗУ - shared_buffers) / (max_connections * 4). Для 1С типично 150–200 подключений.

work_mem = 64MB

maintenance_work_mem  память для служебных операций: VACUUM, CREATE INDEX, REINDEX. Можно установить большим, так как эти операции редки и выполняются последовательно.

maintenance_work_mem = 1GB

temp_buffers  кеш временных таблиц. Обычно 8-16 МБ достаточно.

temp_buffers = 16MB

Официальная документация по этим параметрам: PostgreSQL Memory Configuration.

Шаг 3. Параметры планировщика запросов

random_page_cost — стоимость произвольного чтения страницы с диска по отношению к последовательному. Для SSD (NVMe/SATA) значение нужно снижать до 1.1–1.5, иначе планировщик будет избегать индексов, считая диск медленным.

random_page_cost = 1.1

seq_page_cost и cpu_tuple_cost обычно оставляют по умолчанию (1.0 и 0.01 соответственно), если только вы не работаете с очень специфичными нагрузками.

effective_io_concurrency — количество одновременных операций ввода-вывода, которые может обслужить дисковая подсистема. Для NVMe -200, для SATA SSD — 100, для HDD — 2.

effective_io_concurrency = 200

Полный список параметров планировщика и их описание: Planner Cost Constants.

Шаг 4. Настройка ввода-вывода и WAL

wal_level — для продакшена рекомендуем replica (или logical, если нужна логическая репликация). Это влияет на объём записываемых данных.

wal_level = replica

fsync — принудительный сброс WAL на диск. Отключать (off) можно только в тестовых средах, иначе при сбое питания возможна потеря данных.

fsync = on

synchronous_commit  для высокой производительности при нагрузке 1С часто устанавливают off, что не нарушает целостности данных, но может привести к потере последних транзакций при аварийном выключении сервера. Безопасное значение  on, компромиссное  remote_write (если есть реплика).

synchronous_commit = on

wal_buffers  обычно 1/32 от shared_buffers, но не более 16 МБ.

wal_buffers = 16MB

max_wal_size и min_wal_size — предельные размеры кластера журналов WAL. Для активной записи увеличьте max_wal_size.

max_wal_size = 4GB
min_wal_size = 1GB

Подробнее: Write Ahead Log Configuration.

Шаг 5. Специфические настройки для 1С:Предприятие

Платформа 1С активно использует временные таблицы и выполняет множество однотипных запросов с параметрами. Рекомендуется:

max_connections— 1С обычно требует 100–200 подключений. Устанавливайте с запасом.

max_connections = 200

escape_string_warning и standard_conforming_strings — для совместимости с текстами запросов 1С.

escape_string_warning = off
standard_conforming_strings = off

Эти директивы упомянуты в официальной документации по настройке PostgreSQL для 1С.

Также полезно увеличить max_locks_per_transaction, если 1С жалуется на нехватку блокировок:

max_locks_per_transaction = 256

Шаг 6. Обновление статистики и автовакуум

autovacuum — для 1С критически важен, чтобы не допускать разрастания таблиц. Убедитесь, что он включён, и настройте более агрессивный режим.

autovacuum = on
autovacuum_max_workers = 4
autovacuum_naptime = 30s
autovacuum_vacuum_scale_factor = 0.05
autovacuum_analyze_scale_factor = 0.02

Подробнее: Autovacuum Tuning.

Шаг 7. Применение конфигурации и перезапуск

После изменения файла сохраните его и перезапустите сервер PostgreSQL:

bash

sudo systemctl restart postgresql

Проверьте, что сервер запустился с новыми параметрами:

bash

sudo -u postgres psql -c "SHOW shared_buffers;"

Шаг 8. Тестирование производительности

Для быстрой проверки используйте встроенный инструмент pgbench. Инициализируйте тестовую базу и запустите нагрузочный тест:

bash

sudo -u postgres pgbench -i -s 10 testdb
sudo -u postgres pgbench -c 20 -T 60 testdb

Сравните транзакции в секунду (TPS) до и после настройки. Значительный прирост указывает на корректность изменений.

Устранение распространённых проблем

СимптомВероятная причинаРешение
После увеличения shared_buffers производительность упалаСлишком большая доля ОЗУ отдана PostgreSQL, страничный кеш ОС уменьшился, что замедлило чтение файловСнизьте shared_buffers до 20-25% ОЗУ и увеличьте effective_cache_size.
Запросы 1С выполняются с высоким IO:TimingПланировщик выбирает Seq Scan вместо Index Scan из-за высокого random_page_costУстановите random_page_cost = 1.1 для SSD.
Ошибка «too many clients» в 1СПревышено max_connectionsУвеличьте max_connections с запасом (200-300) и перезапустите PostgreSQL.
База «раздувается», несмотря на VACUUMНеправильно настроен autovacuum, не успевает обрабатыватьУменьшите autovacuum_vacuum_scale_factor до 0.01-0.05, увеличьте количество workers до 4-6.
После настройки synchronous_commit=off 1С теряет данные при сбояхОжидаемое поведение: жертва надёжности ради скоростиДля финансовых систем верните on и оптимизируйте дисковую подсистему.

Итог

PostgreSQL настройка производительности  это итеративный процесс, требующий анализа реальной нагрузки. Приведённые параметры создают надежный фундамент для сервера 1С и других высоконагруженных систем, позволяя полностью утилизировать доступную память и возможности современных SSD. После изменения конфигурации обязательно наблюдайте за поведением базы с помощью pg_stat_statementspgBadger или встроенного мониторинга 1С и корректируйте work_mem или random_page_cost под характер запросов. Следование рекомендациям сообщества и официальной документации Postgres Professional гарантирует стабильную и быструю работу даже при одновременной работе сотен пользователей.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Популярные
Новые Старые

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
Menu