viernes, 5 de junio de 2009

Colas de trabajos

Cuando hemos de controlar la ejecución de los trabajos batch en el sistema, normalmente usamos los subsistemas, las colas de trabajo y las prioridades en la cola de trabajo (parámetro JOBPTY del CHGJOB).
Este articulo es para entender mejor como un subsistema trabaja con las colas de trabajo que tiene asignadas y como podemos crear colas de trabajo especificas para ciertas tareas. Para ello explicare algunos conceptos relacionados con las colas de trabajo, en los ejemplos nos basaremos en el sistema QBATCH (DSPSBSD SBSD(QBATCH) y opción 6).
  • El subsistema tiene un numero de trabajos máximo que puede ejecutar, se cambia con el mandato CHGSBSD SBSD(QBATCH) MAXJOBS(*NOMAX), en este ejemplo estamos diciendo al sistema, que puede ejecutar un numero ilimitado de trabajos en el subsistema, bueno el limite es el rendimiento del sistema, ya podríamos llegar a colapsarlo.
  • El subsistema tiene colas de trabajo asignadas y estas tienen un numero de secuencia, o sea el sistema primero mira si hay trabajos en la cola de trabajos de la secuencia 10, después de la 20, ..., hasta la 9999.
  • Cada cola de trabajos, asignada a un subsistema, tiene también un numero máximo de trabajos que puede ejecutar. El numero máximo de trabajos de una cola de trabajos se puede cambiar con el mandato CHGJOBQE.
  • Para complicarlo un poco más, también pueden definirse en cada cola de trabajo el numero de trabajos máximo por prioridad del trabajo, aunque por lo que he podido ver se usa poco.
  • Si el sistema encuentra un trabajo en la cola de trabajos, y no hay ejecutándose el numero máximo de trabajos activos de esa cola y el subsistema tiene menos trabajos que el máximo que tiene definido para el subsistema, entonces entraran tantos trabajos de esa cola hasta que no queden trabajos en la cola o hasta que el subsistema tenga el numero máximo de trabajos.
  • Una cola de trabajos puede estar definida en dos subsistemas diferentes, pero solo se asigna al primer subsistema que arranca.
  • Una cola puede no estar asignada a algún subsistema (o el subsistema no esta activo), en ese caso nunca entran trabajos de esa cola.
Ejemplo1:
Ejemplo1
  • En este ejemplo supongamos que el subsistema QBATCH puede ejecutar un numero ilimitado de trabajos (*NOMAX).
  • En este caso podríamos tener el numero máximo de trabajos ejecutándose de todas las colas porque 10+1+4 = 15.
  • Si en la cola QBATCH hay 17 trabajos solo se ejecutaran como máximo 10, aunque el subsistema no este ejecutando ningún trabajo del resto de colas.
Ejemplo2:
Ejemplo2Igual que en el Ejemplo1 pero con dos colas más (con *NOMAX) y el subsistema QBATCH puede ejecutar 50 trabajos al mismo tiempo como máximo:
  • Supongamos que se están ejecutando 3 trabajos de la cola QBATCH y llegan de golpe 160 trabajos a la cola QSRCTXT, de estos entraran 47 trabajos, ya que 3+47=50 es el numero máximo de trabajos activos en el subsistema, quedando el resto en cola.
  • Si en ese momento llega un trabajo por la cola QBATCH1X1, esté no podrá entrar hasta que finalice algún trabajo.
  • Si finaliza un trabajo que ha entrado por la cola QSRCTXT, entonces entraría el trabajo de la QBATCH1X1, porque tiene una secuencia mas baja que la cola QSRCTXT, cuando termine otro, si no hay ninguno en las colas de las secuencias inferiores a la QSRCTXT, irán entrando más trabajos a medida que finalicen.
  • Si mientras llega algún trabajo a la cola QBATCH pasaría antes que los de la QBATCH1X1, ya que su numero de secuencia es menor.
Recomendaciones:
  • Si queremos asignar a una cola un numero de trabajos *NOMAX, mi recomendación es ponerla al final, y deberíamos solo enviar a esa cola trabajos de ejecución muy rápida, para no colapsar la cola ni el sistema.
  • Prefiero asignar al subsistema un numero máximo de trabajos ilimitado (*NOMAX), pero debemos vigilar que las colas *NOMAX no nos puedan colapsar el sistema, en ese caso no nos quedara más remedio que asignar un numero máximo de trabajos al subsistema que nos pueda soportar el sistema (CHGSBSD), habitualmente empezaríamos por asignar la suma del numero máximo de trabajos de cada cola más un numero n de trabajos, si vemos que es demasiado para el sistema, ir reduciendo el numero máximo de trabajos activos.

4 comentarios:

Señorita Decente dijo...

Hola, me encanta tu blog y también gracias tu link encontré esa pagina donde me daban una cuenta para poder practicar cosillas desde casa, ya no son suficiente, 8 horas en el trabajo jajajaja. Soy operadora desde hace muy poco tiempo, asi que tengo mucho que aprender, pero sé un poco de programación en RPG y sql, y bueno, basicamente me interesaría aprender a hacer algunos programillas sencillos en CL y sql, monitores de trabajos, de colas, de mensajes, etc... También me gustaría leer en tu blog algún día acerca de resolución de problemas...

Gracías por el blog, y sigue posteando por favor, que todavia quedamos algunos seres humanos condenados a las pantallitas verdes

Marti Riera dijo...

Hola, Si quieres hacer practicas de CL busca el link en mi blog de la web Code400 ahi en el apartado CLLE tienes unos cuantos ejemplos.
Salut

Pablo Luciano Sastre dijo...

Hola, como hago para asignar una cola de trabajo especifica para un usuario? para que todos sus trabajos salgan por ahí. Muchas gracias

Marti Riera dijo...

Los perfiles de usuario tienen asignada una descripción de trabajo (JOBD) y esta JOBD a su vez tiene el parámetro Cola de trabajos (JOBQ) por donde por omisión se someterán los trabajos que usen esta Descripción de Trabajo. Con esta información deberias crear una JOBD para cola cola de Ttrabajos que te interese y asignarla al usuario. Esto no evitara que el usuario someta trabajos, desde SBMJOB, usando otras JOBD o JOBQ, si tiene acceso a línea de mandatos.
Por otro lado te recomiendo te des de alta en Recursos/400 en IBM dW for developers (http://bit.ly/db68dd) y apuntarse al Foro en español Help/400 (http://www.help400.es/forum.htm) donde podras obtener mucha información de toda la comunidad AS400.