La distribución de los
recursos no es nueva dentro de una base de datos Oracle, donde existe la
posibilidad de distribuir recursos de CPU por medio de DataBase Resource
Manager.
En Exadata tenemos también IORM que hablare en otro post
Se crea un Grupo Consumidor. Se crean las Directivas. Una con utilización del 10%, otra 50%, otra 10% y para otros 10% de utilización de recursos
****************************************
IMPLEMENTANDO RESOURCE MANAGER
****************************************
Limpiar los cambios de las areas pendientes:
exec dbms_resource_manager.clear_pending_area();
Las areas pendientes son creadas:
exec dbms_resource_manager.create_pending_area();
Se crean los Consumer Group
exec dbms_resource_manager.create_consumer_group( 'USUARIO_SQL_GROUP', 'Sessions Usuarios SQL');
exec dbms_resource_manager.create_consumer_group( 'USUARIO_PROCESO_GROUP', 'Sessions Usuarios Proceso');
exec dbms_resource_manager.create_consumer_group( 'USUARIO_SANDB_GROUP', 'Sessions Usuarios Sandb');
Asignar usuarios aun Consumer Group
exec DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING (DBMS_RESOURCE_MANAGER.ORACLE_USER, 'SCOTT', 'USUARIO_SQL_GROUP');
exec DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING (DBMS_RESOURCE_MANAGER.ORACLE_USER, 'HR', 'USUARIO_PROCESO_GROUP');
Crear un nuevo resource plan, usando los siguientes PL/SQL.
exec dbms_resource_manager.create_plan( 'DB_ODS_PLAN','Plan for database ODS');
Se crean las Directivas. Una con utilizacion del 10%, otra 50%, otra 10% y para otros 10% de utilización de rescursos
exec dbms_resource_manager.create_plan_directive( 'DB_ODS_PLAN', 'USUARIO_SQL_GROUP', 'Percentage of CPU for APP_1: Usuarios', mgmt_p1 => 10, max_utilization_limit => 40);
exec dbms_resource_manager.create_plan_directive( 'DB_ODS_PLAN', 'USUARIO_PROCESO_GROUP', 'Percentage of CPU for APP_2: Procesos', mgmt_p1 => 50, max_utilization_limit => 100);
exec dbms_resource_manager.create_plan_directive( 'DB_ODS_PLAN', 'USUARIO_SANDB_GROUP', 'Percentage of CPU for APP_3: Sandb', mgmt_p1 => 30, max_utilization_limit => 50);
exec dbms_resource_manager.create_plan_directive( 'DB_ODS_PLAN', 'OTHER_GROUPS', 'Percentage of CPU for OTROS', mgmt_p1 => 10, max_utilization_limit => 100);
Se Valida el Plan y luego se Crea
exec DBMS_RESOURCE_MANAGER.VALIDATE_PENDING_AREA();
exec DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA();
Finalmente Se asigna el Plan a la Base de Datos:
alter system set resource_manager_plan = 'DB_ODS_PLAN' sid='*';
También puedes limitar la cantidad de CPU asignados a la instancia.
Se denomina Instance Caging en 11gR2
alter system set cpu_count=16 sid='*';
****************************************
CONSULTANDO RESOURCE MANAGER
****************************************
Ver todos los resource plans existentes:
SELECT plan, comments, status FROM dba_rsrc_plans;
Revisar los actuales active plans:
SELECT name, is_top_plan FROM v$rsrc_plan;
Consumer groups asignados a usuarios o roles:
SELECT * FROM dba_rsrc_consumer_group_privs;
Actuales consumer groups para sesiones:
set linesize 1000
SELECT sid, serial#, username, resource_consumer_group FROM v$session;
*********************************************************************
Script para generar Carga y probar la utilización de recursos *****
*********************************************************************
Generar Carga:
DECLARE
sqrtval NUMBER := 0;
BEGIN
FOR idx1 IN 1..1000000
LOOP
FOR idx2 IN 1..1000000
LOOP
SELECT (SQRT(idx2/idx1)) INTO sqrtval FROM DUAL;
END LOOP;
END LOOP;
END;
/