domingo, 2 de noviembre de 2008

Asignar prioridad automáticamente

Como asignar una prioridad automáticamente para ciertos trabajos, o aplicaciones.

Supongamos que tenemos unos trabajos que queremos que tengan cierto tipo de prioridad (alta o baja) en la ejecución, habitualmente se utilizan los parámetros RUNPTY y TIMESLICE, para ello habremos de crear una clase especial para nuestros trabajos y es recomendable también crear un subsistema especial para dichos trabajos.

El procedimiento a seguir para crear este entorno especial:
  1. Crear la cola de trabajos asociada al subsistema:
  2. CRTJOBQ JOBQ(QGPL/SPECIAL) TEXT('Job queue for specials jobs Subsystem')
  3. Crear el subsistema:
  4. CRTSBSD SBSD(QGPL/SPECIAL) POOLS((1 *BASE) (2 *SHRPOOL1)) MAXJOBS(*NOMAX) TEXT('Subsystem for specials jobs')
  5. Con esto conseguimos que el trabajo, de tipo subsistema, se ejecute en el pool de memoria base y el resto de trabajos del subsistema se ejecutaran en el pool de memoria *SHRPOOL1.
  6. Añadir la cola de trabajos al subsistema:
  7. ADDJOBQE SBSD(QGPL/SPECIAL) JOBQ(QGPL/SPECIAL) MAXACT(*NOMAX) SEQNBR(10)
  8. Poner *NOMAX, o el numero máximo de trabajos, que queremos que se ejecuten por esa cola, el numero de secuencia es importante por si tenemos más de una cola de trabajos.
  9. Crear la nueva clase:
  10. CRTCLS CLS(QGPL/SPECIAL) RUNPTY(25) TIMESLICE(10000) PURGE(*NO) TEXT('Class for subsystem of special jobs')
  11. Asignar las entradas de direccionamiento para solo los trabajos batch que queramos usen la nueva clase:
  12. ADDRTGE SBSD(QGPL/SPECIAL) SEQNBR(10) CMPVAL('SPECIAL') PGM(QCMD) CLS(QGPL/SPECIAL) POOLID(2)
  13. Añadir entradas de direccionamiento para el resto de trabajos:
  14. ADDRTGE SBSD(QGPL/SPECIAL) SEQNBR(9999) CMPVAL(*ANY) PGM(QCMD) CLS(*LIBL/QBATCH) POOLID(2)
  15. Con estas dos entradas de direccionamiento conseguimos que:
  16. Los trabajos que, en la descripción de trabajo, envían como direccionamiento el valor RTGDTA('SPECIAL') usaran la clase QGPL/SPECIAL que les asignará un RUNPTY de 25 y un TIMESLICE de 10.000.
  17. El resto de trabajos usará la clase QGPL/QBATCH, que les asigna un RUNPTY de 50 y un TIMESLICE de 5.000.
  18. En ambos casos los trabajos se ejecutaran por el POOLID 2, o sea en este caso en el *SHRPOOL1 (ver paso 5).
  19. A continuación creamos una nueva descripción de trabajo, o modificar la que queramos usar, para que los trabajos se sometan por el nuevo subsistema:
  20. CRTJOBD JOBD(QGPL/SPECIAL) JOBQ(QGPL/SPECIAL) TEXT('Job description for special jobs') RTGDTA('SPECIAL')
  21. También podemos someterlos con SBMJOB, pero entonces habrá que acordarse de comprobar y modificar manualmente el parámetro RTGDTA en el mandato SBMJOB, en caso contrario usaran la clase por omisión asignada a *ANY.
  22. Si además queremos usar el mismo subsistema para que se conecte alguna pantalla tendremos de:
  23. Añadir el pool de memoria interactivo al subsistema:
  24. CHGSBSD SBSD(QGPL/SPECIAL) POOLS((1 *BASE) (2 *SHRPOOL1) (3 *INTERACT))
  25. Añadir una entrada de direccionamiento para los trabajos interactivos:
  26. ADDRTGE SBSD(QGPL/SPECIAL) SEQNBR(20) CMPVAL('QCMDI') PGM(QCMD) CLS(*LIBL/QINTER) POOLID(3)
  27. Añadir el nombre de dispositivo de pantalla que tendrá acceso al subsistema:
  28. ADDWSE SBSD(QGPL/SPECIAL) WRKSTN(Device_name)
  29. Con esto conseguimos que los trabajos interactivos se les asigne los valores de la clase QINTER y que son de RUNPTY 20 y un TIMESLICE de 2.000.
  30. Además se ejecutaran en el pool de memoria para trabajos interactivos (*INTERACT), optimizando de esta forma el funcionamiento del ajuste automático de rendimiento del sistema:
  31. Ahora solo nos queda:
  32. Asignar memoria al pool compartido *SHRPOOL1, si no lo estamos usando (podemos comprobarlo con WRKSHRPOOL):
  33. CHGSHRPOOL POOL(*SHRPOOL1) SIZE(256) ACTLVL(1)
  34. Finalmente arrancar el nuevo subsistema:
  35. STRSBS SBSD(QGPL/SPECIAL)
  36. El tamaño del pool y el nivel de actividad se irán ajustando automáticamente si tenemos el ajuste de rendimiento del sistema activado:
  37. DSPSYSVAL SYSVAL(QPFRADJ)


Nota:
Si queremos deshacer la asignación de memoria en *SHRPOOL1 ejecutar el mandato CHGSHRPOOL POOL(*SHRPOOL1) SIZE(*NOSTG)


¿Como podemos controlar la memoria asignada a estos trabajos y de esta forma controlar el ajuste automático del sistema?, entonces habéis de leer la entrada Memoria para subsistema publicada anteriormente.

4 comentarios:

Nelsin dijo...

Hola Martí;

Esta muy interesante el howto.

Una consulta al respecto, este subsistema creado, si quiero asignarle a una conexión externa, es decir, tengo unas conexiones al AS400(db2) desde un PostgreSQL y éste trabajo externo quiero asignarle este nuevo subsistema, como hago para conseguir esto?

Nelson.

mrierab dijo...

Las conexiones a la base de datos, normalmente utilizan ODBC (o JDBC), estas se asignan automáticamente a los trabajos de prearranque QZDASOINIT.
Teóricamente podrías cambiar la clase del trabajo de prearranque, que están en el subsistema QUSRWRK, para asignarles una clase especial.
El problema es que lo harías para TODAS las conexiones que usen ese servidor.

Jorge Cotrina dijo...

Hola Marti unapregunta:
Como hago para que un USRPRF tipo *use o *pgm no pueda cambiar el parametro runprty y timeslice ?
Gracias
Jorge Lima Peru

mrierab dijo...

Jorge,

Un usuario siempre puede cambiar sus trabajos, u otro usuario con permisos especiales *JOBCTL. Eso creo que sera difícil de controlar.
La solución podría estar en el perfil de usuario; fíjate en el parámetro PTYLMT, ahí puedes limitar el valor de la prioridad que el usuario puede asignar a los trabajos, o sea si tiene un 5 nunca podrá cambiar un trabajo a una prioridad mas baja de 5, a no ser que posea *JOBCTL.
Mas información:
http://publib.boulder.ibm.com/iseries/v5r1/ic2924/index.htm?info/rbam6/rbam6scheduleexpand.htm