Балансировка
Раздел описывает механизмы управления нагрузкой и очередями в кластере: как распределяются активные процессы между потоками и серверами, а также, как система работает со “спящими” процессами, временно приостанавливающими выполнение.
Балансировка призвана сглаживать нагрузки на конкретном узле путем изменения количества потоков и памяти, выделенных на выполнение процессов.
По умолчанию балансировка включена на уровне кластера. При необходимости ее можно отключить на кластере или на конкретном сервисе процессов, установив параметр useBalancing: false.
Если в сервисе процессов показатели балансировки и потребления памяти узлом заполнены, то эти значения находятся в приоритете. Значения из кластера используются, только если в настройках процессов параметры балансировщика не заполнены.
Балансировка активных процессов
Узел раз в минуту отслеживает использование ресурсов. При нагрузке на сервис:
Если сервис приблизился к порогу потребления ресурсов, балансировщик уменьшает все показатели до тех пор, пока порог потребления памяти не будет соблюдаться.
Если потребление ресурсов ниже чем 80% от максимально допустимого, происходит увеличение количества потоков до тех пор, пока потребление памяти не достигнет 90% от максимального.
При этом, если на сервисе процессов балансировка отключена, узел продолжает регулярно снимать показания и при необходимости высылать обновленные настройки балансировщика на сервис, но сервис их игнорирует с сообщением:Получены настройки балансировки в модуле с отключенным балансировщиком.
Спящие процессы
При помещении в спящие в модуле процессов сообщение отправляется в очередь спящих на узле.
Помещение процессов в спящие возможно в двух случаях:
Шаг ожидания. Бизнес процесс сериализуется и отправляется на узел в менеджер спящих процессов SleepManager.
Загрузка модуля процессов одновременно запущенными ожидающими ответов/событий завершения процессами. Т.е. процессов, в которых есть шаг, например, отправитель с ожиданием ответа.
Для управления работой сервиса Обработка данных и сообщений и балансировщика используются следующие параметры:
Имя секции
Название параметра
Имя параметра
Default
Min
Max
commonParams
Потребление памяти модулем (% от CPU).
maxModuleMemoryUsage
2
1
50
processParams
Максимальное количество потоков выполнения процессов/алгоритмов.
threadCount
5
1
10
processParams
Максимальное количество спящих процессов.
maxSleepingProcessCount
100
50
1000
processParams
Максимальный объем спящих процессов (МБ).
maxSleepingProcessMB
200
10
600
processParams
Максимальный объем памяти ожидающих старта процессов (МБ).
maxUnprocessedQueueMB
30
10
300
processParams
Минимальное время ожидания при переходе в спящий режим (мс).
minWaitBeforeSleep
10000
2000
processParams
Максимальное количество запросов, одновременно ожидающих ответа (% от maxSleepingProcessCount или maxSleepingProcessMB).
maxRunnedRequests
50
1
99
processParams
Максимальная длительность ожидания спящих процессов (мин).
maxSleepTimeMinutes
1440
1
Параметр Потребление памяти узлом устанавливается в настройках кластера и сервиса процессов однозначно и при балансировке не изменяется. Остальные параметры изменяются в диапазоне значений между Min / Max в зависимости от нагрузки и ресурсов CPU узла.
В диспетчере задач показатель фактически потребляемой памяти складывается из частного рабочего набора и общего рабочего набора с незначительной погрешностью:
Засыпание процессов происходит следующим образом:
В модуле процессов
Если шаг ожидает ответа/события (есть какой-то таймаут ожидания), то для сообщения формируется PlatformCorrelationId со специфичной закодированной информацией для засыпания. Затем этот процесс помещается в очередь (в памяти) запущенных ожидающих процессов.
Проверка необходимости засыпания в SleepProcessExecutor: происходит сравнение параметра MaxRunnedRequests из ProcessParams по формулам:
100 * (количество запущенных ожидающих процессов / ProcessParams.MaxSleepingProcessCount) >= MaxRunnedRequests
100 * (объем запущенных ожидающих процессов / (ProcessParams.MaxSleepingProcessMB * 1024 * 1024)) >= MaxRunnedRequests
Если одно из событий верное, то текущие задачи могут быть помещены в сон.
Запуск задачи выборки и отправки в сон. Выборка пачки запущенных ожидающих процессов, каждый проверяется на предмет получения ответа, если ответ не получен, процесс сериализуетсся и посылается в SleepManager. После этого дополнительно проверяется не было ли ответа - было ли завершение шага. Если ответ успел прийти, в SleepManager отправляется сообщение об удалении. Завершается шаг выполнения с места засыпания, очищаются данные о засыпании в памяти.
В узле
Узел получает сообщение от модуля процессов с типом SLEEP_MESSAGE = «Dt-Sleep».
Помещает их в очередь спящих процессов и в словарь отслеживания времени ожидания.
Отдельный поток раз в секунду проверяет спящие процессы на предмет устаревания или необходимости «разбудить» процесс. В зависимости от типа засыпания (ожидание ответа, события) процесс будет восстановлен или попадет в архив, если не был получен ответ.
Другой параллельный поток для обработки сообщений (TryHandleMessage) проверяет полученные сообщения, которые могут иметь в себе нужную информацию в PlatformCorrelationId, выполняет их дешифрацию.
Если расшифровано PlatformCorrelationId, и такая информация существует и найдена в очереди спящих, то сообщение из очереди спящих удаляется и помещается в очередь необработанных.
В ModuleMessagePusher такие сообщения забираются и отправляются как ответ на выполняющийся шаг.
Если спящий процесс был удален, а на него пришел ответ, то такое сообщение попадет в архив с ошибкой Превышено время выполнения запроса.
