Implement Instance Caging

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 -> Managing Multiple Database Instances on a Single Server

2. En la versión 11gR2 Oracle introdujo la funcionalidad de Instance Caging. Cuando tienes varias BD en una misma máquina con varias CPUs puede limitar la utilización de dichos procesoradores en cada instancia para garantizar el correcto aprovisionamiento de recursos. El mecanismo para hacerlo consiste en configurar el parámetro CPU_COUNT indicando el número de procesadores que se pueden usar.

Hay dos aproximaciones a la hora de configurar Instance Caging. Puedes configurar CPU_COUNT entre todas las instancias de tal forma que la suma sea mayor al número real de procesadores. A esto se le llama sobredimensionamiento (Over-provisioning) y la carga de una instancia puede afectar el rendimiento de las otras cuando hay picos de trabajo. La segunda aproximación es el particionamiento, en el que la suma de CPU_COUNT de las instancias no supera el número de CPUs de la maáquina. De esta forma la actividad de una instancia no afecta a la demás en el uso de los procesadores.

Para configurar «Instance Caging» tenemos que hacer dos cosas:

1. Habilitar el Resource Manager asignando un plan.
2. Definir el parámetro CPU_COUNT. Este parámetro es dinámico y se puede cambiar con ALTER SYSTEM .. SCOPE=MEMORY.

Hay que tener en cuenta que cuando tenemos activado el Resource Manager, los recursos de CPU se dividen de forma aproximada y propocional para que la carga no supere el límite impuesto por CPU_COUNT.

3. En el ejercicio de «Administer Resource Manager» ya definimos varios Resource Plan. De hecho, tenemos toda la franja horaria de 24h cubierta o bien por el plan DAYLIGHT_PLAN o NIGHT_PLAN. Por lo que sólo necesitamos modificar el parámetro CPU_COUNT para realizar nuestra prueba.

-- Validamos que tenemos activo alguno de los Resource Plan
-- En función de la hora tendremos activo DAYLIGHT_PLAN o NIGHT_PLAN
SHOW PARAMETER RESOURCE_MANAGER_PLAN

-- Revisamos el valor actual de CPU_COUNT
SHOW PARAMETER CPUT_COUNT

-- Modificamos el límite
-- En mi caso, he aumentado el número de CPU de mi máquina virtual a 4, por lo que aparece CPU_COUNT=4
ALTER SYSTEM SET CPU_COUNT=2 SCOPE=MEMORY;

4. Podemos ver que se limita la CPU haciendo la siguiente prueba. Vamos a lanzar tres sesiones con el siguiento código durante unos minutos.

-- Ejecutamos el siguiente código para forzar el uso de CPU en la máquina
-- Primero creamos una tabla para las pruebas
CREATE TABLE KILL_CPU(N PRIMARY KEY)
ORGANIZATION INDEX AS
  SELECT ROWNUM FROM ALL_OBJECTS WHERE ROWNUM <= 50; -- Lo ejecutamos de forma paralela en tres sesiones durante un minuto ALTER SESSION SET "_old_connect_by_enabled"=true; SELECT COUNT(*) X    FROM KILL_CPU    CONNECT BY N > PRIOR N
  START WITH N = 1;
-- Cancelamos la ejecución de las tres sesiones CTRL-C

Podemos ver como se limita el uso de CPU en OEM si vamos a la pestaña de Performance. El area de color verde (CPU) no pasa de dos unidades ya que hemos puesto el límite de 2 CPUS. También vemos en color verde claro (Scheduler) un evento que representa al Resource Manager limitando la CPU de la máquina (resmgr:cpu quantum)

Instance Caging OEM

-- También podemos ver el tiempo que se ha limitado la CPU en la vista V$RSRC_CONSUMER_GROUP (columna CPU_WAIT_TIME)
SELECT NAME, CONSUMED_CPU_TIME, CPU_WAIT_TIME
FROM V$RSRC_CONSUMER_GROUP;

-- Dejamos el límite que teníamos antes
ALTER SYSTEM SET CPU_COUNT=4 SCOPE=MEMORY;