Почему сервис заданий jobService и менеджер кластера rmngr потребляют много памяти?

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

При администрировании серверов 1С:Предприятие системные администраторы нередко сталкиваются с ситуацией, когда процесс менеджера кластера rmngr.exe начинает лавинообразно расходовать оперативную память, занимая десятки гигабайт. При включении режима запуска отдельного процесса менеджера под каждый сервис кластера выясняется, что основным потребителем ресурсов выступает сервис заданий — jobService. При этом рабочие процессы rphost.exe могут продолжать работать в рамках допустимых лимитов потребления памяти. Разберем по шагам, почему возникает такое поведение платформы, как локализовать утечку и какие меры предпринять для стабилизации работы кластера.

Причины утечки памяти в сервисе заданий

Сервис заданий (jobService) выполняет роль брокера между исполняемым фоновым заданием внутри рабочего процесса rphost.exe и клиентским приложением. Рассмотрим подробнее основные архитектурные механизмы, приводящие к чрезмерному потреблению памяти:

  1. Буферизация сообщений пользователю (СообщитьПользователю). Если длительное фоновое задание (например, массовое удаление помеченных объектов, проведение или импорт данных) в цикле формирует тысячи служебных оповещений с помощью вызова СообщитьПользователю(), все эти данные передаются и оседают в оперативной памяти jobService в виде очереди. Если пользователь запустил операцию и закрыл клиентское сеансовое окно, вычитывать этот буфер становится некому. В результате очередь сообщений непрерывно растет внутри адресного пространства процесса rmngr.exe, удерживающего сервис заданий.
  2. Накопление параметров и результатов выполнения. Данные, переданные в качестве параметров запуска процедуры фонового задания, а также сериализованные результаты и структуры ошибок сохраняются в оперативной памяти сервиса до момента удаления объекта задания или очистки его контекста.
  3. Особенности аллокатора памяти и ошибки платформы. В ряде релизов платформы 1С:Предприятие (в частности, в ветках 8.3.8–8.3.10) проявляются внутренние утечки при аварийном завершении пользовательского сеанса, инициировавшего задание. Кроме того, внутренний менеджер памяти C++ рантайма платформы после освобождения объектов часто не возвращает выделенную виртуальную память операционной системе сразу из-за фрагментации кучи.

Важное ограничение платформы: штатные параметры кластера («Предельный объем оперативной памяти процессов», «Интервал превышения допустимого объема памяти») контролируют исключительно рабочие процессы rphost.exe. Механизмов автоматического контроля лимитов памяти и перезапуска для rmngr.exe на уровне кластера не предусмотрено, поэтому неконтролируемый рост менеджера может привести к отказу всего сервера.

Шаг 1. Диагностика через технологический журнал

Чтобы точно определить, какие фоновые задания приводят к разрастанию памяти, настроим сбор технологического журнала. Создадим или скорректируем файл logcfg.xml на сервере 1С. В конфигурацию технологического журнала необходимо включить аудит расхода памяти и события фоновых заданий для процесса менеджера кластера:

  1. Событие MEM — отслеживание динамики выделения оперативной памяти процессами кластера.
  2. Событие LEAKS — сбор информации о потенциальных утечках памяти.
  3. События JOB и EXCP — мониторинг жизненного цикла фоновых заданий, их параметров, фоновых модулей и возникающих исключений.

Посмотрим на пример структуры файла logcfg.xml:


<config xmlns="http://v8.1c.ru/v8/tech-log">
    <log location="C:\LOGS\1C\RM_MEM" history="24">
        <event>
            <eq property="name" value="MEM"/>
        </event>
        <event>
            <eq property="name" value="LEAKS"/>
        </event>
        <event>
            <eq property="name" value="JOB"/>
        </event>
        <event>
            <eq property="name" value="EXCP"/>
        </event>
        <property name="all"/>
    </log>
</config>

Анализ полученных логов позволит связать рост счетчиков памяти конкретного процесса rmngr.exe с выполнением определенных фоновых процедур.

Шаг 2. Корректировка прикладного кода

Проанализируем прикладной код длительных фоновых обработок (в частности, алгоритмы удаления помеченных объектов или пакетного обновления данных). Основные правила оптимизации:

  1. Исключение частых вызовов СообщитьПользователю(). В циклических операциях нельзя отправлять сообщения на каждой итерации. Если протоколирование необходимо, следует использовать запись в журнал регистрации пакетами или накапливать данные во временном текстовом файле на сервере:
    
    // Неправильно: засоряет очередь jobService
    Для Каждого СтрокаТЧ Из ТаблицаОбъектов Цикл
        // обработка объекта
        СообщитьПользователю("Обработан объект: " + СтрокаТЧ.Ссылка);
    КонецЦикла;
    
    // Правильно: порционная запись или журналирование
    Если СчетчикОбработанных % 1000 = 0 Тогда
        ЗаписьЖурналаРегистрации("МассоваяОбработка", УровеньЖурналаРегистрации.Информация, , , "Обработано объектов: " + СчетчикОбработанных);
    КонецЕсли;
    
  2. Корректная обработка закрытия форм. В обработчике закрытия управляемой формы клиента необходимо предусмотреть отмену запущенного фонового задания с помощью метода ФоновыеЗадания.Отменить(), если выполнение задания без контроля оператора недопустимо.

Шаг 3. Изоляция сервисов и администрирование кластера

Для минимизации влияния тяжелых заданий на работу пользователей кластера применим административные настройки:

  1. Разделение менеджеров по сервисам. В консоли администрирования кластера рекомендуется использовать опцию запуска менеджеров под каждый отдельный сервис. Это изолирует jobService в отдельный процесс rmngr.exe. В случае критического переполнения памяти падение или принудительный перезапуск этого процесса не приведет к разрыву пользовательских сеансов и сервиса блокировок.
  2. Требования назначения функциональности. Настроим изоляцию фоновых заданий (сервисы BackgroundJob.CommonModule и BackgroundJob.ScheduledJob), назначив для них отдельный рабочий сервер или выделенный рабочий процесс кластера.
  3. Внешний мониторинг процесса. Так как встроенного автоперезапуска для rmngr.exe нет, настроим внешний скрипт мониторинга (например, PowerShell или агент системы мониторинга), отслеживающий счетчик Working Set процессов rmngr.exe, чтобы получать оповещения о нештатном потреблении оперативной памяти до наступления аварийной ситуации.
  4. Обновление версии платформы. При систематических утечках памяти в фоновых заданиях на версиях 8.3.8–8.3.10 рекомендуется запланировать обновление платформы до актуальных стабильных релизов, в которых ошибки очистки буфера сообщений и сеансовых очередей сервиса заданий были устранены.
← На главную