Проверка боем: оптимизация кластера и рабочих процессов 1С | infolimp.ru

Проверка боем: оптимизация кластера и рабочих процессов 1С

29 августа 2026 · infolimp.ru

Коллеги, мы привыкли оптимизировать кластер 1С через штучную настройку пулов, лимитов памяти и количества рабочих процессов. Стандартные рекомендации — «увеличить число процессов под простаивающие фоновые задания» или «ограничить память, чтобы не схлопнуться по свопу». Но есть слой, который эти советы не затрагивают: параметризация самих воркеров через HTTP и тонкая балансировка контекста сеансов. Мы разберём нетривиальную ловушку, из-за которой кластер «плывёт» на ровном месте при росте числа фоновых заданий, и покажем, как её обезвредить без покупки дополнительных лицензий.

Теневой убийца производительности: межпроцессный шум при переключении контекста

Большинство администраторов считают, что проблема решается простым увеличением количества процессов rphost. Однако на нагрузке 80+ фоновых заданий в час, работающих с одним и тем же справочником «Номенклатура» (или регистром «ТоварыНаСкладах»), возникает эффект конкурентного инвалидирования кэшей.

Механика под капотом: почему «умножать процессы» — не панацея

Когда два рабочих процесса (например, Процесс-1 и Процесс-2) одновременно пишут в один объект метаданных, платформа вынуждена сбрасывать общий кэш данных (т.н. shared cache) между ними. Это происходит на уровне блокировок СУБД, но, что хуже, каждый сброс кэша заставляет оба процесса перечитывать большие объёмы данных из SQL-базы заново. Вы получаете не параллельное ускорение, а взаимное торможение.

Ключевой тезис: «Оптимизация кластера — это не про количество процессов, а про то, как они делят между собой общие данные. Каждый лишний rphost при плотной записи в одни и те же таблицы — это лишняя копия кэша, которая инвалидируется ровно в тот момент, когда она нужна другому процессу».

Мы столкнулись с ситуацией, когда увеличение числа рабочих процессов с 4 до 12 на 16-ядерном сервере привело к росту времени выполнения фонового задания «Обновление итогов» на 40 %. Типичная реакция: «виновата архитектура конфигурации» или «надо менять железо». В реальности же сработал межпроцессный шум.

Профилирование: ищем аномалию через HTTP-интерфейс кластера

Стандартный способ — смотреть консоль администрирования. Но для быстрой диагностики «на месте» используем программный опрос через HTTPСоединение к REST-интерфейсу кластера (например, если включен RAS на порту 1545).

Пример кода: дашборд загрузки воркеров за последние 30 минут


Функция ЗагрузитьСтатистикуКластера() Экспорт
    
    // Формируем HTTP-запрос к REST-сервису RAS (порт 1545)
    HTTPЗапрос = Новый HTTPЗапрос("/cluster/working_processes?timeout=30");
    HTTPЗапрос.УстановитьТелоИзСтроки("", "UTF-8");
    
    Попытка
        Соединение = Новый HTTPСоединение("localhost", 1545, "", "",
            Новый ИнтернетПрокси(Ложь), 30);
        Ответ = Соединение.Получить(HTTPЗапрос);
    Исключение
        ЗаписьЖурналаРегистрации("RAS недоступен", УровеньЖурналаРегистрации.Ошибка,,
            , КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
        Возврат Неопределено;
    КонецПопытки;
    
    Если Ответ.КодСостояния = 200 Тогда
        СтрокаJSON = Ответ.ПолучитьТелоКакСтроку("UTF-8");
        ЧтениеJSON = Новый ЧтениеJSON;
        ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
        
        // Ожидаем массив объектов
        МассивПроцессов = ПрочитатьJSON(ЧтениеJSON);
        ЧтениеJSON.Закрыть();
        
        // Вычисляем среднюю загрузку
        СуммаЗагрузки = 0;
        Счетчик = 0;
        Для каждого Элемент Из МассивПроцессов Цикл
            Если ТипЗнч(Элемент) = Тип("Соответствие") И Элемент.Свойство("cpu_usage_avg") Тогда
                СуммаЗагрузки = СуммаЗагрузки + Элемент["cpu_usage_avg"];
                Счетчик = Счетчик + 1;
            КонецЕсли;
        КонецЦикла;
        
        Возврат СуммаЗагрузки / Макс(Счетчик, 1);
    КонецЕсли;
    
    Возврат Неопределено;
КонецФункции

Когда это реально нужно: когда в консоли кластера вы видите «Process memory — OK», «Lock conflicts — единичные», но фоновые задания выполняются в 2–3 раза дольше ожидаемого. Сравните средний cpu_usage_avg по всем воркерам — если разброс более 30 % при одинаковом профиле нагрузки, это верный признак межпроцессного шума.

Практическое руководство: принудительная изоляция «шумных» заданий

Мы опробовали два подхода. Первый — выделение отдельных рабочих процессов под фоновые задания (через настройки пулов в RAS). Второй — динамическое переключение контекста выполнения через программное назначение менеджеру задания конкретного рабочего процесса (доступно в механизме «Очередь заданий» в ERP 2.5+).

Чек-лист «Как не допустить шума»

  1. Определите «горячие» объекты. Запустите ТекущиеОжидания или анализ SQL-трафика (через tracelog). Найдите таблицы, по которым идёт >80 % конфликтов блокировок.
  2. Сгруппируйте фоновые задания по типу доступа. Все задания, пишущие в «ОстаткиТоваров» — в один пул. Читающие только «Номенклатуру» — в другой.
  3. Ограничьте количество процессов в пуле до числа, не превышающего количество ядер сервера СУБД (не сервера 1С!). Для высококонфликтных операций идеально — 1 процесс на пул.
  4. Установите лимит памяти на процесс не менее 2 ГБ для заданий, работающих с большими выборками, чтобы избежать дополнительных сбросов кэша при сборке мусора.

Типичные ошибки при настройке изоляции

Ошибка Последствие
Установка одного пула с «бесконечным» числом рабочих процессов Кэш инвалидируется каждые несколько секунд; процессор загружен не работой, а переключением контекстов
Игнорирование лимитов памяти (оставлено значение по умолчанию 0) Один «тяжёлый» отчет может отжать память у всех процессов пула и спровоцировать chain-ошибки
Назначение фоновых заданий «по кругу» (round-robin) без учёта конфликтности данных Два процесса одной группы получают блокировки друг у друга, растёт число Deadlock’ов

Проверка на практике: A/B-тест на рабочем кластере

Мы провели эксперимент на кластере из 3 серверов (vCPU: 16×2.4 GHz, RAM: 64 ГБ, СУБД: MS SQL Server 2019). Типовая ERP-2.5 (не hyper-cloud). Замеряли время выполнения задания «Расчёт себестоимости» на 5 млн остатков.

Сценарий Время выполнения (мин) Средняя загрузка CPU, % Кол-во взаимоблокировок
8 процессов в общем пуле, без ограничений 47 72 18
4 процесса, разделённых на 2 пула (по назначению) 31 55 4
1 процесс, выделенный только для этого задания (остальные — в общем пуле) 26 48 1
Вывод: Изоляция «шумного» фонового задания в отдельный рабочий процесс дала выигрыш в 44 % времени. При этом общая загрузка процессора снизилась на треть, так как исчезли накладные расходы на синхронизацию кэшей.

Что делать прямо сейчас: 5 минут на диагностику

Предупреждение: Не изолируйте фоновые задания, которые вызывают синхронные операции с сеансовыми данными (например, запись в регистры «ДатыЗапретов») — это может привести к зависанию из-за блокировки на уровне сеанса. В таких случаях безопаснее оставить их в общем пуле и добавить один дополнительный процесс «на подхват».

Расширение «НОПик» для 1С — встраиваемый коннектор к внешнему AI с интеллектуальным поиском по базе. Задавайте вопросы обычными словами - AI сам найдёт нужное. 45 дней бесплатно.

Попробовать НОПик →
Знаете ответ на такие вопросы не хуже автора статьи? Пройдите бесплатную анонимную проверку уровня на infolimp.ru - 3 практических задачи, 15 минут, публичный токен-профиль, который можно показать работодателю или заказчику. Без регистрации по почте.

Проверить свой уровень бесплатно →