Gestion des ressources avec Oracle Resource Manager

La performance des bases de données Oracle est dépendante de la gestion optimale des ressources du serveur de données. Un serveur de données avec 8 core de CPU et ayant en moyenne entre 17 et 24 processus dans sa file d’attente d’exécution sera en perpétuelle surcharge.

Oracle Resource Manager a été introduit depuis la version Oracle 8i et disponible en Oracle EE peut permettre de stabiliser la consommation CPU sur le serveur de données. L’exemple ci-dessous permet l’utilisation d’Oracle Resource Manager pour la répartition de la charge CPU entre les processus de type BATCH et OLTP. Sa configuration se fera en fonction du compte de connexion à la base.

Suivre les étapes ci-dessous pour configurer Oracle Resource Manager :

1/ Privilège Oracle pour administrer Resource Manager

Si l’administration de Resource Manager doit se faire par un utilisateur autre que sys, il faut attribuer le privilège ADMINISTER_RESOURCE_MANAGER à l’utilisateur.

exec dbms_resource_manager_privs.grant_system_privilege(grantee_name => 'JAE', ADMIN_OPTION => TRUE);

2/ Création de Pending Area

Le Pending Area est une zone de travail temporaire pour le Resource Manager.

exec dbms_resource_manager.create_pending_area();

A tout moment on peut abandonner les modifications par la commande suivante :

exec dbms_resource_manager.clear_pending_area();

3/ Création de Consumer Groups (Groupe de consommateurs)

Avant de créer son propre groupe de consommateurs, il faut vérifier que les groupes de consommateurs prédéfinis par défaut ne peuvent pas être utilisés.
2 groupes seront créés BATCH et OLTP.

exec dbms_resource_manager.create_consumer_group( CONSUMER_GROUP => 'BATCH', COMMENT => 'Groupe utilisateurs pour traitement Batch');
exec dbms_resource_manager.create_consumer_group( CONSUMER_GROUP => 'OLTP', COMMENT => 'Groupe utilisateurs pour traitement Oltp');

4/ Attribution des utilisateurs aux différents groupes de consommateurs

Ici, les catégories d’utilisateurs sont affectées aux groupes : BATCH_USER => BATCH et OLTP_USER => OLTP.

exec dbms_resource_manager.set_consumer_group_mapping(attribute => dbms_resource_manager.oracle_user, value => 'BATCH_USER', consumer_group => 'BATCH');=>
exec dbms_resource_manager.set_consumer_group_mapping(attribute => dbms_resource_manager.oracle_user, value => 'OLTP_USER', consumer_group => 'OLTP');

5/ Création du Resource Plan

exec dbms_resource_manager.create_plan( PLAN => 'PLAN_TEST', COMMENT => 'Plan for oltp and batch users');

6/ Création de la Plan Directive

La Resource Plan Directive permet de définir le pourcentage d’utilisation de la CPU par groupe de consommateur.

exec dbms_resource_manager.create_plan_directive( PLAN => 'PLAN_TEST',  GROUP_OR_SUBPLAN => 'BATCH', COMMENT => 'PCT CPU Pour Groupe Batch', mgmt_p1 => 50);
exec dbms_resource_manager.create_plan_directive( PLAN => 'PLAN_TEST',  GROUP_OR_SUBPLAN => 'OLTP', COMMENT => 'PCT CPU Pour Groupe Oltp', mgmt_p1 => 30);=>
exec dbms_resource_manager.create_plan_directive( PLAN => 'PLAN_TEST',  GROUP_OR_SUBPLAN => 'OTHER_GROUPS', COMMENT => 'PCT CPU Pour les autres', mgmt_p1 => 20);

Dans l’exemple ci-dessus, on attribut : 50% CPU => processus Batch, 20% CPU => Oltp, 20% CPU => autres utilisateurs. Le groupe de consommateur prédéfini OTHER_GROUPS doit obligatoirement être inclus dans la Plan Directive.

7/ Validation du plan

dbms_resource_manager.submit_pending_area();

8/ Attribution des droits de changement de groupe

Ces droits permettent aux utilisateurs de changer de groupe.

exec dbms_resource_manager_privs.grant_switch_consumer_group( grantee_name => 'BATCH_USER', consumer_group => 'BATCH', grant_option => FALSE) ;
exec dbms_resource_manager_privs.grant_switch_consumer_group( grantee_name => 'OLTP_USER', consumer_group => 'OLTP', grant_option => FALSE) ;

9/ Activation du plan

Pour finir on active le plan.

alter system set resource_manager_plan = 'PLAN_TEST' scope=both sid='*' ;

10/ Vérification

Permet de valider que chaque utilisateur appartient bien à un groupe de consommateurs lors de sa connexion à la base.

select SCHEMANAME, RESOURCE_CONSUMER_GROUP from v$session where SCHEMANAME like '%USER%' ;
SCHEMANAME                     RESOURCE_CONSUMER_GROUP
------------------------------ --------------------------------
OLTP_USER                      OLTP
BATCH_USER                     BATCH