Гайд 1С: Анализ и настройка размера пула потоков выполнения фоновых заданий
При активном использовании асинхронных очередей и параллельных фоновых заданий наблюдаются сбои:
- Зависание фоновых заданий в статусе
Ожидание выполнениябез перехода в активную фазу. - Ошибка
Превышено максимальное количество одновременно исполняемых фоновых заданий. - Резкая деградация производительности интерактивных пользователей из-за утилизации всех ядер CPU фоновыми потоками.
- Утечки памяти и лавинообразное порождение сотен процессов
rphost.
1. Архитектурный расчет размера пула заданий
Количество одновременно выполняемых тяжелых фоновых заданий не должно превышать количество физических процессорных ядер сервера приложений 1С за вычетом резерва под интерактивных пользователей:
MaxBackgroundJobs = (PhysicalCores - 2) * 1.52. Настройка параметров кластера через консоль администрирования (RAC / консоль)
В свойствах рабочего сервера и кластера 1С настройте ключевые ограничители:
- Количество ИБ на процесс: задайте 1 (для полной изоляции контекстов памяти).
- Количество соединений на рабочий процесс: установите лимит
25–40соединений. - Лимит памяти рабочих процессов (memoryLimit): установите значение в байтах (например, 80% от доступной физической RAM).
- Интервал превышения ограничения памяти (memoryExcessInterval):
30-60сек.
3. Программный контроль пула в коде 1С
При реализации параллельных алгоритмов (MapReduce, пакетный пересчет) используйте семафор активных заданий:
МаксимумПотоков = 8;
МассивЗаданий = Новый Массив;
Для Каждого Пакет Из МассивПакетовДанных Цикл
Пока ФоновыеЗадания.ПолучитьФоновыеЗадания(Новый Структура("Состояние", СостояниеФоновогоЗадания.Активно)).Количество() >= МаксимумПотоков Цикл
// Пауза перед проверкой освобождения слота
ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий, 2);
КонецЦикла;
Параметры = Новый Массив;
Параметры.Добавить(Пакет);
Задание = ФоновыеЗадания.Выполнить("МойМодуль.ОбработатьПакет", Параметры, , "ПакетнаяОбработка");
МассивЗаданий.Добавить(Задание);
КонецЦикла; Частые вопросы (FAQ)
Чем отличается фоновое задание от регламентного задания?
Регламентное задание создается в конфигураторе и запускается по расписанию планировщиком платформы. Фоновое задание — это динамический экземпляр потока, который может порождаться программно из любого контекста (включая регламентные задания).
Тратят ли фоновые задания клиентские клиентские лицензии 1С?
Фоновые задания, запущенные на сервере в рамках одного сеанса или сервера кластера, не требуют дополнительных клиентских лицензий платформы (используют лицензию сеанса или серверную лицензию).
Как принудительно завершить зависшее фоновое задание?
В консоли администрирования кластера найдите соответствующее соединение в ветке 'Соединения' или используйте программный метод ФоновоеЗадание.Отменить().
Почему большое количество коротких фоновых заданий создает высокую нагрузку?
Инициализация контекста сеанса, загрузка параметров конфигурации и создание соединения с СУБД для каждого нового задания создают ощутимый оверхед. Для коротких операций используйте долгоживущие воркеры с очередью.