domingo, 2 de octubre de 2016

Ejemplo con DBRM - Database Resource Manager


    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

Acá un ejemplo de como implementar DBRM
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;
/