В процессе эксплуатации высоконагруженных систем на платформе 1С:Предприятие 8.2 администраторы часто сталкиваются с проблемой «прожорливости» фоновых заданий. Роботы могут потреблять десятки гигабайт оперативной памяти, что приводит к деградации производительности всей системы, даже если физически свободная память еще остается. В отличие от версии 8.3, в 8.2 отсутствуют штатные «Требования назначения функциональности», которые позволяют одной кнопкой запретить выполнение фоновых заданий на определенных рабочих серверах. Однако существуют проверенные технические методы, позволяющие добиться изоляции нагрузки. Рассмотрим их подробно.
Разберем ситуацию: когда рабочий процесс rphost накапливает значительный объем кэша и данных (30–40 Гб), менеджер памяти платформы 8.2 начинает работать неэффективно. Это часто связано с фрагментацией памяти или особенностями работы 32-битных компонентов внутри 64-битной службы. Поскольку фоновые задания и сессии пользователей в 8.2 могут перемешиваться внутри одних и тех же рабочих процессов, «тяжелый» робот неизбежно замедляет работу обычных пользователей. Выясним, как мы можем принудительно развести эти потоки.
В платформе 8.2 существует возможность управления сервисами кластера через консоль администрирования. Проанализируем, как это работает:
Сервис заданий (JobService).Важное ограничение: Перенос самого сервиса заданий на другой менеджер (на другой физический сервер или другой инстанс) лишь переносит «планировщик», который следит за расписанием. К сожалению, это не дает 100% гарантии, что код задания не запустится на «пользовательском» сервере, так как выполнение инициируется в рамках доступных рабочих процессов rphost. Тем не менее, это первый шаг к распределению управляющей логики.
Это самый надежный способ физической изоляции ресурсов в версии 8.2. Мы запустим вторую службу сервера 1С, которая будет иметь свои собственные рабочие процессы rphost, независимые от основной службы. Рассмотрим пошагово, как это реализовать:
sc create. Для этого нужно указать другое имя службы и другие порты (например, основной кластер на 1540, второй на 1640).Бухгалтерия_Фоновые).Таким образом, фоновые задания будут выполняться в процессах rphost второго инстанса, который имеет свои лимиты памяти и не мешает пользователям первого инстанса. Посмотрим на пример команды для создания второй службы:
sc create "1C:Enterprise 8.2.19.130 Server_Background" binPath= "C:\Program Files\1cv82\8.2.19.130\bin\ragent.exe -srvc -agent -regport 1641 -port 1640 -range 1660:1691 -d \"C:\Program Files\1cv82\srvinfo_bg\""
Обратите внимание, что каталог данных -d также должен быть отдельным, чтобы настройки кластеров не пересекались.
Если создание второго кластера кажется слишком сложным, проанализируем настройки рабочего сервера в консоли 1С. Мы можем ограничить «вред», который наносит одно фоновое задание, путем дробления рабочих процессов:
rphost.Рассмотрим вариант, когда мы хотим программно запретить выполнение кода, если сессия запустилась не на том сервере. Мы можем использовать функцию СтрокаСоединенияИнформационнойБазы() для определения точки входа. Разберем логику:
// В начале процедуры регламентного задания
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
Если Найти(СтрокаСоединения, "SRV-WORKER") > 0 Тогда
// Мы на пользовательском сервере, прерываем выполнение
ЗаписьЖурналаРегистрации("ФоновыеЗадания", УровеньЖурналаРегистрации.Предупреждение, , , "Попытка запуска на основном сервере подавлена.");
Возврат;
КонецЕсли;
Однако помните, что СтрокаСоединенияИнформационнойБазы() часто возвращает адрес менеджера кластера, а не конкретного рабочего сервера. Для более точной идентификации в 8.2 иногда используют внешние компоненты или обращение к WScript.Network для получения имени хоста, на котором исполняется rphost.
Выясним еще один способ: выполнение тяжелого кода через COMConnector. Основная база может инициировать соединение сама с собой, но подключаться при этом к другому кластеру (см. Метод 2).
Проанализируем пример кода:
V82Connector = Новый COMОбъект("V82.COMConnector");
// Подключаемся к той же базе, но через порт 1641 (второй инстанс)
Соединение = V82Connector.Connect("Srvr=""Localhost:1641"";Ref=""Base_Background"";Usr=""Robot"";Pwd=""123"";");
Соединение.ИмяПроцедурыМодуля();
В этом случае выполнение кода произойдет в адресном пространстве процесса rphost, принадлежащего второму кластеру, что обеспечит полную изоляцию памяти от основного рабочего окружения пользователей.
Чтобы понять, какое именно задание «отъедает» память, настройте Технологический журнал (файл logcfg.xml). В версии 8.2 важно отслеживать событие SDBL и свойство Memory. Хотя оно менее детализировано, чем в 8.3, вы сможете увидеть скачки потребления ресурсов в моменты выполнения конкретных серверных вызовов (CALL).
Резюмируем: Несмотря на почтенный возраст платформы 8.2, комбинация создания второго инстанса службы 1С и использования COM-соединений позволяет эффективно изолировать нагрузку роботов от пользователей, обеспечивая стабильность системы даже при значительных утечках памяти в фоновых процессах.