Медленная работа 1С в связке с PostgreSQL — это распространенная проблема, которая часто проявляется не сразу, а по мере накопления данных или интенсивной работы пользователей. В рассматриваемой ситуации мы видим классический симптом: производительность системы восстанавливается после реиндексации и реструктуризации, но через 3–5 дней документы снова начинают проводиться крайне медленно (до 2 минут). Это прямо указывает на неоптимальные настройки СУБД и операционной системы. Разберем пошагово, как диагностировать и решить эту проблему.
Прежде чем приступать к изменению настроек, нам необходимо точно выяснить, что именно тормозит. Рассмотрим ситуацию, когда база данных имеет объем 30 Гб, а сервер оснащен 32 Гб ОЗУ. Проанализируем сообщения форума и дополним их практическими шагами:
log_min_duration_statement. Если установить его в значение 2000ms, сервер будет записывать в лог все запросы, которые выполнялись дольше 2 секунд.Одной из ключевых причин замедления является неправильное распределение оперативной памяти. Рассмотрим настройки postgresql.conf для сервера с 32 Гб ОЗУ.
Параметр shared_buffers. В исходном сообщении было указано значение 2048 Мб. Для базы в 30 Гб это крайне мало. Выясним причину: shared_buffers определяет объем памяти, который PostgreSQL использует для кэширования данных. Если данные не помещаются в этот кэш, СУБД постоянно обращается к диску. Для Windows-версии PostgreSQL оптимально установить 8 Гб (около 25% от всей памяти). Большие значения в Windows могут работать нестабильно из-за особенностей кэширования операционной системы.
Параметр work_mem. Этот параметр определяет объем памяти для операций сортировки и группировки внутри одного запроса. 1С часто генерирует сложные запросы. Если work_mem слишком мал, временные результаты сбрасываются на диск, что резко замедляет работу. Рекомендуем установить 64–128 Мб.
Параметр maintenance_work_mem. Он влияет на скорость создания индексов и работу вакуума. Установим его в значение 1–2 Гб, чтобы регламентные операции проходили быстрее.
Параметр effective_cache_size. Это «подсказка» планировщику запросов о том, сколько памяти доступно в кэше ОС. Установим его на уровне 20–24 Гб (около 75% всей ОЗУ).
Если реиндексация помогает на 3–5 дней, значит, база страдает от накопления «мертвых» строк (bloat). В PostgreSQL при изменении или удалении записи старая версия строки остается на диске и помечается как неиспользуемая. Очисткой этих строк занимается autovacuum. Рассмотрим, как заставить его работать агрессивнее.
Разберем настройки в postgresql.conf:
autovacuum = on
autovacuum_max_workers = 5
autovacuum_vacuum_scale_factor = 0.01
autovacuum_analyze_scale_factor = 0.005
По умолчанию autovacuum_vacuum_scale_factor равен 0.2. Это значит, что очистка начнется только после изменения 20% данных в таблице. Для 1С это недопустимо много. Установив 0.01 (1%), мы добьемся того, что очистка будет запускаться гораздо чаще, не позволяя таблицам «раздуваться».
Помимо автоматических процессов, необходимо настроить ночные регламенты. Разберем основные операции:
REINDEX DATABASE в часы минимальной нагрузки.Поскольку сервер работает под управлением Windows Server 2016, проанализируем специфические настройки ОС:
postgres.exe и ragent.exe.Проанализируем конфигурацию дисков. Массив RAID 10 из HDD — это надежно, но для современной 1С этого часто недостаточно из-за низкой скорости случайного доступа. Рассмотрим возможность переноса базы на SSD или NVMe накопители. 1С совершает огромное количество мелких операций записи во временные таблицы. Даже обычное зеркало (RAID 1) из серверных SSD будет работать в разы быстрее, чем RAID 10 из HDD, за счет минимальных задержек (Latency).
Также стоит обратить внимание на версии ПО. Связка 1С 8.3.10 и PostgreSQL 9.6 сильно устарела. Современные сборки PostgreSQL (начиная с 12-й и 15-й версий), оптимизированные специально для 1С, содержат значительные улучшения в планировщике запросов и механизмах блокировок. Рассмотрим переход на актуальные версии платформы и СУБД для получения доступа к новым механизмам оптимизации.
Подведем итог: для решения проблемы мы должны увеличить shared_buffers, настроить autovacuum на более частое срабатывание, проверить план электропитания сервера и пересмотреть регламенты обслуживания индексов. Только комплексный подход позволит избавиться от еженедельных тормозов и обеспечить стабильную работу пользователей в 1С.