Как повысить производительность PostgreSQL для 1С:Предприятия и догнать MS SQL

Системный администратор 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Перевод информационных баз 1С:Предприятия на СУБД PostgreSQL — один из самых популярных сценариев при импортозамещении и оптимизации затрат на лицензирование. Однако многие системные администраторы и разработчики при первом тестировании сталкиваются с неприятным сюрпризом: производительность PostgreSQL «из коробки» на операционной системе Windows оказывается значительно ниже, чем у MS SQL Server. В некоторых случаях разница в скорости выполнения критических операций, таких как проведение документов, может достигать двух и более раз.

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

Почему PostgreSQL «из коробки» работает медленнее MS SQL

Для начала выясним причину, по которой «ванильный» (стандартный) PostgreSQL показывает скромные результаты сразу после установки. Разработчики PostgreSQL изначально ориентируют стандартные настройки конфигурации на минимальные системные требования. СУБД по умолчанию сконфигурирована так, чтобы запуститься практически на любом «железе», потребляя минимум оперативной памяти (около 128–512 МБ). MS SQL Server, напротив, динамически захватывает практически всю доступную оперативную память сервера и оптимизирует свои процессы под текущие аппаратные мощности в автоматическом режиме.

Кроме того, архитектура планировщика и оптимизатора запросов MS SQL Server исторически более эффективно обрабатывает сложные, многократно вложенные запросы со множеством соединений виртуальных таблиц, которые генерирует платформа 1С. PostgreSQL требует более точной настройки параметров стоимости операций, чтобы правильно строить планы выполнения таких запросов.

Влияние операционной системы: Почему Windows — это моветон для PostgreSQL

Рассмотрим важный архитектурный аспект. PostgreSQL исторически разрабатывался под Unix-подобные операционные системы. В Linux используется fork-модель управления процессами, которая работает крайне быстро и эффективно. Портирование PostgreSQL на операционную систему Windows выполнено через эмуляцию некоторых функций, и СУБД вынуждена использовать потоки Windows (threads) внутри одного процесса, что накладывает определенные ограничения на масштабируемость и скорость работы с памятью.

Еще одна серьезная проблема кроется в сетевом обмене между сервером приложений 1С (процессом rphost) и СУБД:

  1. В среде Windows: Если сервер 1С и MS SQL установлены на одном физическом сервере, они общаются по сверхбыстрому протоколу Shared Memory (общая память), минуя сетевой стек. PostgreSQL на Windows не умеет использовать протокол Shared Memory для связи с 1С. Обмен данными происходит через локальный сетевой сокет (TCP/IP Loopback, localhost), что создает колоссальные накладные расходы на сетевой стек ОС при передаче больших выборок данных.
  2. В среде Linux: При размещении сервера 1С и PostgreSQL на Linux обмен данными между ними может быть настроен через локальные Unix-сокеты (файловые сокеты). По своей скорости этот механизм максимально приближен к Shared Memory и полностью исключает накладные расходы сетевого стека TCP/IP.

Поэтому перенос СУБД PostgreSQL на Linux (например, Ubuntu, CentOS, RedOS или Astra Linux) сам по себе дает прирост производительности в районе 20–30% за счет более эффективной работы с памятью, файловой системой и локальными сокетами.

Проблема однопоточности при проведении документов

Часто при анализе производительности СУБД администраторы замечают, что во время длительного перепроведения документов процессор сервера загружен всего на 10–12%. Выясним причину этого явления. Проведение конкретного документа в 1С (или запуск пакетного проведения в рамках одной сессии) всегда выполняется в один поток. Один поток может утилизировать на 100% только одно логическое ядро процессора.

Если на вашем сервере установлен процессор с 8 ядрами (или 16 потоками с учетом Hyper-Threading), то теоретический максимум загрузки процессора одним потоком проведения составляет всего 6,25% – 12,5%. В данном случае узким местом становится не СУБД сама по себе, а тактовая частота одного ядра процессора и скорость работы СУБД с временными таблицами. Для таких задач критически важно выбирать процессоры с высокой частотой на одно ядро (например, Intel Core i7 / i9 или современные процессоры AMD Ryzen с частотой выше 4.5 ГГц в режиме Turbo Boost), а также использовать максимально быстрые диски NVMe.

Пошаговая настройка файла postgresql.conf под задачи 1С

Перейдем к практическому тюнингу параметров СУБД. Все изменения мы будем вносить в конфигурационный файл postgresql.conf. Ориентируемся на сервер со следующими характеристиками: 8-ядерный процессор, 32 ГБ оперативной памяти DDR4 и дисковая подсистема на быстрых SSD NVMe в RAID-массиве.

Рассмотрим подробнее ключевые параметры, которые необходимо изменить.

1. Настройка буферов и памяти (Memory Settings)

Для эффективного кэширования данных и оптимизации работы с временными таблицами установим следующие параметры:


shared_buffers = 8GB # Устанавливаем 25% от общего объема ОЗУ (32 ГБ). На Windows не рекомендуется ставить выше 8-10 ГБ из-за особенностей работы с памятью.
temp_buffers = 256MB # 1С активно использует временные таблицы. Увеличение этого параметра до 128-256 МБ позволит обрабатывать их в оперативной памяти без сброса на диск.
work_mem = 128MB # Объем памяти для сортировок и группировок в рамках одного запроса. Если запросы сложные, СУБД будет делать это в памяти.
maintenance_work_mem = 2GB # Память для сервисных операций (индексация, очистка VACUUM). Позволит ускорить регламентные процедуры.

2. Настройка оптимизатора запросов и планировщика (Planner Cost Constants)

Стандартные настройки планировщика рассчитаны на медленные диски HDD. Если СУБД размещена на быстрых SSD NVMe, планировщик должен об этом знать, иначе он будет строить неоптимальные планы, избегая индексного сканирования. Настроим параметры стоимости операций:


random_page_cost = 1.1 # Для SSD дисков стоимость случайного доступа почти равна последовательному. По умолчанию стоит 4.0.
seq_page_cost = 1.0 # Базовая стоимость последовательного чтения.
effective_cache_size = 24GB # Оценка общего объема памяти, доступного для кэширования файлов (примерно 75% от всей ОЗУ сервера). Помогает планировщику точнее оценивать шансы нахождения данных в кэше.

3. Настройка транзакционного лога и ускорение записи (Write-Ahead Log)

Для ускорения операций записи и проведения документов крайне важна настройка сброса транзакций на диск. По умолчанию включен жесткий режим синхронизации, когда каждая транзакция ожидает физической записи на диск:


synchronous_commit = off # Отключаем жесткую синхронизацию транзакций. Запись будет идти в буфер WAL, а на диск сбрасываться асинхронно (раз в доли секунды). Это дает кратный прирост скорости проведения документов. Риск потери данных минимален и ограничивается транзакциями за последние 0.5-1 сек в случае аварийного отключения питания сервера.
wal_buffers = 16MB # Размер буфера для незаписанных данных WAL. При включении асинхронного коммита этот буфер должен быть заполнен оптимально.
checkpoint_completion_target = 0.9 # Размазывает процесс записи контрольной точки во времени, снижая пиковую нагрузку на диски.
checkpoint_timeout = 15min # Увеличиваем интервал между контрольными точками, чтобы снизить частоту интенсивных дисковых операций записи.
max_wal_size = 4GB # Разрешаем накапливать больший объем логов транзакций перед принудительным чекпоинтом.

4. Агрессивная настройка автовакуума (Autovacuum)

В процессе работы 1С постоянно создает, обновляет и удаляет миллионы временных записей. В PostgreSQL при изменении или удалении строки старая версия физически остается на диске («мертвая строка»). Если их вовремя не очищать, таблицы начинают «раздуваться» (bloat), а скорость выполнения запросов резко падает. Настройки автовакуума по умолчанию слишком ленивы для 1С. Сделаем очистку более частой и агрессивной:


autovacuum = on # Обязательно должен быть включен!
autovacuum_max_workers = 4 # Количество одновременно работающих процессов очистки.
autovacuum_naptime = 20s # Интервал времени, через который запускается проверка таблиц на необходимость очистки.
autovacuum_vacuum_scale_factor = 0.05 # Запускать очистку таблицы, если в ней изменилось или удалилось более 5% строк (по умолчанию 20%).
autovacuum_analyze_scale_factor = 0.02 # Запускать сбор статистики, если изменилось более 2% строк таблицы.
autovacuum_vacuum_cost_limit = 1000 # Увеличиваем лимит стоимости операций очистки, чтобы автовакуум не засыпал слишком быстро при высокой активности.

Роль расширений online_analyze и plantuner

Для СУБД PostgreSQL, используемой совместно с 1С, критически важна установка специализированных расширений, поставляемых в дистрибьюторах от самой компании 1С или Postgres Pro:

Убедитесь, что данные расширения прописаны в параметре shared_preload_libraries в файле postgresql.conf:

shared_preload_libraries = 'online_analyze, plantuner'

После внесения изменений в конфигурационный файл обязательно перезапустите службу PostgreSQL для применения настроек.

Оценка результатов: Сравнение до и после оптимизации

Проанализируем результаты проделанной работы. При первоначальном запуске теста производительности (например, популярного теста Гилева) на «чистом», ненастроенном PostgreSQL на Windows показатели могут находиться в районе 15–18 попугаев. В то же время MS SQL на аналогичном железе без труда выдает 40–45 попугаев.

После выполнения тонкой настройки конфигурационного файла postgresql.conf (изменение параметров памяти, отключение synchronous_commit, оптимизация стоимости операций под SSD) производительность PostgreSQL в тесте Гилева вырастает до 40–43 попугаев, практически полностью сравниваясь с показателями MS SQL Server.

При этом, если мы замерим время проведения сложного пакета документов (как в примере автора темы — около 19 000 документов), мы увидим, что общая скорость проведения вырастет благодаря оптимизации записи на диск и ускорению работы с временными таблицами. Однако окончательный паритет будет достигнут только при переносе СУБД на операционную систему Linux, где накладные расходы на межпроцессное взаимодействие минимальны.

Резюме и рекомендации

Выяснив причины низкой производительности СУБД, мы можем сформулировать ключевые правила успешного внедрения PostgreSQL для баз данных 1С:

  1. Используйте специализированные сборки. Не устанавливайте стандартный дистрибутив PostgreSQL с официального сайта СУБД. Используйте адаптированные версии от компании «1С» или специализированные дистрибутивы (например, Postgres Pro Standard/Enterprise), содержащие встроенные патчи оптимизации временных таблиц.
  2. Переносите PostgreSQL на Linux. Это избавит вас от ограничений Windows в работе с памятью и позволит использовать быстрые локальные сокеты вместо сетевого стека TCP/IP.
  3. Всегда настраивайте параметры вручную. Никогда не запускайте рабочую базу на настройках по умолчанию. Тюнинг параметров памяти (shared_buffers, temp_buffers), дисковых операций (synchronous_commit = off) и автовакуума — обязательный шаг.
  4. Используйте современные платформы. Новые версии платформы 1С:Предприятие (начиная с 8.3.15 и выше) генерируют гораздо более оптимизированный SQL-код под синтаксис PostgreSQL, что существенно сокращает разрыв в скорости по сравнению с MS SQL Server.
← На главную