Cómo afinar el Scheduler de Bizagi en entornos de clúster

<< Clic para mostrar Tabla de Contenidos >>

Navegación:  Automation Server > Automation Server - configuración y administración > Mantenimiento y monitoreo del sistema > Configuración y administración del ambiente > Managment Console > Administración de los trabajos programados >

Cómo afinar el Scheduler de Bizagi en entornos de clúster

Introducción

La configuración de Bizagi Scheduler para un mejor rendimiento depende de la configuración de cada entorno. Depende de tres factores: la infraestructura del cliente, el paralelismo y el modelado del cliente. La mejor práctica al ajustar su Bizagi Scheduler es incluir tareas de verificación de rendimiento que funcionen junto con las pruebas de carga. Esto permite que la configuración precisa del Scheduler obtenga la mejor combinación en la que el rendimiento es óptimo.

 

El siguiente documento presenta una breve explicación de las teclas utilizadas para hacer un ajuste fino del Programador. Además, le proporciona detalles sobre los Schedulers master y slave, y detalles sobre cómo puede ajustar el rendimiento para su entorno de producción.

 

Definiciones

Tenga en cuenta las siguientes definiciones:

Un Scheduler Master se encargar de coordinar las tareas ejecutadas por cada Scheduler Slave y ejecuta tareas adicionales como las tareas de mantenimiento. Es obligatorio tener uno y solo un Scheduler Master configurado.

Un Scheduler Slave se encarga de procesar una tarea asignada.

Un núcleo (core en inglés) es la unidad de procesador dentro de una CPU.

Los núcleos de procesador son los núcleos físicos en la CPU. Por ejemplo, si un servidor tiene un procesador QUAD-CORE tiene cuatro núcleos.

Los hilos (threads en inglés) son la versión virtual del núcleo de una CPU ejecutando una instrucción.

El procesador lógico, o núcleos lógicos, es el resultado del número de núcleos multiplicado por el número de hilos que se pueden ejecutar en cada núcleo. Esto se conoce como HyperThreading. Por ejemplo, si se tiene un procesador QUAD-CORE, con dos hilos por núcleo, se tendrían ocho procesadores lógicos o núcleos lógicos.

El multithreading es la capacidad de ejecutar varias instrucciones al tiempo. Esto se logra de las siguientes maneras: usando varios núcleos o con HyperThreading.

 

A continuación hay un ejemplo de las definiciones:

 

Scheduler_05

 

Medición de su infraestructura

El primer paso es medir las capacidades de procesamiento del Scheduler utilizando las siguientes métricas y medidas:

 

Consumo de CPU del servidor donde se ejecutan los Schedulers

Conteo de trabajos / tareas pendientes

 

note_pin

Aunque existen múltiples métricas y variables que puede considerar para medir el rendimiento de un servidor o sistema, esta sección se centra en el rendimiento del Scheduler de Bizagi.

 

Para contar el número de trabajos / tareas pendientes, ejecute las siguientes consultas en la base de datos del proyecto:

 

Tipo de tarea

Tabla

Consulta para recuperar tareas pendientes

Actividades asincrónicas

ASYNCHWORKITEM

select count(*) from ASYNCHWORKITEM where awState != 0 AND awProcessing != 1

Temporizadores y otros trabajos

JOB

select count(*) from job where jobEnabled = 1 and jobNextRunTime < GETDATE()

 

Con estas dos métricas, puede decidir si necesita ajustar el Scheduler existente o escalar la infraestructura. El siguiente algoritmo lo guía a través del patrón de escala:

 

SchedulerScalingPatternsESP

 

Si el uso de la CPU de su servidor es inferior al 60%, puede aumentar el número de subprocesos en el Scheduler de forma segura, siempre que tenga capacidades de subprocesamiento. Recuerde que debe tener en cuenta los siguientes parámetros: MaxThreadsForCustomJobs, MaxThreadsForJobs y MaxThreadsForAsynchWorkitems. Si el uso de su CPU está entre 60% y 75%, aún puede aumentar los parámetros de procesamiento (threading) del Scheduler, siempre que su servidor no se vea afectado por otras métricas como RAM o uso de disco. Esto depende completamente de la configuración de su servidor. Si su servidor excede el 75% del uso de la CPU, puede aumentar su hardware en el mismo servidor, agregando más procesadores físicos o agregando un nuevo servidor con un nuevo Scheduler. Si es posible, escale siempre los servidores, porque con un nuevo servidor también incluye capacidades de RAM y disco.

 

Se recomienda dejar un Scheduler por servidor y aumentar las capacidades de procesamiento (threading) por Scheduler.

 

Archivos de configuración

Para ajustar el Bizagi Scheduler, localice estos archivos:

 

Localice el archivo web.config ubicado en C:\Bizagi\Projects\[NombreProyecto]\WebApplication y ábralo usando el editor de texto de su elección.

 

FineTune_01

 

Localice los archivos BizAgi.Scheduler.Services.exe.config ubicados en la carpeta C:\Bizagi\Projects\[ProjectName]\Scheduler de cada scheduler.

 

FineTune_02

 

Agregue las llaves de configuración necesarias para afinar su Bizagi Scheduler in the <appsettings> key. Ejemplo:

<add key="AsyncTaskWorkingSetSize" value="10"/>

 

Llaves de configuración

De acuerdo con la infraestructura de su proyecto, tenga en cuenta la siguiente configuración mínima:

 

Llave de configuración

Descripción

Valores por defecto

Sugerencias

Configuración de Scheduler de hilos

ID_STACK_SIZE

Agregue está llave en los archivos web.config y BizAgi.Scheduler.Services.exe.config de cada scheduler. La llave reduce los bloqueos en la asignación de ID de negocio durante las altas tasas de creación de casos.

El valor por defecto es 50.

Este valor nuca debe ser disminuido y cada Scheduler debe tener el mismo valor.

AsynchTaskWorkingSetSize

Agregue está llave en el archivo BizAgi.Scheduler.Services.exe.config de cada scheduler. Esta llave define el número de tareas asíncronas a ser recuperada de la base de datos para ser procesado por hilo.

El valor por defecto es 10.

El Scheduler revisa dentro de cada intervalo si hay tareas adicionales para ejecutar.

 

Si este valor es muy bajo para la demanda de tareas esperada por el Scheduler, el Scheduler necesitará de más iteraciones para obtener todas las tareas pendientes.

SchedulerAsyncProcessorIntervalInMillis

Agregue está llave en el archivo BizAgi.Scheduler.Services.exe.configde cada scheduler. Esta llave establece el tiempo en milisegundos que definen los hilos en el procesador del scheduler interno para esperar la próxima ejecución de las tareas asíncronas cuando se ejecutó el BizagiSchedulerInterval.

El valor sugerido es 500.

Si el tamaño de la bolsa de tareas incrementa para las actividades asíncronas, el valor del intervalo debe aumentar. Esto permite procesar más tareas en un intervalo mayor por ciclo.

 

Si el intervalo es muy largo, se pierde tiempo de procesamiento y el número de tareas pendientes puede incrementar.

JobWorkingSetSize

Agregue está llave en el archivo BizAgi.Scheduler.Services.exe.configde cada scheduler. Esta llave define el número de tareas de la pila que se proporcionarán para ser ejecutadas.

El valor sugerido es 10.

El Scheduler revisa dentro de cada intervalo si hay tareas adicionales para ejecutar.

 

Si este valor es muy bajo para la demanda de tareas esperada por el Scheduler, el Scheduler necesitará de más iteraciones para obtener todas las tareas pendientes.

SchedulerMaxJobWaitInterval

Agregue está llave en el archivo BizAgi.Scheduler.Services.exe.configde cada scheduler. Esta llave define el número de tiempo de ejecución de espera cuando se alcanza el número máximo de trabajos.

El valor sugerido es 1.

Si el tamaño de la bolsa de tareas incrementa para las actividades asíncronas, el valor del intervalo debe aumentar. Esto permite procesar más tareas en un intervalo mayor por ciclo. También depende de la llave JobWorkingSize.

 

Si el intervalo es muy largo, se pierde tiempo de procesamiento y el número de tareas pendientes puede incrementar.

LaunchThreadForLog

Agregue está llave en el archivo BizAgi.Scheduler.Services.exe.config de cada scheduler. Esta llave defines you need an extra thread to improve the logging.

El valor sugerido es 1.

Cuando hay deadlocks en la escritura del log, el valor puede cambiar a 0.

Habilitar una opción para cada función

MaxThreadsForCustomJobs

Agregue está llave en el archivo BizAgi.Scheduler.Services.exe.config de cada scheduler. Esta llave define el número máximo de hilos para ejecutar los trabajos personalizados.

El valor por defecto es 2.

Tenga en cuenta que este número NO PUEDE exceder el número de hilos de procesador. Por ejemplo, si tiene dos procesadores de cuatro núcleos que pueden ejecutar dos hilos por núcleo, el número máximo debe ser 16.

 

Este valor debe tener el cuenta sus recursos de hardware y la frecuencia de ejecución de tareas del Scheduler.

MaxThreadsForJobs

Agregue está llave en el archivo BizAgi.Scheduler.Services.exe.config de cada scheduler. Esta llave define el número máximo de hilos para ejecutar los trabajos.

El valor por defecto es 2.

Tenga en cuenta que este número NO PUEDE exceder el número de hilos de procesador. Por ejemplo, si tiene dos procesadores de cuatro núcleos que pueden ejecutar dos hilos por núcleo, el número máximo debe ser 16.

 

Este valor debe tener el cuenta sus recursos de hardware y la frecuencia de ejecución de tareas del Scheduler.

MaxThreadsForAsyncEcm

Agregue está llave en el archivo BizAgi.Scheduler.Services.exe.config de cada scheduler. Esta llave define el número máximo de hilos para ejecutar el ECM cuando la función asíncrona está activa.

El valor por defecto es 2.

Tenga en cuenta que este número NO PUEDE exceder el número de hilos de procesador. Por ejemplo, si tiene dos procesadores de cuatro núcleos que pueden ejecutar dos hilos por núcleo, el número máximo debe ser 16.

 

Este valor debe tener el cuenta sus recursos de hardware y la frecuencia de ejecución de tareas del Scheduler.

MaxThreadsForAsynchWorkitems

Agregue está llave en el archivo BizAgi.Scheduler.Services.exe.config de cada scheduler. Esta llave define el número máximo de hilos para ejecutar las tareas asíncronas.

El valor por defecto es 10.

Tenga en cuenta que este número NO PUEDE exceder el número de hilos de procesador. Por ejemplo, si tiene dos procesadores de cuatro núcleos que pueden ejecutar dos hilos por núcleo, el número máximo debe ser 16.

 

Este valor debe tener el cuenta sus recursos de hardware y la frecuencia de ejecución de tareas del Scheduler.

Intervalo de ejecución del Scheduler

BizagiSchedulerInterval

Agregue está llave en el archivo BizAgi.Scheduler.Services.exe.config de cada scheduler. Esta llave define el tiempo (en segundos) utilizado por Bizagi para procesar las tareas que vienen de la base de datos.

El valor por defecto es 30.

 

Si el tamaño de la bolsa de tareas incrementa para las actividades asíncronas, el valor del intervalo debe aumentar. Esto permite procesar más tareas en un intervalo mayor por ciclo.

 

Si el intervalo es muy largo, se pierde tiempo de procesamiento y el número de tareas pendientes puede incrementar.

MASTER / SLAVE

DisableAsynchCaseClosing

Agregue está llave en el archivo BizAgi.Scheduler.Services.exe.config de cada scheduler. Esta llave se usa para nombrar al scheduler principal y garantizar que este sea el único que ejecuta las tareas de mantenimiento.

El valor por defecto es 0.

Configure 0 para el Master scheduler y 1 para el Slave scheduler. Es obligatorio tener uno y solo un programador maestro configurado.

DisableInterfaceErrorLogger

Agregue está llave en el archivo BizAgi.Scheduler.Services.exe.config de cada scheduler. Esta llave se usa para habilitar el registrador de errores de interfaz solo en el scheduler principal y garantizar que este sea el único que registre todos los errores de interfaz.

El valor por defecto es 0.

Configure 0 para el Master scheduler y 1 para el Slave scheduler. Es obligatorio tener uno y solo un programador maestro configurado.

 

note_pin

Consideraciones:

Los parámetros MaxThreadsForCustomJobs, MaxThreadsForJobs y MaxThreadsForAsynchWorkitems indican el número máximo de hilos generados por el Scheduler para ser ejecutados por cualquiera de los procesadores lógicos. Sin embargo, el software puede generar más hilos, dependiendo de qué tan rápido los procesen los procesadores lógicos y dejen espacio para ejecutar más. Por lo tanto, existe una diferencia entre los hilos generados y los procesadores lógicos (hilos vistos por el procesador).
Por lo tanto, puede aumentar el número de hilos generados por el Scheduler para que sea mayor que el número de procesadores lógicos multiplicando el número de subprocesos generados por el número total de procesadores lógicos por 5. No aumente el valor mayor que este cálculo.

Cuando se utilizan máquinas virtuales, la suma de los parámetros MaxThreadsForCustomJobs, MaxThreadsForJobs y MaxThreadsForAsynchWorkitems debe ser menor o igual que el número de vCPU multiplicado por el número de procesadores lógicos multiplicado por el número de hilos generados.

 

Afinando el Scheduler

El ajuste de los valores para las llaves mostradas debe realizarse de acuerdo con los resultados de la fase de prueba de rendimiento de su proyecto. Siga estas recomendaciones para ajustar el rendimiento:

 

Se recomienda tener una máquina independiente para los Schedulers.

El rendimiento ideal ocurre cuando el número de workitems asíncronos (llave MaxThreadsForAsynchWorkitems) se procesa en la franja definida por el intervalo de Bizagi Scheduler (llave BizagiSchedulerInterval). Aumente los valores de las llaves AsynchTaskWorkingSetSize y BizagiSchedulerInterval hasta que sus tareas asíncronas se procesen en un tiempo óptimo.

Si alcanza el valor máximo para la llave MaxThreadsForAsynchWorkitems, se recomienda agregar otro Scheduler usando los valores predeterminados y luego, aumentar los valores hasta que tenga el rendimiento ideal.

 

note_pin

Se recomienda realizar un monitoreo continuo de su infraestructura. Si encuentra algún aumento en términos de uso de la memoria o la CPU, debe tomar la decisión si desea ajustar los programadores o realizar cambios en la infraestructura para poder soportar la mayor demanda de recursos.

 

Ejemplo de escalamiento del Scheduler

A modo de ejemplo, hemos definido un escenario con las siguientes características:

 

El 75% de las tareas son tareas de servicio configuradas como actividades asincrónicas.

La tasa de creación de casos es un caso por hora.

Cada caso tiene en promedio 25 actividades asincrónicas ejecutadas en paralelo.

 

Primer escenario: rendimiento óptimo

Debido a la gran demanda de actividades asincrónicas, la tabla ASYNCWORKITEM se consulta constantemente para revisar las tareas pendientes del Scheduler. Con los siguientes resultados:

 

Scheduler_01

 

Este escenario muestra que no hay un incremento en las tareas pendientes, ni un uso de CPU superior al 60%, por lo tanto, no es necesario ajustar o escalar.

 

Segundo escenario: afinar el Scheduler

En un segundo escenario, el sistema se monitorea con los siguientes resultados:

 

Scheduler_02

 

Existe evidencia de que el número de tareas pendientes que debe ejecutar el Scheduler es cada vez mayor y aumenta con el tiempo, lo que significa que el Scheduler está encolando tareas. Sin embargo, el uso de la CPU permanece en promedio por debajo del 60%, por lo tanto, puede ajustar el Scheduler para evitar tener una cola acumulativa de tareas pendientes.

 

Para ajustar esto, puede aumentar el número de hilos para actividades asincrónicas. Puede ajustar MaxThreadsForAsynchWorkItems.

 

Después de ajustar el parámetro, el número de tareas pendientes comienza a disminuir para llegar a cero tareas pendientes.

 

note_pin

Debe evaluar si la carga del Scheduler se debe a tareas asincrónicas, trabajos personalizados u otro tipo de trabajo. Debe comparar el número de tareas pendientes de la tabla ASYNCHWORKITEM y la tabla JOB. Dependiendo de esto, puede aumentar los hilos para elementos asincrónicos (MaxThreadsForAsynchWorkItems) o para otro tipo de trabajos (MaxThreadsForJobs o MaxThreadsForCustomJobs).

 

Tercer escenario: escalar horizontalmente el servidor

En el tercer escenario, el sistema se monitorea durante los mismos tiempos con los siguientes resultados:

 

Scheduler_03

 

Las tareas pendientes todavía se están encolando debido a que hay una tendencia creciente en las tareas pendientes (barras azules). Pero, en este escenario, el promedio de uso de la CPU es de alrededor del 80%, por encima del límite sugerido del 60%. Estas métricas muestran que el sistema está sobrecargado y que los recursos de la CPU no son suficientes para manejar todas las solicitudes del Scheduler.

 

En este escenario, primero debe evaluar si es posible escalar el número de procesadores lógicos de su CPU. En caso afirmativo, puede aumentar el número de núcleos o procesadores lógicos, y luego buscar ajustar el Scheduler aumentando los hilos para tareas asincrónicas, como en el segundo escenario.

 

Si no es posible escalar horizontalmente los procesadores lógicos en el mismo servidor, puede buscar escalar su infraestructura con una instancia adicional del Scheduler. Nuestra recomendación es mantener un máximo de dos Schedulers por servidor. Sin embargo, esto depende del rendimiento de su hardware y si tiene más software en el mismo servidor.

 

Scheduler_04