Mostrando entradas con la etiqueta howto. Mostrar todas las entradas
Mostrando entradas con la etiqueta howto. Mostrar todas las entradas

martes, 24 de marzo de 2020

Como funcionan los subsistemas


MCPress publicó, hace unos años (1994), un artículo explicando cómo se definen y funcionan los subsistemas en los AS400. No ha perdido nada de actualidad y puede servir de guía para entenderlos y aprovechar lo aprendido para nuestro sistema.





Solving the Mystery of Subsystems





En mi blog podéis encontrar más entradas y utilidades relacionadas con la configuración de los subsistemas:



miércoles, 31 de julio de 2013

PowerCL: CL for Files (CLF)

Si tenéis la necesidad, o ganas, de poder insertar, actualizar o borrar registros de una tabla desde programas CL, existe una tool (shareware con periodo de prueba de 30 días) para hacerlo posible:
www.powercl.com de Bruce Vining.

viernes, 24 de mayo de 2013

Utilidad estadisticas espacio en disco (DSKINF)

En un articulo anterior se explicaba como activar las estadísticas de espacio en disco incluidas con el sistema operativo de nuestro AS400.

Analizando el funcionamiento de dicha función del AS400 desarrolle, hace años, la utilidad CPYDSKINF, para consolidar, periódicamente, esta información en otro archivo y así poder realizar análisis de la evolución del crecimiento de la ocupación en disco, de las bibliotecas y/o de los objetos.

La periodicidad podría ser semanal, o como mínimo mensual, aunque deberemos analizar cual es la mejor periodicidad para nuestro sistema y nuestras necesidades. Deberemos tener en cuenta que este proceso genera, acumula mucha información, y necesita mucho tiempo de ejecución,  aunque, evidentemente, dependerá del rendimiento de nuestro sistema.
Si usamos esta utilidad es recomendable no utilizar la opción de planificación de recogida de estadísticas de espacio en disco del sistema (GO DISKTASKS), ya que estaremos duplicando el proceso y podemos tener problemas si los lanzamos al mismo tiempo.

Para planificar la ejecución semanal, de esta utilidad, utilizar el siguiente mandato:
ADDJOBSCDE JOB(CPYDSKINF) CMD(CALL PGM(DSKINF/CPYDSKINF)) FRQ(*WEEKLY) SCDDATE(*NONE) SCDDAY(*SUN) SCDTIME('23:59:59') RCYACN(*SBMRLS) JOBQ(QSYS/QUSRNOMAX) 
TEXT('Statistical disk space usage')

A partir de los datos recogidos, semana a semana, podemos utilizar Query's, Consultas QM o SQL, para extraer información sobre la evolución de la ocupación del disco, bibliotecas y de los objetos  en el sistema. También nos puede servir para averiguar en que periodo se elimino un objeto, que objetos se han creado entre periodos, etc...

El programa actualiza los tres archivos DSKINF, EVODSK y EVOLIB:
  • DSKINF: Contiene la misma información que QAEZDISK, pero con 2 campos más que contienen el nombre del sistema, donde se ha recogido la información, y la fecha de recogida (en formato saammdd).
  • EVODSK: Se genera en cada ejecución y contiene un registro por cada fecha de recogida con la ocupación en disco y el total de disco cuando se recogió la información.
  • EVOLIB: Se genera en cada ejecución y contiene un registro por cada fecha de recogida y biblioteca, con el tamaño de la misma cuando se recogió la información.
En el código del programa CPYDSKINF, la variable &DLTDAT nos indica cuanto tiempo debe conservar los datos de información de espacio en disco en el sistema, de esta forma el tamaño de la biblioteca DSKINF sera, más o menos, constante. Por omisión se conservan 365 días.

Seguid las instrucciones de instalación de la utilidad en el fuente README_DSK.TXT incluido. Se recomienda instalarla en la biblioteca DSKINF, de esta forma tendremos más controlado el espacio que ocupa esta información. Podéis bajaros el código desde este enlace.

Esta utilidad consta de varios fuentes y objetos:
ADDDSKINF   RPG   Añade registros informe espacio disco
CPYDSKINF   CLP   Genera, consolida e imprime informes disco
DSKINF      PF    Informe espacio en disco
EVODSK      SQL   Evolución espacio en disco

EVODSK_CRT  SQL   Creación archivo evolución espacio en disco 
EVOLIB      SQL   Evolución ocupación bibliotecas

EVOLIB_CRT  SQL   Creación archivo evolución ocupación bibliotecas 
RMVDSKINF   RPG   Elimina registros informe espacio disco

README_DSK  TXT   Instrucciones de instalación de DSKINF 

Notas:

viernes, 22 de marzo de 2013

Entradas de diario para tablas (y 4)

En la entrada anterior "Entradas de diario para tablas (3)" explicaba como analizar las cabeceras de las entradas de diario. Pero otra forma en que nos ayudan las entradas de diario es la de analizar las entradas de un trabajo en su conjunto, esto fácil de entender, pero más difícil de explicar por lo que intentare hacerlo con un ejemplo.

Podemos hacer una primer análisis usando DSPJRN por pantalla, pero puede ser complicado si hay muchas entradas, lo más recomendable seria someter el volcado de las entradas de diario generadas por el trabajo a fichero, esto se explicaba en la entrada "Entradas de diario para tablas (2)", y a continuación podemos bajar el fichero a una hoja de calculo; esto es relativamente sencillo usando el complemento de "Transfer Data from System i" incluido en el "IBM System i Access for Windows", acordaros de marcar la casilla "Convert CCSID 65535" de las "Properties" de la definición, aunque siempre suele dar un error en la columna 21 (JOJID), al contener caracteres no visualizables y que podemos ignorar. Adjunto una imagen de un archivo con entradas de diario bajadas a hoja de calculo:

viernes, 15 de marzo de 2013

Entradas de diario para tablas (3)

En la entrada anterior "Entradas de diario para tablas (2)" se explicaba como podemos obtener la información del journal, ahora me centrare en analizar la información de las entradas de diario.

Como he dicho las entradas de diario nos dan información de los cambios en las tablas registradas por el diario, DSPJRN nos muestra la lista de entrada por numero de secuencia y reflejan el orden estricto en que se han ejecutado las acciones en la base de datos.
Con la opción 5 "Display entire entry" visualizaremos el contenido de la entrada. La primera vez que entramos nos muestra los datos específicos para esa entrada "Entry specific data". Si el tipo de entrada fuera, por ejemplo, R-PT (Record added) nos mostrará el buffer del registro con los datos que ha insertado en la tabla, que se muestra en la cabecera de la pantalla:
Los campos numéricos se muestran como caracteres ilegibles, podemos pulsar "F11=Display hexadecimal format" para mostrar su valor en hexadecimal.

viernes, 8 de marzo de 2013

Entradas de diario para tablas (2)

En la entrada anterior "Entradas de diario para tablas (1)" explique como tener nuestros archivos registrados por diario, para poder analizar los cambios en los datos de los archivos.

Con nuestros archivos ya registrados por diario, podemos investigar en sus entradas usando el mandato DSPJRN.

Con DSPJRN podemos visualizar las entradas que se van grabando en los receptores de diario. Estas entradas reflejan cambios en los datos (o archivos), ciclos de commit, rollback, etc.
Hay varios parámetros importante en este mandato:
  • JRN: Es el diario del cual vamos a recuperar entradas. Es recordar que, si queremos ver los cambios en tablas que están en diferentes diarios, habremos de ejecutar un DSPJRN por cada diario implicado.
  • FILE: Podemos indicar si solo queremos ver las entradas para una, o más, tablas. Si lo dejamos en blanco saldrán todas.
  • RCVRNG: Si los dejamos en blanco solo recupera entrada del receptor de diario al cual esta conectado en ese momento. Si queremos buscar en un receptor concreto hemos de especificar el nombre del receptor. Si hemos de buscar un rango de fecha/hora hay que que especificar *CURCHAIN, es un error muy habitual olvidarse de este parámetro :(
  • FROMENTLRG y TOENTLRG: Aquí introduciremos el numero de secuencia  de la entrada de diario de inicio/fin, es muy raro usar este parámetro ya que habitualmente desconocemos (de entrada) este número.
  • FROMTIME y TOTIME: Aquí introduciremos la fecha/hora de inicio y fin del rango donde buscaremos, cuando más acotemos menos tardara la búsqueda. Hay que calcularlo bien ya que no podemos paginar más atrás  del inicio que pongamos y tendremos que volver a repetir la búsqueda.
  • JRNCDE y ENTTYP: Si buscamos algún tipo especifico, o código, de entrada de diario, los introducimos aquí, a la practica solo se suele usar en ENTTYP. Por defecto es *ALL, que ya nos va bien.
  • JOB: Introducirlo aquí si sabemos el nombre del trabajo, o mejor su JobID, del cual queremos ver las entradas de diario que ha generado su ejecución. De esta forma acotamos la búsqueda y podemos analizar el comportamiento de un trabajo en base a los cambios en la base de datos.
  • CCIDLRG: Si conocemos el numero de secuencia del ciclo de commit, podemos introducirlo. De esta forma solo se mostraran las entradas de diario que se han generado bajo ese ciclo de commit, esta opción es mu potente ya que si los programas utilizan la lógica con ciclos de commit es fácil, para un programador ver 
  • OUTPUT: Para visualizar la información por pantalla, a archivo de spool o  volcar las entradas a un archivo (ver al final de este articulo).

viernes, 1 de marzo de 2013

Entradas de diario para tablas (1)

Las entradas de diario, de los archivos registrados por diario, nos pueden ser de mucha utilidad para analizar los cambios de los archivos y/o de sus datos.

La primera condición es que la tabla este registrada por diario, esto ya lo explique en la entrada Arrancar registro por diario automáticamente.

Es importante arrancar el registro por diario de un archivo, mandato STRJRNPF, con los parámetros:

  • IMAGES(*BOTH): Que guarda la imagen anterior y posterior al cambio del registro (aunque ocupa más espacio en disco); podemos usar el valor *AFTER pero no veremos el valor que tenían los datos antes de grabarse en el registro, aunque ahorremos espacio en disco.
  • OMTJRNE(*OPNCLO): Que omite guardar en el diario una entrada cada vez que hacemos un open y/o close de una tabla, básicamente para ahorrar tiempo y espacio en disco.
El tener tablas registradas por diario tiene implicaciones en el sistema, como el incremento del tiempo de ejecución de los trabajos (debe insertar entradas en el receptor de diario) y del uso de disco (los receptores ocupan espacio); por lo que antes deberemos analizar previamente dicho impacto, y en como gestionaremos los receptores de diario.
Como ayuda podemos consultar el en IBM i Information Center y también estas dos entradas de mi blog:
Con nuestros archivos ya registrados por diario, podemos investigar en sus entradas usando el mandato DSPJRN.

Continua (2)...

viernes, 1 de febrero de 2013

Uso del mandato RGZPFM



El mandato Reorganizar miembro de archivo físico (RGZPFM) tiene dos funciones principales:

  • Comprimir (remover registros eliminados) de un miembro de un archivo físico (PF), para reducir el tamaño del objeto.
  • Ordenar los registros de la tabla con una clave, por lo general la clave principal usando el valor KEYFILE(*FILE), aunque hay que tener en cuenta que si el código de la aplicación es necesito leer los registros con la secuencia de llegada, hemos de utilizar el valor *NONE, para dicho parámetro.
Mientras se ejecuta el proceso de compresión, el mandato RGZPFM bloquea en exclusividad el objeto, por lo que, dependiendo del número de registros, el tamaño de la tabla, y la reconstrucción de los indices de la tabla, la ejecución podría durar mucho tiempo y habla que tenerlo en cuenta para buscar una ventana donde se pueda ejecutar. También está recomendado, yo diría prohibido, cancelar la ejecución del RGZPFM (* ver nota al final), ya que podría dañar el objeto; por ello es recomendable, antes de ejecutarlo, realizar una copia de seguridad del archivo, sus índices y tablas asociadas (restricciones) y detener las aplicaciones que están utilizando la tabla.

jueves, 13 de septiembre de 2012

Visualizar día y hora del ultimo IPL

La utilidad LASTIPL visualiza el día y la hora del ultimo IPL (Initial Program Loader) realizado en el sistema. Tecleamos LASTIPL en la línea de mandatos y, al pulsar Intro, nos devuelve el día y la hora del ultimo arranque del subsistema QCTL:
The system was last IPL'D on 22/07/12 at 06:33:53.

miércoles, 11 de mayo de 2011

Control umbral de disco

Una de las preocupaciones de todo administrador de sistemas es la del espacio en disco disponible en el sistema.
Debemos evitar una caída del sistema por ocupación en disco, ya que un IPL anormal por dicha causa tendrá una larga duración, y ademas no es seguro que se libere el espacio en disco suficiente para terminarla sin intervención manual desde la consola.
Nuestro sistema AS400 tiene dos formas de avisarnos cuando el sistema esta llegando al porcentaje de uso del umbral (predefinido) de ocupación en disco:

(A) La de "toda la vida": El sistema operativo empieza a enviar mensajes de aviso cuando la ocupación en disco supera el umbral definido en la configuración del disco, normalmente del 90%. A partir de ese momento empieza a enviar el mensaje CPF0907 "Serious storage condition may exist. Press HELP." a la cola del operador (QSYSOPR) y al histórico del sistema (DSPLOG). Este mensaje nos indica la cantidad de almacenamiento disponible, el usado y el porcentaje de almacenamiento libre en ese instante. Si tenemos creada la cola de mensaje QSYSMSG (ver Cola de mensajes QSYSMSG) también los recibiremos en esa cola de mensajes especial.

Para ver y/o modificar el umbral, debemos arrancar las herramientas de servicio (DST), para ello nuestro perfil de usuario debe ser de tipo *SECOFR y tener autorización *SERVICE como mínimo. Para entrar en la herramienta de las DST teclearemos el mandato STRSST, que nos pedirá el usuario de servicio y contraseña.
 
Seleccionamos la opción 3. Work with disk units  
Después seleccionar la opción 2. Work with disk configuration y a continuación seleccionaremos la opción 3. Work with ASP threshold, que nos mostrara los umbrales de todas las ASP de disco que tengamos configuradas.
Para modificar el umbral de una ASP, seleccionarla con un 1 y pulsar Intro:
Introducir el nuevo umbral, en %, que deseemos que el i5/OS a partir del cual nos envié el mensaje de aviso.
Para salir de las DST iremos pulsando F3 y finalmente nos pedirá confirmación para salir pulsando Intro.

(B) La otra de las opciones es utilizar los valores de sistema de control del almacenamiento, usar WRKSYSVAL SYSVAL(*STG) para verlos:
  • QSTGLOWACN  Auxiliary storage lower limit action
  • QSTGLOWLMT  Auxiliary storage lower limit
El valor de sistema QSTGLOWLMT, nos permite, conjuntamente con el valor QSTGLOWACN, controlar que debe hacer el sistema operativo cuando llega a cierto limite de ocupación en disco. Su valor indica el porcentaje de disco libre (límite inferior), por omisión es el 5%, a partir del cual empezara a ejecutar la acción definida en el valor QSTGLOWACN, en este caso cuando el sistema llegue al 95% de ocupación en disco.
El valor de sistema QSTGLOWACN puede tener los siguientes valores, con los 3 primeros valores hemos de preocuparnos de que hacer cuando el sistema llegue a su limite inferior de almacenamiento:
  • *MSG: Este es el valor por omisión, e indica que se envié el mensaje CPI099C " Critical storage lower limit reached" a la cola del operador QSYSOPR (y por ende al histórico del sistema) y a la cola QSYSMSG, si esta existe.
  • *CRITMSG: Indica que se enviará el mensaje CPI099B "Critical storage condition exists" a los usuarios designados en los atributos de servicio (CHGSRVA).
  • *ENDSYS: Indica que finalizara TODOS los trabajos y subsistemas y dejara el sistema en estado restringido (subsistema QCTL o QBASE activo desde consola). Esta opción es la más recomendable en sistemas de desarrollo, o no críticos, ya que, aunque podrían haber perdidas de datos (ya que se cancelaran los trabajos que se están ejecutando así como dejaremos de dar servicio), en cambio nos protege una parada incontrolada del sistema cuando llegue al 100% de ocupación en disco y que nos forzaría a una IPL anormal, mucho mas lenta, ademas nos permitirá liberar espacio de disco manualmente, desde la consola, con lo que acortaremos el tiempo de recuperación del sistema.
  • *PWRDWNSYS: Ejecutará el mandato PWRDWSYS dejando el sistema apagado. No recomiendo para nada esta opción, antes es mejor tener el valor *ENDSYS para dejarlo en restringido.
  • *REGFAC: Ejecutará el exit program registrado para el exit point "QIBM_QWC_QSTGLOWACN". Con esto podemos conseguir que cuando se llegue al límite inferior de ocupación en disco, el sistema operativo ejecute el  programa que definamos nosotros. Este programa podría ejecutar, entre otras cosas:
  1. La finalización controlada de aplicaciones no necesarias.
  2. La finalización controlada de transcriptores (impresoras).
  3. Retener colas de trabajos batch.
  4. La eliminación de datos, u objetos, temporales y no necesarios.
  5. etc...
  6. Si no podemos corregir la situación, podremos realizar una parada controlada del sistema para evitar daños mayores.
Para ver, definir, o cambiar el valor del exit program, ejecutar el mandato WRKREGINF EXITPNT(QIBM_QWC_QSTGLOWACN) y la opción 8=Work with exit programs.

miércoles, 16 de marzo de 2011

Autoarranque servicios TCP/IP

El mandato STRTCPSVR tiene el valor *ALL por omisión para el parámetro SERVER. Si no tenemos controlado el uso de este mandato, se arrancaran un montón de servicios TCP/IP y que puede que no necesitemos en nuestras aplicaciones, consumiendo además, recursos del sistema para nada.
Un ejemplo podría ser el servidor de correo SMTP que, evidentemente si no lo usamos en nuestro sistema, puede consumir recursos y darnos algún dolor de cabeza.

Por esta razón recomiendo cambiar el valor por defecto del comando STRTCPSVR (solo válido solo para las versiones del OS/400 V4R5 o superiores):
CHGCMDDFT  CMD(STRTCPSVR) NEWDFT('SERVER(*AUTOSTART)')

De esta forma si se ejecuta un STRTCPSVR sin parámetros, en lugar de arrancar todos los servicios TCP/IP, solo se arrancaran los que hayamos definido como autoarranque nosotros. Además prevendremos posibles ataques por los puertos de los servicios que no estamos utilizando.

¿Como hacemos esto?, pues con el mandato CFGTCP, seleccionamos la opción 20, y vamos modificando todos servicios, que nos interese arrancar automáticamente, con el parámetro AUTOSTART(*YES), el resto los dejamos con el valor *NO. Eso si hemos de tener muy claro que servicios usamos y cuales no.
Para algunos servicios existen comandos para cambiarlos directamente desde la linea de mandatos, por ejemplo para el FTP Trivial: CHGTFTPA AUTOSTART(*NO)

¡¡Ojo!! Hay algunos servicios que solo se pueden configurar desde el "Navegador de Operaciones" (menú Network, Servers, TCP/IP). Para modificarlos usar el botón derecho sobre cada servicio (Propiedades) y desmarcar o marcar la casilla "Start when TCP/IP is started".

¡¡Ojo!!  También deberemos verificar el programa QSTRUP, o el que utilicemos en nuestro sistema, no tenga "hardcode" el mandato STRTCPSVR SERVER(*ALL).

sábado, 5 de marzo de 2011

Gestionar mejor la configuracion de subsistemas

En varias de las entradas del blog se mostraba como "tunear" nuestros subsistemas:
Asignar prioridad automáticamente
Cola de trabajos independiente
Memoria para subsistema
Colas de trabajos
Entradas de direccionamiento
Cambiar inicio de sesión

La gente de System i Network publica utilidades y artículos muy interesantes, y muchos de ellos nos pueden ser de mucha utilidad. Entre ellas han publicado unas utilidades de Carsten Flensburg que nos pueden facilitar las tareas de configuración de los subsistemas.

Están divididas en cuatro artículos titulados:
Carsten's Corner - New Subsystem Entry Commands
New Subsystem Entry Commands - Part 1
New Subsystem Entry Commands - Part 2
New Subsystem Entry Commands - Part 3
New Subsystem Entry Commands - Part 4

lunes, 8 de noviembre de 2010

Estadisticas espacio en disco

Muchos de nosotros conocemos la utilidad del sistema para recoger las estadísticas de uso de disco. Para los que no las conozcan se accede a ellas con el mandato GO MENU(DISKTASKS)
Con ellas podemos planificar la recogida de datos de ocupación de disco (mandato RTVDSKINF), ya que el proceso suele tardar horas, y la impresión de los informes de los datos recogidos (mandato PRTDSKINF), con varios niveles de detalle.

Lo más habitual es planificar la recogida de datos de ocupación en disco semanalmente (o mensualmente) durante el fin de semana (por ejemplo), con la opción 1. Collect disk space information, e imprimir el informe al lunes siguiente.

Cuando planificamos la recogida el sistema nos añade una entrada en el planificador de trabajos denominada QEZDKWKMTH, lo podemos ver con el mandato WRKJOBSCDE JOB(QEZDK*).
El trabajo QEZDKWKMTH graba los datos en el archivo QUSRSYS/QAEZDISK, no confundir con el mismo archivo en la biblioteca QSYS ya que esta vacío. Cada vez que se lanza el trabajo QEZDKWKMTH limpia, antes de empezar, el archivo QAEZDISK, de la QUSRSYS, para insertar los nuevos datos en la siguiente ejecución.

jueves, 2 de septiembre de 2010

Limpiar automaticamente mensajes, joblogs, dumps, ...

Una de las tareas básicas de cualquier administrador de un sistema es mantener los logs del sistema. Nuestro AS400 incluye una funcionalidad para realizar estas tareas, de una forma sencilla y automática.

Para ello solo hemos de ejecutar el mandato GO MENU(CLEANUP) que nos mostrará un menú con las siguientes opciones:
 Primero definiremos que acciones y periodos queremos limpiar, para ello seleccionamos la opción 1, que nos mostrará la siguiente pantalla:
En esta pantalla definimos los periodos de retención de los mensajes, diarios y logs del sistema, así como la hora de ejecución diaria de la limpieza. Pulsar Intro para guardar los cambios y otra vez para salir. 
Nota1: La limpieza de joblogs la realiza solo de los listados ubicados en  las colas de salida QUSRSYS/QEZJOBLOG y QUSRSYS/QEZDEBUG.
Nota2: Para que los listados de los joblogs, dumps y vuelcos de servicio vayan a parar a las colas QEZ* correspondientes, ejecutar los siguientes mandatos:
  CHGPRTF    FILE(*ALL/QPJOBLOG) OUTQ(*LIBL/QEZJOBLOG)
  CHGPRTF    FILE(*ALL/QPPGMDMP) OUTQ(*LIBL/QEZDEBUG)
  CHGPRTF    FILE(*ALL/QPSRVDMP) OUTQ(*LIBL/QEZDEBUG)
A continuación solo nos queda activar la limpieza automática seleccionando la opción 2.

Nota3:  Para que se ejecute la limpieza diaria debe estar activo el Planificador de trabajos del sistema. Trabajo QSYSSCD en subsistema QCTL o QBASE, este trabajo somete el trabajo QCLNUSRMSG, así como los trabajos planificados.

También podemos lanzar la limpieza automática inmediatamente con la opción 3, o cancelar su ejecución con la opción 4.

lunes, 29 de marzo de 2010

Uso del mandato WRKACTJOB

Uno de los mandatos más utilizados en el AS400 es el WRKACTJOB (Trabajar con Trabajos Activos), ¿Pero le sacamos todo el partido a este mandato?
En primer lugar comentar que este mandato es un consumidor de recursos, por tanto no es recomendable que estén varias personas ejecutándolo al mismo tiempo. La primera vez que usamos el mandato puede que nos salga una pantalla parecida a esta:
Esta nos muestra las opciones y las teclas de Función que podemos usar. Una vez tengamos soltura con esas opciones y funciones, podemos pulsar F21=Nondisplay instructions/keys para ocultarlas, de esta forma podemos ver más trabajos en la misma pantalla:

La primera vez que ejecutamos este mandato en nuestra sesión, se activan unas estadísticas que se actualizaran cada vez que pulsemos F5=Refresh, con lo que acumulara y hará las medias aritméticas de los valores de algunas columnas marcadas bajo la denominación Elapsed, como la del porcentaje de uso de CPU de los trabajos. En la parte superior tenemos el campo Elapsed time que nos indica el tiempo desde el ultimo reset de las estadísticas. También vemos CPU % que indica el total de uso de CPU del sistema para el total de procesadores que tengamos. El total de trabajos en el sistema se nos indica en el campo Active jobs.
Si pulsamos F10=Restart statistics, resetearemos las estadísticas a 0, esto nos puede servir para comprobar el consumo puntual de CPU (snapshot) de un trabajo.

También podemos utilizar F19=Start automatic refresh para dejar la pantalla en modo de refresco automático, que como si pulsáramos F5 cada n segundos, el valor por omisión esta indicado en el parámetro INTERVAL del mandato, por omisión es *PRV o sea el ultimo utilizado, aunque la primera vez son 300 segundos. Esto nos puede ser útil para controlar algún trabajo en concreto desde una pantalla.

Con F17=Top podemos ir al principio de pantalla y con F18=Bottom al final, esto nos sirve para movernos algo más rápido, sobre todo si tenemos muchos trabajos.

Con F11 podemos cambiar las vistas para ver más información sobre el trabajo, hay 3 vistas diferentes que aparecen cada vez que pulsamos la tecla de función.

El mandato WRKACTJOB permite filtrar por:
  • Nombre de subsistema (SBS) para por ejemplo ver solo los trabajos interactivos en el subsistema QINTER y/o QCTL:
    • WRKACTJOB SBS(QCTL QINTER)
  • Nombre de trabajo (JOB) para ver solo los trabajos que:
    • Empiecen por un nombrte:
      • WRKACTJOB JOB(MyJob*)
    • Trabajos del sistema:
      • WRKACTJOB JOB(*SYS)
    • O trabajos de subsistema activos:
      • WRKACTJOB JOB(*SBS)
  • Podemos filtrar por:
    • Uso de CPU (CPUPCTLMT), por ejemplo los trabajos que consumas mas de un 15% de CPU: WRKACTJOB CPUPCTLMT(15)
    • Tiempo de respuesta interactivo (RSPLMT) de una sesión (pantalla verde), por ejemplo una pantalla que tarde más de 5 minutos en ejecutar un programa/mandato: WRKACTJOB RSPLMT(300)
Otra opción muy interesante es el parámetro Sequence (SEQ) que nos permite ordenar por alguna de las columnas del mandato, un clásico es ordenar por consumo de CPU para averiguar que trabajo se nos esta llevando el procesador: WRKACTJOB SEQ(*CPU) o por Total de unidades de CPU consumidas (en segundos) WRKACTJOB SEQ(*CPUPCT). Para más información pulsar F1=Help sobre campo del parámetro y podremos ver una explicación más detallada de todas las opciones posibles.

Una opción que utilizo bastante es ordenar por una columna, combinándola con otras opciones explicadas, por ejemplo la de Status de los trabajos, para ello situamos el cursor encima del titulo de la columna y pulso F16=Resequence de esta forma puedo encontrar, más rápidamente, todos los trabajos que están en estado MSGW.
Nota: Tener en cuenta que si queremos ordenar por subsistema debemos situar el cursor encima de la columna Subsystem/Job, pero si queremos ordenar por nombre de trabajo deberemos situar el cursor encima del primer carácter del nombre de trabajo que aparezca en la pantalla.

Otra opción, poco conocida, es que el mandato WRKACTJOB oculta los trabajos de prearranque inactivos (PJ) o grupos de sesión inactivos (INT), es cuando pulsamos la tecla PetSys + opción 1 (Mayusc+Esc) o la tecla de Atención de Sistema (Esc). Para visualizarlos hemos de pulsar F14=Include, un ejemplo para el subsistema QSERVER:
WRKACTJOB SBS(QSERVER)
En esta pantalla solo vemos 5 trabajos, pero si pulsamos F14 nos aparecen más de 14 trabajos:

Finalmente podemos usar la tecla de función F15=Work with system status que ejecuta el mandato WRKSYSSTS que necesitaría un libro para explicar su utilidad, podéis consultar la siguiente entrada para tener alguna idea sobre el tema: Como saber si el AS400 necesita mas RAM

miércoles, 28 de octubre de 2009

Cancelar un rollback

En un artículo anterior se explicaba como averiguar el porcentaje rollback realizado por un trabajo.

Pero en muy contadas excepciones nos puede interesar cancelar un rollback, cosa realmente peligrosa sino conocemos, pero que muy bien, lo que esta haciendo el trabajo en la base de datos.

Por norma un rollback NUNCA se debe cancelar, debemos esperar que termine.

No se os ocurra realizar un IPL para forzar la finalización de un rollback, ya que el sistema lo terminara durante el IPL, con lo os quedareis sin sistema durante un tiempo indeterminado.

Dicho lo anterior, unos ejemplos de casos en que nos puede interesar cancelar el rollback:

  • Supongamos que lanzamos un programa que crea una tabla temporal, abre un ciclo de commit y empieza a insertar registros en esta tabla, el programa se mete en un bucle y continua insertando registros, cuando lleva unos cuantos millones de insert nos damos cuenta y cancelamos el trabajo. Entonces empieza a realizar el rollback eliminando millones de registros insertados. En este caso si pudiéramos cancelar el rollback y eliminar la tabla temporal seguro que terminaría más rápido que esperar el final del rollback.
  • Un programa se mete en un bucle actualizando miles de veces el mismo registro, es importante verificarlo con las entradas del diario. Al cancelarlo el rollback empezara a realizar miles de update en sentido inverso hasta dejarlo en el valor original. También en este caso si supiéramos el valor del registro al inicio del bucle, podríamos cancelar el rollback y después realizar un update manual del registro a su valor inicial; con esto ahorraríamos seguramente mucho tiempo.
  • Un trabajo realiza cambios en una o mas tablas, utilizando un solo ciclo de commit, cuando lleva unos millones de cambios cancelamos el trabajo. Si tenemos la absoluta seguridad que tenemos una copia de las tablas antes de empezar el proceso y que ningún otro trabajo ha realizado cambios en las mismas, podríamos valorar la posibilidad de cancelar el rollback y restaurar las tablas.
A partir de la V5R3 existe un procedimiento para cancelar un rollback, es el siguiente:
  1. Definir la estrategia para reparar la base de datos: Asegurarse de que tenemos los datos necesarios, verificar que tenemos las copias de seguridad, son accesibles  y contienen las tablas implicadas (recordar los ejemplos).
  2. Conectarse con usuario con permisos *SECOFR.
  3. Lanzar el ENDJOB, con OPTION(*IMMED), del trabajo que empezara a realizar el rollback.
  4. Averiguar el ciclo de compromiso del rollback que vamos a cancelar:
  5. WRKCMTDFN JOB(012345/MYUSER/MYJOB)
  6. Pulsar F23 para ver más opciones y  aparecerá la opción 20=End rollback.
  7. Introducir la opción 20 en el ciclo de compromiso a cancelar y pulsar Intro.
  8. Nos aparecerá una pantalla (ver imagen) que nos advierte del peligro de cancelar el rollback, ya que dejaremos inconsistente la base de datos y eso podría afectar a otros trabajos.
  9. Si estamos seguros pulsaremos Intro. Sino podemos pulsar F12 para volver atras.
  10. A partir de ese momento el trabajo empezará a liberar los registros bloqueados por el commit, cancelando el rollback. Esto puede tardar algún tiempo dependiendo de la cantidad de registros.
  11. Una vez a finalizado el rollback y el trabajo, podremos reparar la base de datos, según la estrategia decidida en el primer paso. En los ejemplos: Eliminar la tabla temporal, Actualizar manualmente el registro implicado, Restaurar la/s tabla/s implicadas.


ADVERTENCIA FINAL: Es responsabilidad vuestra el utilizar, o no, este procedimiento. Como comprenderéis podéis causar un daño irreversible a la base de datos, si no estáis absolutamente seguros de lo que vais a hacer. En caso de la más mínima duda os recomiendo esperar al final del rollback.

Más información en el documento: Ending A Rollback - V530 and Later Releases

lunes, 21 de septiembre de 2009

Auditar uso de comandos

Hay ciertos mandatos que nos puede interesar que los usuarios no utilicen, pero en cambio hemos de permitir el uso de otros.
Al crear un usuario y definir que clase de usuario es (USRCLS), de alguna forma ya estamos limitando que mandatos podrá usar y cuales no. Con las autorizaciones especiales (SPCAUT) del perfil de usuario, podemos limitar aun más el acceso a los mandados críticos.
Pero ademas podemos auditar la utilización de un mandato, sin limitar su uso, por ejemplo el mandato CLRPFM.

¿Como podemos hacerlo? Simplemente cambiando el valor de auditoria del objeto QSYS/CLRPFM de tipo *CMD.

Para ver el valor actual de auditoria de un objeto, hemos de utilizar el mandato:

DSPOBJD OBJ(QSYS/CLRPFM) OBJTYPE(*CMD) DETAIL(*FULL)

Pulsando una vez la AvPág, podremos observar que tiene el valor "Object auditing value" igual a *NONE. Para cambiarlo y empezar a auditar su uso, ejecutaremos el mandato:

CHGOBJAUD OBJ(QSYS/CLRPFM) OBJTYPE(*CMD) OBJAUD(*ALL)

Esto hará que cada vez que se utilice el mandato CLRPFM, se grabara una entrada en el diario de auditoria del sistema (QSYS/QAUDJRN).

Posteriormente podemos obtener un listado del uso del mandato ejecutando:

CPYAUDJRNE ENTTYP(CD) OUTFILE(MYLIB/CMD_USE)

Esto volcara las entradas de uso de cualquier objeto, que se este auditando, a un fichero. Después con SQL podremos seleccionarlas:

SELECT CDTSTP, CDJOB, CDUSER, CDNBR, CDPGMLIB, CDPGM, CDCMDS FROM
MYLIB/CMD_USECD WHERE CDCMDS LIKE '%CLRPFM%'

Nota: El mandato CPYAUDJRNE añade los caracteres CD al nombre del fichero de salida.

Ahora ya podemos ver cuando, quien y desde que programa se ha utilizado el mandato CLRPFM. Si el programa es el QCMD, nos indicara que se ha ejecutado desde la linea de mandatos.

Este tipo de auditoria nos puede también servir para investigar algún problema en nuestros programas o aplicaciones, ver quien usa ciertos objetos, o simplemente llevar un registro del uso de ciertos objetos importantes.

CHGOBJAUD OBJ(MYLIB/MYOBJECT) OBJTYPE(*CMD) OBJAUD(*ALL)

Hay que tener en cuenta que estas entradas del diario de auditoria ocupan espacio en disco y habrá que tener un procedimiento de salvado y borrado de los receptores de diario para evitar comernos el espacio en disco si auditamos demasiados objetos.
También el rendimiento del sistema puede verse afectado, ligeramente, si auditamos muchos objetos muy usados.

Una vez analizado sería conveniente desactivar la auditoria de uso, a no ser que queramos llevar un registro.

CHGOBJAUD OBJ(MYLIB/MYOBJECT) OBJTYPE(*CMD) OBJAUD(*CHANGE)

Podemos usar el valor *CHANGE que habitualmente es el valor por omisión del valor de sistema QCRTOBJAUD, o *NONE para no auditar nada en absoluto ese objecto (solo es recomendable en unos pocos casos).

Mas información:

sábado, 5 de septiembre de 2009

Conexion automatica al AS400

¿Como realizar una conexión automática desde un servidor Windows, o un cliente de red, al AS400?

A veces necesitamos para lanzar un cmd, o bat, en un pc en que la conexión al AS400 ya este establecida; para hacerlo automáticamente debemos tener instalado el producto iSeries Access y entonces podremos utilizar el comando c:\Program Files\ibm\Client Access\cwblogon.exe.

Básicamente se trata de cargar en un buffer de windows el usuario y la contraseña que utilizamos para conectar a el AS400 y así cuando los requiera la conexión windows la suministrara sin ninguna intervención.
Sintaxis
Para iniciar la sesión en un servidor:
CWBLOGON sistema /u ID_usuario /p contraseña

Para borrar un ID de usuario específico:
CWBLOGON sistema /u ID_usuario /c

Para borrar todos los ID de usuario de un servidor:
CWBLOGON sistema /c

Para borrar todos los ID de usuario de la antememoria:
CWBLOGON /c

Parámetros
sistema designa el nombre del servidor para el que debe almacenarse la información de ID de usuario y contraseña
/u ID_usuario designa el ID de usuario del servidor que debe almacenarse en la antememoria de iSeries Access para Windows
/p contraseña designa la contraseña del servidor asociada al ID de usuario proporcionado
/c borra la información de ID de usuario y contraseña de la antememoria de iSeries Access para Windows

Para más información:
http://www.redbooks.ibm.com/pubs/html/as400/v4r5/ic2924/info/rzaiimst.pdf

sábado, 15 de agosto de 2009

Como saber si el AS400 necesita mas RAM

¿Como podemos saber cuando un sistema AS400 necesita mas memoria RAM?

Nota: En AS400 no se denomina Memoria RAM sino Memoria Principal (Main storage), y el disco Memoria Auxiliar (Auxiliary storage) que puede estar dividido en ASP (Auxiliary storage pool) a modo similar del concepto de volúmenes.

El concepto de uso de la memoria, y la CPU, en el AS400 es muy diferente a la de los sistemas Windows y esa es la base de muchos errores de concepto, cuando provienen de personas que no tienen mucha idea de como funciona un AS400 y, además llegando a conclusiones totalmente equivocadas.

Con el mandato DSPSYSSTS puedes ver la cantidad de memoria (pool size) que esta "usando" el sistema, en los diferentes pool de memoria definidos en el sistema (ver Memoria para subsistema), pulsa F21=Select assistance level y selecciona 3=Advanced para acceder a toda la información en la misma pantalla.
El i5/OS, el nuevo nombre del sistema operativo del AS400, siempre consume siempre TODA la memoria disponible.

Normalmente yo me fijo, básicamente, en cuantas paginas en estado Inelegible (Wait-Inel, Act-Inel) aparecen en el DSPSYSSTS.

¿Que nos indica este parámetro Inel? pues básicamente que cuando el s.o. ha necesitado cargar una pagina de memoria de disco a memoria RAM (ya que estaba paginada), no ha podido, porque toda la memoria RAM estaba ocupada por trabajos que están activos y usando la CPU, esto explicado de manera simple y para que se entienda, ya que intervienen otros factores, como por ejemplo el TIMESLICE y el PURGE.

Además habría que analizar las causas de la paginación, ya que podría tener una "fácil" solución que no implique comprar mas RAM, sino solamente algo de "tunning" del tamaño de los pool de memoria y/o en el numero de hebras (threads) activos en cada momento.

Puedes leerte las siguientes entradas de mi blog www.as400howto.com, para ver si te aclaro un poco más el tema:

También tienes un link a un documento de IBM que puede servirte de ayuda:

sábado, 1 de agosto de 2009

Recuperar configuracion dispositivos

¿Como recuperar la configuración de dispositivos, controladores y lineas configuradas en nuestro AS400?. Para ello ejecutar el siguiente mandato:

RTVCFGSRC CFGD(*ALL) CFGTYPE(*ALL) SRCFILE(QGPL/QCLSRC) SRCMBR(SYSTEM_CFG)

Podemos utilizar la información recuperada como backup histórico o para, incluso, duplicar la configuración en otros AS400.

Un ejemplo de como buscar dos impresoras con la misma dirección IP:
  1. RTVCFGSRC CFGD(PRT*) CFGTYPE(*DEVD) SRCFILE(QGPL/QCLSRC) SRCMBR(PRINTERS)
  2. Esto crea el miembro fuente QGPL/QCLSRC.PRINTERS.
  3. Doy por supuesto que todas las impresoras se denominan PRT*, sino habrás de hacerlo por cada una, o por grupos, en ese caso acuérdate de utilizar la opción MBROPT(*ADD) para que no sobrescriba el miembro.
  4. Después editar el fuente:
  5. STRSEU SRCFILE(QGPL/QCLSRC) SRCMBR(PRINTERS)
  6. Utilizar la opción de búsqueda de string del SEU, para encontrar la dirección IP
  7. Utilizar la tecla F14 (o el comando F) + Direccion_IP y pulsar F16 para buscarla.
  8. Si aparece mas de una vez es que esta duplicada.