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

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

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

Балансировка включена на уровне кластера.

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

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

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

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

Имя секции

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

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

Default

Min

processParams

Минимальное кол-во сообщений в одном потоке.

minMessageCountForThread

50

50

Примечание

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

Внимание

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

../_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. Если спящий процесс был удален, а на него пришел ответ, то такое сообщение попадет в архив с ошибкой Превышено время выполнения запроса.