Limitar recursos asignados a Servicios de BBDD Oracle

Cuando las decisiones sobre la asignación de recursos de base de datos se dejan al sistema operativo, pueden aparecer (entre otros) los siguientes problemas con la gestión de la carga de trabajo:

  • Sobrecarga excesiva
  • Planificación ineficiente
  • Asignación de recursos inapropiada
  • Imposibilidad de gestionar recursos específicos de base de datos.

El Gestor de Recursos (Resource Manager) de la base de datos ayuda a solucionar estos problemas otorgando a la base de datos más control sobre cómo se asignan los recursos. Proporciona las siguientes opciones (entre otras):

  • Garantizar a ciertas sesiones una cantidad mínima de CPU, al margen de la carga del sistema y del número de usuarios.
  • Distribuir la CPU disponible mediante la asignación de porcentajes de tiempo de CPU a diferentes usuarios y aplicaciones.
  • Limitar el grado de paralelismo de cualquier operación efectuada por miembros de un grupo de usuarios.

Los elementos del Gestor de Recursos que se ven involucrados son los siguientes:

  • Grupo consumidor de recursos (resource consumer group): Es un conjunto de sesiones que se agrupan basándose en los requisitos de recursos. El Gestor de Recursos asigna recursos a grupos consumidores de recursos, no a sesiones individuales.
  • Plan de recursos (resource plan): Es un contenedor de directivas que especifica cómo se asignan recursos a los grupos consumidores de recursos. Se especifica cómo asigna recursos la base de datos mediante la activación de un plan de recursos específico.
  • Directiva de plan de recursos (resource plan directive): Asocia un grupo consumidor de recursos con un plan en concreto y especifica cómo se asignan los recursos al grupo consumidor.

Para más información se puede consultar aquí la documentación.

A continuación se muestra un ejemplo de cómo es posible realizar una configuración para limitar el consumo de recursos de los usuarios que se conectan a nuestra base de datos, en base a los servicios de ésta.

Crear servicios

En primer lugar se crean los servicios que se deseen para facilitar la gestión de la carga siguiendo los pasos explicados en este post anterior de nuestro blog. En nuestro caso se han creado los servicios ‘SERVICIO_PRIORITARIO’ y ‘SERVICIO_NO_PRIORITARIO’, añadiendo las entradas correspondientes en el fichero tnsnames.ora. Antes de continuar se comprueba que el listener posee los servicios:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[oracle@centos1 ~]$ lsnrctl status listener_orcl
LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 20-OCT-2014 16:43:36
Copyright (c) 1991, 2013, Oracle.  All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=orcl-vip)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     listener_orcl
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                20-OCT-2014 07:13:19
Uptime                    0 days 0 hr. 30 min. 17 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/product/11.2.0/dbhome_1/log/diag/tnslsnr/centos1/listener_orcl/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.93.140)(PORT=1521)))
Services Summary...
Service "orcl.avanttic.test" has 2 instance(s).
  Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB.avanttic.test" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "servicio_no_prioritario.avanttic.test" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "servicio_prioritario.avanttic.test" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully

Limitar recursos

Para poder limitar los recursos que utiliza cada servicio es necesario dar 3 pasos: crear grupos, asignar servicios a grupos y crear el plan de gestión de recursos sobre los grupos.

Estos 3 pasos se pueden realizar desde Enterprise Manager o desde línea de comandos. De cara a facilitar la explicación se va a hacer únicamente con Enterprise Manager.

1. Crear Grupos

En Enterprise Manager, se accede a la pestaña ‘Server’ y bajo la categoría ‘Resource Manager’ está ‘Consumer Groups’:

Enterprise Manager - pestaña 'Server'
Enterprise Manager – pestaña ‘Server’

Aparece una relación de los grupos existentes. Para crear un grupo nuevo pulsar ‘Create’:

Enterprise Manager - Consumer Groups
Enterprise Manager – Consumer Groups

A continuación se introducen los datos deseados para el grupo. En nuestro caso vamos a crear 2 grupos, el grupo de usuarios prioritarios que podrán consumir todos los recursos de nuestra base de datos, y el grupo de usuarios no prioritarios que estarán restringidos a la mitad de los recursos. Como usuario prioritario tenemos a recursos humanos, HR:

Create Resource Consumer Group - Grupo prioritario
Create Resource Consumer Group – Grupo prioritario

Como usuario no prioritario tenemos a Scott:

Create Resource Consumer Group - Grupo no prioritario
Create Resource Consumer Group – Grupo no prioritario

2. Asignar servicios a grupos

En este punto, se han creado los servicios y los grupos consumidores. El siguiente paso es asociarlos, para ello se accede a la pestaña ‘Server’ y bajo la categoría ‘Resource Manager’ pulsar ‘Consumer Group Mappings’. En este caso, se selecciona el tipo ‘Service’ pero, si se desease, se podría seleccionar cualquier otra de las que aparecen en la captura:

Enterprise Manager - Consumer Group Mappings
Enterprise Manager – Consumer Group Mappings

Se crea la asociación entre el servicio prioritario y el grupo de usuarios prioritario:

Consumer Group Mappings - Prioritarios
Consumer Group Mappings – Prioritarios

Se crea la asociación entre el servicio no prioritario y el grupo de usuarios no prioritario:

Consumer Group Mappings - No prioritarios
Consumer Group Mappings – No prioritarios

Se revisa el resultado:

Consumer Group Mappings - Servicios y grupos asociados
Consumer Group Mappings – Servicios y grupos asociados

3. Crear plan de gestión de recursos
El último paso a dar es crear el plan de gestión de recursos. Este plan es el que determina como se asignan los recursos a los grupos consumidores. Para crear un plan se accede a la pestaña ‘Server’ y bajo la categoría ‘Resource Manager’ ir a ‘Plans’. Se crea el plan de gestión recursos deseado:

Crear plan de gestión de prioridades
Crear plan de gestión de prioridades

Aquí es donde se decide el nivel de consumo de recursos que va a tener cada uno de los grupos, en nuestro caso el grupo prioritario tendrá acceso al 100% de los recursos y el no prioritario únicamente al 50%. Si se desea, se puede activar el plan en el mismo momento de la creación para que tenga efecto immediato. También es posible realizar la creación en un modo avanzado:

Crear plan de gestión de recursos - modo avanzado
Crear plan de gestión de recursos – modo avanzado

Una vez hecho todo esto y activado el plan, solamente queda comprobar su funcionamiento. Si los usuarios HR y SCOTT se conectan a la base de datos sin hacer uso de los servicios que se han creado se puede ver que grupo asignado no es el deseado:

1
2
3
4
5
6
SQL> select username,resource_consumer_group from v$session where username in ('SCOTT','HR')
USERNAME                       RESOURCE_CONSUMER_GROUP
------------------------------ --------------------------------
HR                             OTHER_GROUPS
SCOTT                          OTHER_GROUPS

Debido a esto es importante configurar bien las conexiones. Si se conectan al servicio correspondiente se comprueba que el grupo asignado es correcto. Realizamos 4 conexiones con cada uno:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL> select sid,serial#,status,username,resource_consumer_group from v$session where username in ('SCOTT','HR') order by 4,5
       SID    SERIAL# STATUS   USERNAME                       RESOURCE_CONSUMER_GROUP
---------- ---------- -------- ------------------------------ --------------------------------
        10          3 INACTIVE HR                             GRUPO_PRIORITARIO
        24         33 INACTIVE HR                             GRUPO_PRIORITARIO
       148         13 INACTIVE HR                             GRUPO_PRIORITARIO
        22         11 INACTIVE HR                             GRUPO_PRIORITARIO
        30          9 INACTIVE SCOTT                          GRUPO_NO_PRIORITARIO
       152          5 INACTIVE SCOTT                          GRUPO_NO_PRIORITARIO
       125         41 INACTIVE SCOTT                          GRUPO_NO_PRIORITARIO
        19          7 INACTIVE SCOTT                          GRUPO_NO_PRIORITARIO
8 filas seleccionadas.

El siguiente paso es simular mucha actividad por parte de los usuarios. Empezamos con el usuario no privilegiado, utilizando las cuatro sesiones abiertas provocamos un consumo de recursos elevado y vemos en el Enterprise manager que el consumo de recursos se mantiene al 50% tal y como habíamos indicado en el plan:

EM - Consumo de recursos
EM – Consumo 50% de recursos

Pero si ejecutamos el código mencionado anteriormente con las sesiones del usuario HR vemos que se consume el 100% de los recursos:

EM - Consumo 100% de recursos
EM – Consumo 100% de recursos

Y en la máquina:

OS - Consumo de recursos
OS – Consumo de recursos

Recapitulando: hemos creado 2 servicios de base de datos y 2 grupos consumidores, hemos asignado estos grupos a sus correspondientes servicios, hemos creado un plan de gestión de recursos añadiéndolos a ambos y lo hemos activado, comprobando que realmente limita los recursos asignados. Con todo esto se consigue que cuando un usuario autorizado se conecte al servicio de base de datos deseado, se le asigne el grupo consumidor adecuado y se le aplique el plan de recursos definido.

Oracle proporciona varios grupos consumidores (como BATCH_GROUP o ETL_GROUP) y planes de gestión de recursos (como ETL_CRITICAL_PLAN o MIXED_WORKLOAD_PLAN) creados previamente y que se pueden utilizar si se desea. También proporciona una serie de vistas del diccionario de datos para consultar y controlar todo lo relacionado con la asignación y uso de grupos consumidores y planes de recursos.

Dado que las bases de datos en entornos productivos suelen ser sistemas complejos y muy vivos, el comportamiento de una sesión puede variar a lo largo del tiempo. Es posible crear reglas que, bajo determinadas circunstancias, modifiquen el grupo consumidor asignado a una sesión de manera dinámica (modificando de esta manera los recursos asignados) o que directamente eliminen esta sesión.

Todas estas herramientas nos permiten poder gestionar mejor nuestras base de datos y tener un mayor control de nuestros entornos productivos, cosa que siempre es una ayuda.

Twitter
LinkedIn
Evolución, innovación y transformación
37 Service Expertise avalados por Oracle 
Our value proposition
100% Oracle posts
Follow our day-to-day activities