Oracle Database 12.2: Gestión de memoria a nivel PDB en ambientes multitenant

Por Por Sebastián D’Alessandro
Publicado en Mayo 2018

Revisado por Lorenzo Mota



Introducción


En Oracle Database 12.1 un CDB (“Container Database”) tiene una única asignación de memoria SGA (“System Global Area”), la cual es compartida por todos los contenedores, el root container y todas las PDBs.

Lo mismo ocurre con la PGA (“Program Global Area”), donde el parámetro PGA_AGGREGATE_TARGET especifica el objetivo de memoria “target” para la PGA compartida por todos los “server process” conectados a la instancia.

Gran parte de la SGA actúa como una memoria cache que favorece a los objetos accedidos con mayor frecuencia, esto ocurre por ejemplo con el “data buffer cache”, la “shared pool”  y otras estructuras de memoria. Se dá entonces una suerte de competencia entre las distintas sesiones y procesos por la utilización de este espacio en la SGA y sus distintas estructuras asociadas.  Por tal motivo, en versión 12.1 es probable que una PDB con mucha actividad, pueda llegar a tener un dominio claramente marcado en la utilización del espacio de SGA, generando problemas de performance en otras PDBs.

Algo similar a lo anteriormente comentado, ocurre con la utilización de la PGA.

En Oracle Database 12.2 se introduce una nueva manera de gestionar la memoria permitiendo que tanto la SGA como la PGA puedan ser controladas a nivel PDB.




Gestión de SGA en PDBs


  1. Podemos utilizar el parámetro SGA_TARGET para limitar el tamaño máximo de SGA utilizado por cada PDB. En una PDB, SGA_TARGET se debe configurar con un valor menor o igual al valor del mismo parámetro en el root container.


  2. También podemos utilizar el parámetro SGA_MIN_SIZE para especificar el tamaño mínimo de SGA utilizado por una PDB. La configuración de este  parámetro, garantiza que la SGA de esa PDB nunca alcance un tamaño por debajo del valor especificado.


    Los aspectos a tener en cuenta para la configuración del parámetro SGA_MIN_SIZE (SGA mínima garantizada) son:

    • Debe ser menor o igual al 50% de la configuración para SGA_TARGET en el root CDB.
    • Debe ser menor o igual al 50% de la configuración para SGA_TARGET en el PDB.
    • La suma de las configuraciones SGA_MIN_SIZE para todos los PDB debe ser menor o igual al 50% de la configuración para SGA_TARGET en el root CDB.

    Una buena práctica es limitar la suma de los valores SGA_MIN_SIZE de todos los PDB al 50% o menos del tamaño de la SGA del CDB.

    Tanto la configuración indicada con el parámetro SGA_TARGET como con SGA_MIN_SIZE,  van a ser aplicadas de forma efectiva a nivel  “Pluggable Database”, solo si el parámetro SGA_TARGET en el root CDB está configurado con un valor distinto de cero.

    Ambos parámetros SGA_TARGET y SGA_MIN_SIZE pueden ser establecidos a nivel PDB.

    Ejemplo:

    El procedimiento para configurar los parámetros es similar al utilizado en una instancia Oracle tradicional. Debemos tener la precaución de posicionarnos previamente en la PDB adecuada antes de correr las sentencias.

    Veamos un ejemplo de cómo realizar la configuración:

    alter session set container=PDB1;
    ALTER SYSTEM SET SGA_TARGET = 1500M SCOPE = BOTH;
    ALTER SYSTEM SET SGA_MIN_SIZE = 500M SCOPE = BOTH;



    Si intentamos configurar un valor por encima del valor establecido en el root container, obtendremos un mensaje de error como el siguiente:

    SQL> ALTER SYSTEM SET SGA_TARGET=3G SCOPE=BOTH;
    ALTER SYSTEM SET SGA_TARGET=3G SCOPE=BOTH
    *
    ERROR at line 1:
    ORA-02097: parameter cannot be modified because specified value is invalid
    ORA-56747: invalid value 3221225472 for parameter sga_target; must be smaller 
    than parameter sga_target of the root container


    Se puede lograr un control todavía más granular,  estableciendo también parámetros como DB_CACHE_SIZE (tamaño de  buffer cache  garantizado para la PDB) y/o SHARED_POOL_SIZE (tamaño de shared_pool garantizado para PDB).
    Naturalmente, la configuración de todos estos parámetros es necesaria solo en el caso que necesitemos controlar la utilización que realiza una PDB de la SGA, por tal motivo, debe quedar en claro que no es obligatorio tenerlos configurados en todos los casos.




Gestion de PGA para PDBs


En cuanto a la gestión de la memoria PGA a nivel PDB, podemos establecer los parámetros PGA_AGGREGATE_TARGET y PGA_AGGREGATE_LIMIT para controlar su utilización. 

La configuración PGA_AGGREGATE_TARGET es básicamente un “target” u objetivo,  esto significa que Oracle Database va a “intentar” limitar el uso de la memoria PGA tratando de mantener ese valor, no obstante es probable que en algunos casos la utilización de PGA exceda el límite establecido. Para especificar un límite “estricto” en el uso de memoria PGA por parte de una PDB, debemos utilizar el parámetro de inicialización PGA_AGGREGATE_LIMIT. En este caso Oracle Database asegura que el tamaño de la PGA no exceda este límite. Si ese límite es sobrepasado, entonces  la base de datos aborta las llamadas de las sesiones que tienen asignaciones altas de PGA y que no pueden ser ajustadas.

Como ya comentamos, el parámetro PGA_AGGREGATE_TARGET establece un objetivo para el tamaño que debería alcanzar el total de PGA (PGA aggregate) utilizado por la PDB.


A continuación presentamos algunas consideraciones a tener en cuenta para establecer el valor del parámetro: PGA_AGGREGATE_TARGET

  • Debe ser menor o igual que el valor PGA_AGGREGATE_TARGET establecido a nivel CDB. El siguiente código, muestra el error producido en caso de no respetar esta restricción.

    SQL> show parameter pga
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    pga_aggregate_limit                  big integer 2G
    pga_aggregate_target                 big integer 1G
    
    SQL> alter session set container=PDB12CR2;
    Session altered.
    
    
    SQL> show parameter pga
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    pga_aggregate_limit                  big integer 1G
    pga_aggregate_target                 big integer 1G
    
    SQL> alter system set pga_aggregate_target=1500M;
    alter system set pga_aggregate_target=1500M
    *
    ERROR at line 1:
    ORA-02097: parameter cannot be modified because specified value is invalid
    ORA-56747: invalid value 1572864000 for parameter pga_aggregate_target; must be
    smaller than parameter pga_aggregate_target of the root container

  • Debe ser menor o igual al 50% del valor del parámetro de inicialización PGA_AGGREGATE_LIMIT establecido a nivel CDB.
  • Debe ser menor o igual al 50% del valor PGA_AGGREGATE_LIMIT establecido en el PDB.


PGA_AGGREGATE_LIMIT establece el PGA máximo que el PDB puede usar en cualquier momento.
Las consideraciones a tener en cuenta para setear PGA_AGGREGATE_LIMIT serían las siguientes:

  • Debe ser menor o igual que la configuración para PGA_AGGREGATE_LIMIT en la raíz CDB.
  • Debe ser mayor o igual a dos veces la configuración de PGA_AGGREGATE_TARGET en el PDB.

Como se mencionó anteriormente, ambos parámetros pueden ser configurados a nivel PDB.

A continuación un ejemplo de configuración:

alter session set container=PDB1;
ALTER SYSTEM SET PGA_AGGREGATE_LIMIT = 500M SCOPE = BOTH;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 300M SCOPE = BOTH;




Monitoreo


Existen tres vistas que pueden ayudarnos con el monitoreo del consumo de recursos por partes de una PDB.

  • V$RSRCPDBMETRIC
  • V$RSRCPDBMETRIC_HISTORY
  • DBA_HIST_RSRC_PDB_METRIC 

La primera proporciona estadísticas actualizadas del consumo de recursos por parte de las  PDBs, incluyendo uso CPU, utilización de paralelismo, generación I/O y utilización de memoria. Provee una única fila por PDB y mantiene la muestra del último minuto.

V$RSRCPDBMETRIC_HISTORY  Es una vista con históricos que mantiene los últimos 60 minutos de muestras de la vista V$RSRCPDBMETRIC.

La información histórica podemos accederla utilizando  la vista DBA_HIST_RSRC_PDB_METRIC la cual contiene snapshots de Automatic Workload Repository (AWR) basándose en el periodo de retención configurado.

A continuación podemos ver unos ejemplos de como utilizar estas vistas:

Con la siguiente consulta podemos visualizar información de la última muestra por PDB

select r.con_id,
       p.pdb_name,
       r.begin_time,
       r.end_time,
       r.sga_bytes,
       r.pga_bytes,
       r.buffer_cache_bytes,
       r.shared_pool_bytes
from   v$rsrcpdbmetric r,
       cdb_pdbs p
where  r.con_id = p.con_id
order by p.pdb_name;

    CON_ID PDB_NAME   BEGIN_TIME                 END_TIME                    
---------- ---------- -------------------------- -------------------------- 
         3 PDB12CR2   23-FEB-2018 06:31:42       23-FEB-2018 06:32:42    
              
SGA_BYTES  PGA_BYTES BUFFER_CACHE_BYTES SHARED_POOL_BYTES
---------- --------- ------------------ -----------------
39863368   2001680   16818176           23045192



Con la siguiente consulta podemos ver muestras por PDB de las últimas horas:

SELECT r.con_id,
       p.pdb_name,
       r.begin_time,
       r.end_time,
       r.sga_bytes,
       r.pga_bytes,
       r.buffer_cache_bytes,
       r.shared_pool_bytes
FROM   v$rsrcpdbmetric_history r,
       cdb_pdbs p
WHERE  r.con_id = p.con_id
AND    p.pdb_name = 'PDB1'
ORDER BY r.begin_time;



Estos son los campos relevantes en las consultas anteriores:

  • SGA_BYTES – Uso actual de SGA por PDB
  • BUFFER_CACHE_BYTES – Uso actual de buffer cache por PDB
  • SHARED_POOL_BYTES – Uso actual de la shared pool por PDB
  • PGA_BYTES – Uso actual de PGA por PDB

Podemos también utilizar la siguiente consulta para visualizar información de los snapshots de AWR por PDB:

SELECT r.snap_id,
       r.con_id,
       p.pdb_name,
       r.begin_time,
       r.end_time,
       r.sga_bytes,
       r.pga_bytes,
       r.buffer_cache_bytes,
       r.shared_pool_bytes
FROM   dba_hist_rsrc_pdb_metric r,
       cdb_pdbs p
WHERE  r.con_id = p.con_id
AND    p.pdb_name = 'PDB1'
ORDER BY r.begin_time;




Conclusión


Como vimos, Oracle Database 12c Release 2 incorpora la posibilidad de controlar la manera en que las “Pluggable Database” utilizan la memoria. En 12c Release 1 el uso de memoria solo puede ser configurado a nivel “Container Database”, lo que muchas veces ocasiona que exista una competencia entre las distintas PDBs y que de acuerdo al comportamiento propio de cada base de datos y la interacción en entre ellas, algunas puedan ver afectada en su performance.

La opción de gestionar la memoria de forma granular  a nivel PDB nos brinda la posibilidad de poder configurar y controlar la manera en que es utilizada la memoria total de la instancia y  así anticipar y/o evitar problemas de rendimiento en nuestra  bases de datos.

Los siguientes parámetros pueden ser configurados a nivel PDB:

  • DB_CACHE_SIZE : Tamaño mínimo del buffer cache para la PDB.
  • SHARED_POOL_SIZE : Tamaño mínimo de la share pool para la PDB.
  • PGA_AGGREGATE_LIMIT : Tamaño máximo de la PGA para la PDB.
  • PGA_AGGREGATE_TARGET : Tamaño target de la PGA para la PDB.
  • SGA_MIN_SIZE : Tamaño mínimo de la SGA para la PDB.
  • SGA_TARGET : Tamaño máximo de la SGA para la PDB.


Sebastián D'Alessandro es un Senior DBA con más de 15 años de experiencia real trabajando con tecnología Oracle. Focaliza su actividad principalmente en la administración de base de datos, diseño de soluciones de alta disponibilidad y disaster recovery, análisis de performance, seguridad y virtualización. Actualmente desarrolla su actividad en el área de base de datos de una importante empresa multinacional proveedora de servicios de seguridad. Sebastián, también participa como orador en distintos eventos de tecnología y frecuentemente publica en su blog personal http://sdalessandro.blogspot.com. Puedes seguirlo también en Twitter: https://twitter.com/sebdalessandro

Este artículo ha sido revisado por el equipo de productos Oracle y se encuentra en cumplimiento de las normas y prácticas para el uso de los productos Oracle.