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.

No hay comentarios: