В процессе работы с платформой «1С:Предприятие 8.3» в связке с СУБД PostgreSQL пользователи могут сталкиваться со внезапным завершением сеансов и сообщением системы: «Сервер баз данных не обнаружен». При этом после повторного входа в 1С работа продолжается в штатном режиме до следующего сбоя. Проанализируем причины такого поведения, разберем записи в логах PostgreSQL и рассмотрим пошаговые способы стабилизации системы.
При возникновении описанного сбоя в журнале регистрации PostgreSQL (файлах логов) чаще всего фиксируются следующие предупреждения и ошибки:
WARNING: worker took too long to start; canceled
WARNING: autovacuum worker started without a worker entry
LOG: could not receive data from client: An established connection was aborted by the software in your host machine.
Выясним, что означают эти записи и какова механика их появления:
fork(). Для запуска рабочих процессов PostgreSQL эмулирует этот механизм путем создания новых процессов и повторного подключения к общей памяти (shared memory). При сильной фрагментации RAM, высоком дисковом вводе-выводе или недостатке виртуальной памяти выделение ресурсов задерживается. Главный процесс СУБД (postmaster), не получив отклик за отведенное время, отменяет запуск рабочего процесса со статусом WARNING: worker took too long to start; canceled. Если процесс все же успевает инициализироваться после отмены, возникает предупреждение WARNING: autovacuum worker started without a worker entry.postmaster принудительно завершает все остальные активные соединения для сохранения целостности данных в общей памяти. В этот момент фоновые и рабочие процессы сервера 1С мгновенно теряют сокетное соединение с СУБД, фиксируя ошибку could not receive data from client..., а пользователи получают аварийный вылет с сообщением «Сервер баз данных не обнаружен».Рассмотрим ключевые параметры конфигурационного файла postgresql.conf, изменение которых позволяет устранить нехватку ресурсов и стабилизировать работу СУБД.
Параметр work_mem определяет объем памяти, выделяемый для каждой операции сортировки и хеширования внутри одного запроса. Распространенная ошибка — установка слишком большого значения (например, 500 MB).
Учтем, что один сложных запрос 1С может содержать несколько операций сортировки, а при десятках параллельных сеансов суммарное потребление памяти мгновенно истощает ресурсы сервера, вызывая аварийный отстрел процессов ОС. Для баз 1С рекомендуется устанавливать work_mem в пределах от 32MB до 64MB.
Параметр shared_buffers задает объем оперативной памяти, выделяемой PostgreSQL под буферный кэш данных. Если значение слишком мало, СУБД постоянно обращается к дисковому накопителю, создавая критическую нагрузку на ввод-вывод и вызывая таймауты при старте рабочих процессов (workers).
Для выделенного сервера базы данных оптимальное значение shared_buffers составляет порядка 25% от общего объема ОЗУ сервера (например, 8 GB при 32 GB RAM на сервере).
Служба autovacuum отвечает за очистку устаревших версий строк. Чтобы процедуры очистки не блокировали работу основной базы и не перегружали диски:
maintenance_work_mem на уровень 512MB – 1024MB. Это позволит автовакууму и операциям индексации эффективно обрабатывать большие массивы данных.autovacuum_max_workers (обычно достаточно значения от 3 до 4).Для предотвращения «просадок» производительности во время сброса грязных страниц из памяти на диск применим параметры сглаживания ввода-вывода:
checkpoint_completion_target = 0.9
max_wal_size = 4GB
Разберем дополнительные системные факторы, приводящие к спонтанным разрывам TCP-соединений между сервером 1С и PostgreSQL.
127.0.0.1, если СУБД и сервер 1С находятся на одном хосте). Это исключит сбои при задержках разрешения имен через DNS или DHCP.data) и исполняемые файлы СУБД в жесткие исключения сканирования.Проанализируем специфические настройки ОС Windows Server для предотвращения проблем с выделением памяти и сетевыми сокетами:
Если оптимизация параметров под управлением Windows Server не приносит абсолютной стабильности под высокой нагрузкой, рассмотрим следующие решения:
fork(), что полностью устраняет проблему задержки инициализации воркеров (worker took too long to start) и повышает общий отклик системы.