Por Francisco Riccio
Publicado en marzo 2012
Introducción
Instace Caging es una característica que Oracle Database 11g Release 2 nos ofrece y nos da la posibilidad de limitar el número de cores que serán utilizadas por una instancia en un servidor.
Su implementación solo está disponible en una edición Enterprise Edition.
Implementación
Paso 1: Determinar la cantidad de cores disponibles en el servidor.
select value from v$osstat where stat_name = 'NUM_CPUS';
Paso 2: Configurar Resource Manager en cada instancia de Base de Datos en los que se desea configurar Instance Caging. En mi escenario utilizaré el plan DEFAULT_PLAN ya creado por default en un base de datos Oracle.
Debemos recordar que el plan DEFAULT_PLAN tiene las siguientes directivas:
Paso 3: Configurar el parámetro CPU_COUNT de cada instancia a la cantidad de cores que deseamos que se utilicen del servidor.
Aquí podemos tener dos diferentes escenarios
a) Partitioning approach: En está configuración la suma del valor del parámetro CPU_COUNT en todas las instancias no llega a ser un valor superior a la cantidad de cores que tiene asignado el servidor. La ventaja de esta configuración es que cada instancia tiene sus cores reservados de forma independiente y en caso una instancia estuviera demandando altos consumos de CPU no interfiere con los cores asignados de las otras instancias. La desventaja es que si una instancia está en IDLE estaríamos desaprovechando el uso de los asignados cores. Este tipo de configuración es ideal para ambientes productivos.
b) Over-provisioning approach: En está configuración la suma del valor del parámetro CPU_COUNT en todas las instancias llegan a ser un valor superior a la cantidad total de cores que tiene asignado el servidor. Si en caso todas las instancias necesitaran el uso del 100% de los cores asignados mediante el parámetro CPU_COUNT, cada una de ellas estarían compitiendo por el uso de cores del servidor al no estar asignados de forma independiente. Este tipo de configuración es ideal para ambientes de desarrollo donde normalmente no todas las instancias requieren usar al 100% los recursos de CPU asignados al mismo tiempo.
Paso 4: Validación
a) Validaremos el uso de Instance Caging:
select instance_caging from v$rsrc_plan where is_top_plan = 'TRUE';
Debe devolver el valor de ON.
b) Monitorearemos el uso de cores mediante Instance Caging:
select to_char(begin_time, 'HH24:MI') time, sum(avg_running_sessions) avg_running_sessions, sum(avg_waiting_sessions) avg_waiting_sessions from v$rsrcmgrmetric_history group by begin_time order by begin_time;
El campo avg_running_sessions es el promedio de sesiones por minuto utilizando cores, si su valor es mucho menor que el valor del parámetro CPU_COUNT significa que la instancia no está utilizando al 100% los cores asignados y podemos reducirlo.
El campo avg_waiting_sessions es el promedio de sesiones por minuto esperando por el uso de cores libres, si su valor es mayor a 0 podemos mejorar la performance incrementando el valor del parámetro CPU_COUNT.
Nota 1: CPU_COUNT es un parámetro dinámico por lo cual se puede cambiar en cualquier momento y su efecto toma en pocos segundos. Cabe mencionar que Oracle no recomienda el cambio de un valor muy bajo a un valor muy alto para el parámetro CPU_COUNT y asimismo no recomienda configurar con el valor de 1.
Nota 2: Instance Caging no influye en las reglas de licenciamiento con que cuenta el servidor.
Nota 3: Instance Caging y Resource Manager tienen algunos parches recomendados para evitar bugs reportados, por lo cual recomiendo la revisión de las siguientes documentaciones:
a) My Oracle Support (MOS) Nota: 1208064.1 (Recommended Patches for Instance Caging).
b) My Oracle Support (MOS) Nota: 1208133.1 (Recommended Patches for Managing Runaway Queries with Resource Manager).
c) My Oracle Support (MOS) Nota: 1339803.1 (Recommended Patches for CPU Resource Manager).
Escenario de validación
Un servidor que cuenta con 4 cores tiene una instancia de base de datos Oracle el cual tiene asignado los 4 cores.
Se ejecuta mediante 4 sesiones el siguiente código PLSQL:
set serveroutput on declare n number:=0; begin for i in 1..1000000000 loop n:=n+i; if (i mod 1000 = 0) then dbms_output.put_line(i); end if; end loop; end; /
Viendo algunas métricas del sistema operativo se puede apreciar lo siguiente:
Donde prácticamente el equipo está saturado por consumo de CPU. El comando vmstat muestra que el equipo tiene 100% de utilización de CPU y 0% de idle time.
Se puede apreciar a continuación que prácticamente no hay sesiones esperando por utilización de CPU.
Al cambiar el parámetro CPU_COUNT de 4 cores a 2 cores podemos ver las siguientes métricas.
La saturación de CPU se redujo a la mitad, se puede apreciar que el CPU está en un 50% de consumo y lo mismo en idle time.
Se puede apreciar también que ya existen sesiones de base de datos en promedio que están esperando por consumo de CPU al disminuir la cantidad de cores asignadas a la instancia.
Conclusión
En un servidor donde se alojan más de una instancia de base de datos Oracle podemos aprovechar la funcionalidad de Instance Caging para limitar el consumo de CPU que utilizará cada instancia de modo que cada instancia en un momento de carga no ocasione un overhead sobre las otras y así mantener una performance adecuada.
Publicado por Ing. Francisco Riccio. Es un IT Specialist en IBM Perú e instructor de cursos oficiales de certificación Oracle. Está reconocido por Oracle como un Oracle ACE y certificado en productos de Oracle Application & Base de Datos.