viernes, 10 de octubre de 2008

Sincronizar la hora del AS400

Para ello utilizaremos el servicio SNTP (Simple Network Time Protocol), este servicio nos sincroniza la hora del equipo con la de un servidor de hora, que puede estar en nuestra red o en Internet.

En nuestro AS400 tenemos disponible este servicio desde la V5R2, y es funcional (o sea que cambia la hora del reloj automáticamente) a partir de la V5R4. Para configurar el servicio SNTP en el AS400 ejecutar el mandato CHGNTPA con los parámetros:
CHGNTPA RMTSYS('direccion_servidor_hora') AUTOSTART(*YES) POLLITV(60) MINADJ(100) MAXADJ(20) ACTLOG(*CHANGE)

Además debemos activar la opción de ajuste automático de la hora:
CHGSYSVAL SYSVAL(QTIMADJ) VALUE(QIBM_OS400_SNTP)

También debemos configurar nuestra zona horaria para ello ejecutar:
WRKSYSVAL SYSVAL(QTIMZON), el valor para Europa es QP0100CET4
Offset . . . . . : +02:00
Full name . . . : Central European Daylight Saving Time
Abbreviated name : CEST

Podemos pulsar F4 para vez las zonas disponibles.

Atención: Cuando realicemos este cambio, inmediatamente después comprobar la hora del sistema, no sea que se le ocurra ajustarse en ese momento al horario de verano/invierno.

Para arrancar el servicio de sincronización de hora la primera vez, después debería ser automático ya que en la configuración del servicio hemos indicado AUTOSTART(*YES) o sea que se arrancara con el sistema :
STRTCPSVR SERVER(*NTP)

Para detener el servicio ejecutar: ENDTCPSVR SERVER(*NTP)

Podemos consultar la actividad de este servicio buscando el mensaje TCP9105 en el log del sistema (DSPLOG MSGID(TCP9105)), el mensaje nos indica donde esta el log del servicio (uno por día), normalmente ubicado en el directorio /QIBM/USERDATA/OS400/TCPIP/NTP/

Nota: Revisar esta carpeta periódicamente, ya que se van acumulando los logs y no se vacían automáticamente.

martes, 7 de octubre de 2008

Modificar menu PetSis

Para modificar el menú de Petición de Sistema (tecla PetSis) hemos de cambiar el mensaje CPX2313 para modificar los mandatos que llama el sistema cuando se pulsa esta tecla.
La opción "1. Visualizar inicio de sesión para trabajo alternativo" no se puede modificar, o sea que la primera opción que se puede modificar es "2. Finalizar petición anterior " que corresponde al mandato ENDQRS del texto del mensaje.
El valor por omisión del mensaje se puede ver con el mandato:
DSPMSGD RANGE(CPX2313) MSGF(QSYS/QCPFMSG)




Por ejemplo, Como modificar la opción "3.Visualizar trabajo actual" para utilizar el comando WRKJOB, en lugar del DSPJOB, y de paso disponer de una línea de mandatos, pero solo según el tipo de usuario, ya que no queremos que ningún usuario normal tenga acceso a la línea de mandatos en mitad de una aplicación.

Para ello seguiremos el siguiente procedimiento:
  1. Crearemos el programa CL DSPJOB2CL
  2. Crearemos el mandato DSPJOB2 que llama al programa DSPJOB2CL
  3. Este programa comprueba el tipo de usuario, si es *SECOFR o *PGMR o *SYSOPR ejecuta el mandato WRKJOB, en caso contrario ejecuta el mandato DSPJOB (como hasta ahora).
  4. Finalmente cambiamos el texto de mensaje CPX2313 para que ejecute DSPJOB2 en lugar de DSPJOB: CHGMSGD MSGID(CPX2313) MSGF(QSYS/QCPFMSG) MSG('ENDRQS DSPJOB2 DSPMSG SNDMSG SIGNOFF DSPMSG DSCJOB DSPWSUSR ENDRDBRQS ')
  5. ¡¡ Respetar espacios en blanco en el cuerpo del mensaje!!

Notas:
  • El código de DSPJOB2 lo podemos bajar de aquí.
  • Si tenemos lenguajes secundarios instalados, deberemos realizar el mismo cambio para todas las bibliotecas QSYSnnnn.
  • Deberemos revisar este mensaje cada vez que actualicemos el sistema operativo, o que alguna ptf modifique el archivo de mensajes QCPFMSG.

Calculadora en ventana

Puesta al día de la utilidad CALCUL que nos muestra, en una ventana en modo texto, una calculadora. La podemos incluir en nuestras aplicaciones de pantalla verde, cuando tenga sentido que la puedan utilizar, o desde la línea de mandatos.





La ayuda la tenemos pulsando la tecla F1.


El código de esta utilidad lo podemos bajar de aquí.

jueves, 2 de octubre de 2008

Memoria para subsistema

Como reservar memoria y asignar una prioridad automáticamente para ciertos trabajos o aplicaciones en uno o más subsistemas utilizando la memoria compartida.

Supongamos que tenemos unos trabajos que queremos que tengan reservada cierta cantidad de memoria solo para ellos y cierto tipo de prioridad (alta o baja) en la ejecución (habitualmente los parámetros RUNPTY y TIMESLICE).

En esta entrada explicare como reservar cierta cantidad de memoria para un subsistema.

  1. Crear un subsistema para ese tipo de trabajo es buena idea, así separamos el consumo de memoria y el ajuste automático del sistema trabaja mejor (QPFRADJ).
  2. Doy por supuesto que tienes el ajuste automático del sistema activado (QPFRADJ 2 o 3)
  3. Puedes asignarle a ese pool una cantidad de memoria, que puede ser variable o fija. Si la quieres siempre fija lo indicaras cuando creas el subsistema (CRTSBSD)
  4. Para crear un pool de memoria haz WRKSHRPOOL y asigna memoria, por ejemplo, al *SHRPOOL2, habitualmente el *SHRPOOL1 se utiliza para trabajos en el subsistema QBATCH, aunque no viene definido por omisión en el sistema.
  5. Después debes cambiar la descripción del nuevo subsistema para que utilice ese nuevo pool de memoria, normalmente yo recomiendo poner 2 pools el *BASE en primer lugar y *SHRPOOL2 en segundo lugar.
  6. Después deberás crear nuevas clases (CRTCLS) para el nuevo subsistema, que utilicen el segundo pool de memoria del subsistema y asignarlas a las entradas de direccionamiento del mismo (CHGRGTE), esto lo explicare en otro howto.
  7. Con esto conseguimos que el trabajo subsistema, corra en el pool *BASE y el resto de trabajos, dentro del subsistema, en el *SHRPOOL2.
  8. Para el ajuste de memoria del *SHRPOOL2, haz WRKSHRPOOL y pulsa F11 (otra vista), en las columnas que ves, puedes definir que porcentaje de memoria mínimo y máximo quieres que se lleven los trabajos de ese pool, si ponemos el mismo porcentaje en min y max lo que conseguimos es dejar fijo el tamaño de la memoria utilizada por ese pool.
  9. Esto creo que es mejor que asignar memoria fija al subsistema (paso 3) ya que en caso de equivocarnos solo hemos de cambiar el porcentaje y el ajuste auto del sistema hará el resto. De la otra forma hay que parar el subsistema.
  10. ¿Como calcular el tamaño de memoria que vas a necesitar?, pues es difícil, seguramente los trabajos están más tiempo esperando o leyendo disco, que utilizando memoria y CPU, pero si tiene que ver con la cantidad de trabajos que tenemos activos y en RUN en el subsistema. Mi recomendación es partir de un valor de tamaño de pool conocido, tirando a alto, y observar la paginación de ese pool de memoria (DSPSYSSTS) , si aparecen trabajos en estado INEL, indica que falta memoria en ese pool, ir añadiendo memoria al pool hasta que veamos que ya no aparecen trabajos en INEL u estado intermedios.
  11. Una recomendacion, para hacer estos ajustes, es mejor que no lo hagas en tu hora punta (mas que nada para que no te lleguen llamadas de usuarios) y tambien es mejor desactivar, mientras haces la prueba, el ajuste automático del sistema (QPFRADJ = 0) ya que en caso contrario te puede distorsionar el resultado.
  12. También debes saber que si tu proceso utiliza SQL el optimizador de SQL puede que decida crear un nuevo plan de acceso si ve que ha cambiado el tamaño del pool, eso no debería suponer un problema, pero en algunas instalaciones se traduce en un peor tiempo de respuesta de la aplicación, ya que reconstruye el plan de acceso demasiado a menudo.