Балансировка

Раздел описывает механизмы управления нагрузкой и очередями в кластере: как распределяются активные процессы между потоками и серверами, а также, как система работает со “спящими” процессами, временно приостанавливающими выполнение.

Балансировка призвана сглаживать нагрузки на конкретном узле путем изменения количества потоков и памяти, выделенных на выполнение процессов.

По умолчанию балансировка включена на уровне кластера. При необходимости ее можно отключить на кластере или на конкретном сервисе процессов, установив параметр useBalancing: false.

Если в сервисе процессов показатели балансировки и потребления памяти узлом заполнены, то эти значения находятся в приоритете. Значения из кластера используются, только если в настройках процессов параметры балансировщика не заполнены.

Балансировка активных процессов

Узел раз в минуту отслеживает использование ресурсов. При нагрузке на сервис:

  • Если сервис приблизился к порогу потребления ресурсов, балансировщик уменьшает все показатели до тех пор, пока порог потребления памяти не будет соблюдаться.

  • Если потребление ресурсов ниже чем 80% от максимально допустимого, происходит увеличение количества потоков до тех пор, пока потребление памяти не достигнет 90% от максимального.

При этом, если на сервисе процессов балансировка отключена, узел продолжает регулярно снимать показания и при необходимости высылать обновленные настройки балансировщика на сервис, но сервис их игнорирует с сообщением:Получены настройки балансировки в модуле с отключенным балансировщиком.

Внимание

Измененные параметры балансировщика отправляются узлом на сервис только в том случае, если на сервис идет нагрузка. В состоянии покоя балансировщик только снимает показатели.

../_images/image27.png

Спящие процессы

При помещении в спящие в модуле процессов сообщение отправляется в очередь спящих на узле.

Помещение процессов в спящие возможно в двух случаях:

  1. Шаг ожидания. Бизнес процесс сериализуется и отправляется на узел в менеджер спящих процессов SleepManager.

  2. Загрузка модуля процессов одновременно запущенными ожидающими ответов/событий завершения процессами. Т.е. процессов, в которых есть шаг, например, отправитель с ожиданием ответа.

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

Имя секции

Название параметра

Имя параметра

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 узла.

В диспетчере задач показатель фактически потребляемой памяти складывается из частного рабочего набора и общего рабочего набора с незначительной погрешностью:

../_images/image26.png

Засыпание процессов происходит следующим образом:

В модуле процессов

  1. Если шаг ожидает ответа/события (есть какой-то таймаут ожидания), то для сообщения формируется PlatformCorrelationId со специфичной закодированной информацией для засыпания. Затем этот процесс помещается в очередь (в памяти) запущенных ожидающих процессов.

  2. Проверка необходимости засыпания в SleepProcessExecutor: происходит сравнение параметра MaxRunnedRequests из ProcessParams по формулам:

100 * (количество запущенных ожидающих процессов / ProcessParams.MaxSleepingProcessCount) >= MaxRunnedRequests
100 * (объем запущенных ожидающих процессов / (ProcessParams.MaxSleepingProcessMB * 1024 * 1024)) >= MaxRunnedRequests

Если одно из событий верное, то текущие задачи могут быть помещены в сон.

  1. Запуск задачи выборки и отправки в сон. Выборка пачки запущенных ожидающих процессов, каждый проверяется на предмет получения ответа, если ответ не получен, процесс сериализуетсся и посылается в SleepManager. После этого дополнительно проверяется не было ли ответа - было ли завершение шага. Если ответ успел прийти, в SleepManager отправляется сообщение об удалении. Завершается шаг выполнения с места засыпания, очищаются данные о засыпании в памяти.

В узле

  1. Узел получает сообщение от модуля процессов с типом SLEEP_MESSAGE = «Dt-Sleep».

  2. Помещает их в очередь спящих процессов и в словарь отслеживания времени ожидания.

  3. Отдельный поток раз в секунду проверяет спящие процессы на предмет устаревания или необходимости «разбудить» процесс. В зависимости от типа засыпания (ожидание ответа, события) процесс будет восстановлен или попадет в архив, если не был получен ответ.

  4. Другой параллельный поток для обработки сообщений (TryHandleMessage) проверяет полученные сообщения, которые могут иметь в себе нужную информацию в PlatformCorrelationId, выполняет их дешифрацию.

  5. Если расшифровано PlatformCorrelationId, и такая информация существует и найдена в очереди спящих, то сообщение из очереди спящих удаляется и помещается в очередь необработанных.

  6. В ModuleMessagePusher такие сообщения забираются и отправляются как ответ на выполняющийся шаг.

  7. Если спящий процесс был удален, а на него пришел ответ, то такое сообщение попадет в архив с ошибкой Превышено время выполнения запроса.