Administer Resource Manager

1. Documentación en Tahiti -> Oracle Database, 11g Release 2 (11.2) -> Masters Book List -> Administrator’s Guide -> 27 Managing Resources with Oracle Database Resource Manager

2. El administrador de recursos o Resource Manager se utiliza para priorizar el acceso a los recursos de la máquina a un conjunto de usuarios o aplicaciones en base a una reglas predefinidas con anterioridad. Por ejemplo, se pueden establecer porcentajes de utilización de CPU a distintos grupos de consumidores, dando más capacidad a los usuarios de una aplicación OLTP que a los procesos BATCH. Además, se puede utilizar el Scheduler para poder modificar la configuración en función de la ventana en la que estemos.

3. Para el primer ejercicio que vamos a realizar utilizaremos Enterprise Manager. Este objetivo, junto con los relacionados con el Scheduler, son los más ideneos para realizar con EM. Vamos a intentar reproducir un caso real, más o menos complejo que nos permita ver las opciones que nos ofrece el Resource Manager. Para ellos expondré una serie de requisitos que luego resumiremos en una tabla, y de ahí veremos la implementación con EM.

· Una empresa utiliza la BD de OCM para dos aplicaciones con dos ventanas de servicio diferentes, durante todos los días de la semana
· De 09h a 18h la BD ofrece servicio a una aplicación OLTP con los siguientes requisitos (DAYLIGHT_PLAN)

# Los administradores pueden reservar toda la CPU de la máquina si lo necesitan (100%)
# En un segundo nivel, un 80% de CPU debe destinarse a la aplicación, en adelante OLTP_PLAN
# Otro 20% de CPU es aconsejable que esté reservado para otras operaciones
# Si no se utiliza la CPU, se permite que el equipo BATCH utilice los recursos

· De 18h a 09h la BD ejecuta una serie de procesos para el equipo de BATCH Planning (NIGHT_PLAN)

# Como en el plan DAYLIGHT_PLAN, permitimos que el equipo de administradores pueda usar toda la CPU
# En segundo lugar, el 75% de CPU debe reservarse para el trabajo BATCH (lo llamaremos BATCH_PLAN)
# Como se trata de la ventana nocturna, dejamos un 10% de recursos para las tareas de mantenimiento de la BD (plan ORA$AUTOTASK_SUB_PLAN)
# Un 5% se reservará para el grupo por defecto que crear los Dumps de diagnóstico de procesos críticos (ORA_DIAGNOSTICS)
# Un 10% de CPU debe reservarse para otras funciones no especificadas

· Dentro del plan OLTP_PLAN tenemos los siguientes requisitos

# El grupo de usuarios de la aplicación online (OLTP_GROUP) tendrá acceso al 90% de CPU
# Pertenecerán al grupo OLTP_GROUP los usuarios HR, OE; y los que tenga en rol OLTP_ROLE
# El equipo de analistas funcionales (APP_GROUP) acceden a la BD y le concedemos un 10% de los recursos con las siguientes limitaciones:

@ Un máximo de 10% de CPU
@ Máximo DOP de 2
@ Máximo de 5 sesiones activas con un timeout en cola de 5 minutos
@ Límite de UNDO de 200MB
@ Tiempo máximo de ejecución de 30 minutos
@ Límte de 5GB de I/O
@ Sín límite de peticiones I/O
@ Cuando la sesión supere el límite pasará a formar parte del grupo OTHER_GROUPS
@ Tiempo máximo inactivo de 2 horas
@ Tiempo máximo bloqueando otra sesión 2 minutos

# Dentro del equipo de funcionales estará únicamente el usuario SCOTT

· Dentro del plan BATCH_PLAN tenemos los siguientes requisitos

# El grupo de aplicaciones BATCH (BATCHPLAN_GROUP) debe tener acceso al 90% de recursos de la máquina
# Dentro del grupo BATCHPLAN_GROUP tenemos los usuarios SH y PM
# Otro 10% de los recursos se reservarán para otros recursos

Esta sería la implementación de la distribución de la carga entre los distintos planes.

                                    DAYLIGHT_PLAN
---------------------------------------------------------------------------------------------------
GRUPO O PLAN            LEVEL 1   LEVEL 2   LEVEL 3
---------------------   -------   -------   -------
BATCH_PLAN                                     100%
OLTP_PLAN                             80%
OTHER_GROUPS                          20%
SYS_GROUP                  100%

                                     NIGHT_PLAN
---------------------------------------------------------------------------------------------------
GRUPO O PLAN            LEVEL 1   LEVEL 2   LEVEL 3
---------------------   -------   -------   -------
BATCH_PLAN                            75%
OTHER_GROUPS                          10%
ORA$AUTOTASK_SUB_PLAN                 10%
ORA$DIAGNOSTICS                        5%
SYS_GROUP                   100%

                                     OLTP_PLAN
---------------------------------------------------------------------------------------------------
GRUPO O PLAN            LEVEL 1   LEVEL 2   LEVEL 3
---------------------   -------   -------   -------
OLTP_GROUP                  90%
APP_GROUP                   10%
OTHER_GROUPS                         100%

                                     BATCH_PLAN
---------------------------------------------------------------------------------------------------
GRUPO O PLAN            LEVEL 1   LEVEL 2   LEVEL 3
---------------------   -------   -------   -------
BATCHPLAN_GROUP             90%
OTHER_GROUPS                10%

Comenzamos la configuración del Resource Manager con EM.

Creamos el rol OLTP_ROLE ->
-> Click «Databases» ->
-> Click «OCM» ->
-> Click «Server» ->
-> Click «Roles» ->
-> Click «Create» ->
-> Name = «OLTP_ROLE» ->
-> Click «OK»

Creamos el grupo OLTP_GROUP ->
-> Click «Consumer Groups» ->
-> Click «Create» ->
-> Consumer Group = «OLTP_GROUP» ->
-> Click «Add» ->
-> Seleccionamos los usuarios HR y OE ->
-> Click «Select» ->
-> Click «Roles» ->
-> Seleccionamos «OLTP_ROLE» ->
-> Click «Move» ->
-> Click «OK»

Creamos el grupo APP_GROUP ->
-> Click «Consumer Groups» ->
-> Click «Create» ->
-> Consumer Group = «APP_GROUP» ->
-> Click «Add» ->
-> Seleccionamos el usuario SCOTT ->
-> Click «Select» ->
-> Click «OK»

Creamos el grupo BATCHPLAN_GROUP ->
-> Click «Consumer Groups» ->
-> Click «Create» ->
-> Consumer Group = «BATCHPLAN_GROUP» ->
-> Click «Add» ->
-> Seleccionamos los usuarios PM y SH ->
-> Click «Select» ->
-> Click «OK»

Creamos el plan BATCH_PLAN ->
-> Click «Plans» ->
-> Click «Create» ->
-> Plan = «BATCH_PLAN» ->
-> Click «Advanced» ->
-> Click «Modify» ->
-> Seleccionamos «BATCHPLAN_GROUP» ->
-> Click «Move» ->
-> Click «OK» ->
-> BATCHPLAN_GROUP (LEVEL 1) = 90 ->
-> OTHER_GROUPS (LEVEL 1) = 10 ->
-> Click «OK»

Creamos el plan OLTP_PLAN ->
-> Click «Plans» ->
-> Click «Create» ->
-> Plan = «OLTP_PLAN» ->
-> Click «Advanced» ->
-> Click «Modify» ->
-> Seleccionamos «OLTP_GROUP» y «APP_GROUP» ->
-> Click «Move» ->
-> Click «OK» ->
-> APP_GROUP (LEVEL 1) = 10 ->
-> OLTP_GROUP (LEVEL 1) = 90 ->
-> OTHER_GROUPS (LEVEL 2) = 100 ->
-> Click «Parallelism» ->
-> APP_GROUP (Maximum Degree of Parallelism) = 2 ->
-> Click «Session Pool» ->
-> APP_GROUP (Max. Number of Active Sessions) = 5 ->
-> APP_GROUP (Activation Queue Timeout) = 300 sec ->
-> Click «Undo Pool» ->
-> APP_GROUP (Max. Undo Space) = 204800 KB ->
-> Click «Threshold» ->
-> APP_GROUP (Execution Time Limit) = 1800 sec ->
-> APP_GROUP (I/O Limit) = 5120 MB ->
-> APP_GROUP (Action) = «Switch to Group LOW_GROUP» ->
-> APP_GROUP (Revert after call?) = Seleccionado ->
-> Click «Idle Time» ->
-> APP_GROUP (Max Idle Time) = 7200 sec ->
-> APP_GROUP (Max Idle Time if Blocking) = 120 sec ->
-> Click «OK»

Creamos el plan DAYLIGHT_PLAN ->
-> Click «Plans» ->
-> Click «Create» ->
-> Plan = «DAYLIGHT_PLAN» ->
-> Click «Advanced» ->
-> Click «Modify» ->
-> Seleccionamos BATCH_PLAN, OLTP_PLAN y SYS_GROUPS ->
-> Click «Move» ->
-> «OK» ->
-> BATCH_PLAN Level 3 = 100 ->
-> OLTP_PLAN Level 2 = 80 ->
-> OTHER_GROPS Level 2 = 20 ->
-> SYS_GROUP Level 1 = 100 ->
-> Click «OK»

Creamos el plan NIGHT_PLAN ->
-> Click «Plans» ->
-> Click «Create» ->
-> Plan = «NIGHT_PLAN» ->
-> Click «Advanced» ->
-> Click «Modify» ->
-> Seleccionamos BATCH_PLAN, ORA$AUTOTASK_SUB_PLAN, ORA$DIAGNOSTICS y SYS_GROUPS ->
-> Click «Move» ->
-> «OK» ->
-> BATCH_PLAN Level 2 = 75 ->
-> ORA$AUTOTASK_SUB_PLAN Level 2 = 10 ->
-> ORA$DIAGNOSTICS Level 2 = 5 ->
-> OTHER_GROPS Level 2 = 10 ->
-> SYS_GROUP Level 1 = 100 ->
-> Click «OK»

Creamos las ventanas de ejecución del DAYLIGHT_PLAN ->
-> Click «Windows» ->
-> Click «Create» ->
-> Name «DAYLIGHT_WINDOW» ->
-> Resource Plan = «DAYLIGHT_PLAN» ->
-> Priority = «High» (damos mayor prioridad sobre otras ventanas) ->
-> Time Zone = «(UTC+01:00) Madrid»
-> Repeating = «By Days»
-> Interval (Days) = 1
-> Time = «9:00:00 AM»
-> Duration = «9 Hours 0 Minutes» ->
-> Seleccioamos «Immediately» ->
-> Click «OK»

Creamos las ventanas de ejecución del NIGHT_PLAN ->
-> Click «Windows» ->
-> Click «Create» ->
-> Name «NIGHT_WINDOW» ->
-> Resource Plan = «NIGHT_PLAN» ->
-> Priority = «High» (damos mayor prioridad sobre otras ventanas) ->
-> Time Zone = «(UTC+01:00) Madrid»
-> Repeating = «By Days»
-> Interval (Days) = 1
-> Time = «6:00:00 PM»
-> Duration = «15 Hours 0 Minutes» ->
-> Seleccioamos «Immediately» ->
-> Click «OK»

Creamos los grupos de mapeo entre usuarios y grupos de consumidores ->
-> Click «Consumer Group Mappings» ->
-> View = «Oracle User» ->
-> Click «Add Rule for Selected Type» ->
-> Selected Consumer Group = «APP_GROUP» ->
-> Seleccionamos a SCOTT ->
-> Click «Move» ->
-> Click «OK» ->
-> Click «Add Rule for Selected Type» ->
-> Selected Consumer Group = «OLTP_GROUP» ->
-> Seleccionamos a HR y OE ->
-> Click «Move» ->
-> Click «OK» ->
-> Click «Add Rule for Selected Type» ->
-> Selected Consumer Group = «BATCHPLAN_GROUP» ->
-> Seleccionamos a SH y PM ->
-> Click «Move» ->
-> Click «OK»

Actualmente, mi instalación de Enterprise Manager presenta un Bug y no se puede acceder a la página de gestión de prioridades (Priorities) dentro del mapa entre usuarios y grupos de consumidores (Consumer Group Mappings), pero se puede realizar a través de PL/SQL muy facilmente.

Actualización 2015/03/30

Los siguientes parches corrigen el bug de OEM y os permiten gestionar las prioridades desde la web (Gracias Jeff). Si no queréis instalarlos siempre podéis utilizar el paquete DBMS_RESOURCE_MANAGER.

  • For DB Console:
    p14727310_112030_LINUX.zip
    p13536618_112035_Generic.zip
  • For OMS:
    p16572176_111010_Generic.zip
    p13536618_111019_Generic.zip
BEGIN
DBMS_RESOURCE_MANAGER.CLEAR_PENDING_AREA;
DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA;
DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING_PRI(
   explicit               => 1,
   oracle_user            => 2,
   service_name           => 3,
   client_os_user         => 4,
   client_program         => 5,
   client_machine         => 6,
   module_name            => 7,
   module_name_action     => 8,
   service_module         => 9,
   service_module_action  => 10);
DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA;
DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA;
END;
/

Para estar seguros de que por las noches y el fin de semana, no se nos activa el plan de mantenimieno (DEFAULT_MAINTENANCE_PLAN), debemos desactivar las ventanas asociadas.

Click «Windows» ->
-> Click «MONDAY_WINDOW» ->
-> Click «Edit» ->
-> Enabled = «No» ->
-> Click «Apply»

Realizamos la misma tarea para el resto de ventanas:

· MONDAY_WINDOW
· TUESDAY_WINDOW
· WEDNESDAY_WINDOW
· THURSDAY_WINDOW
· FRIDAY_WINDOW
· SATURDAY_WINDOW
· SUNDAY_WINDOW

Por último activamos el plan enfunción de la franja horaria que estemos.

Click «Plans» ->
-> Seleccionamos «DAYLIGHT_PLAN» ->
-> Actions = «Activate» ->
-> Click «Go» ->
-> Click «Yes»

4. El parámetro que controla el plan activo es RESOURCE_MANAGER_PLANG. Podemos cambiar el plan activo modificando el parámetro con ALTER SYSTEM. También, cuando se activa una ventana que tiene asociado un Resource Plan, se modifica el parámetro para reflejar que entra en juego el nuevo plan.

-- Comprobamos el valor del parámetro RESOURCE_MANAGER_PLAN
-- Ej.: SCHEDULER[0x15FE2]:NIGHT_PLAN
--   · Vemos en el ejemplo que el plan se ha fijado por el Scheduler (SCHEDULER[0x15FE2])
SHOW PARAMETER RESOURCE_MANAGER_PLAN

Cuando modificamos el parámetro, tenemos la opción de proteger el plan que fijemos en el caso de que entre una ventana del Scheduler y quiera modificarlo. Continuando con el ejemplo anterior, supongamos que son las 17:45 de la tarde y estamos lanzando un proceso muy importante que corre sobre la aplicación OLTP. En ese momento está corriendo DAYLIGHT_PLAN, pero a las 18h se abre la ventana nocturna activando el plan NIGHT_PLAN. Podemos evitarlo utilizando la clausula «FORCE».

-- Activamos el plan diurno (DAYLIGHT_PLAN) evitando que se vea afectado por el Scheduler
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN='FORCE:DAYLIGHT_PLAN';

-- Cuando queramos que el Scheduler vuelva a gestionar los planes, lo modificamos sin "FORCE"
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN='NIGHT_PLAN';

5. La configuración de Resource Manager puede consultarse en la vistas DBA_RSRC_%.

· DBA_RSRC_CAPABILITY
· DBA_RSRC_CATEGORIES
· DBA_RSRC_CONSUMER_GROUPS
· DBA_RSRC_CONSUMER_GROUP_PRIVS
· DBA_RSRC_GROUP_MAPPINGS
· DBA_RSRC_INSTANCE_CAPABILITY
· DBA_RSRC_IO_CALIBRATE
· DBA_RSRC_MANAGER_SYSTEM_PRIVS
· DBA_RSRC_MAPPING_PRIORITY
· DBA_RSRC_PLANS
· DBA_RSRC_PLAN_DIRECTIVES
· DBA_RSRC_STORAGE_POOL_MAPPING

-- Consultas de ejemplo
-- Planes disponibles en REsource Manager
SELECT PLAN, STATUS FROM DBA_RSRC_PLANS;

-- Configuración del plan DAYLIGHT_PLAN
SELECT * FROM DBA_RSRC_PLAN_DIRECTIVES WHERE PLAN_NAME='DAYLIGHT_PLAN';

-- Mapping entre los usuarios y grupos de consumidores
SELECT * FROM DBA_RSRC_GROUP_MAPPINGS;

6. En este ejercicio hemos visto como implementar la solución con Enteprise Manager. En mi opinión, manejar el Resource Manager con PL/SQL es una locura (paquete DBMS_RESOURCE). La posibilidad de error es enorme. Doy por hecho que en el examen se podrá utilizar EM para este trabajo porque sino, sólo con el ejercicio de Resource Manager se podría cubrir todo el tiempo destinado a la sección de Performance Management.