Alternative à la consolidation Oracle : Control Group

Il existe une alternative aux solutions de consolidation initialement proposées par Oracle telles que le regroupement de schémas, la virtualisation OVM ou la base multitenant Oracle 12c, cette alternative offerte par Linux Redhat 6 est le gestionnaire de ressources Control Group.

En effet, cette solution permet d’isoler et d’attribuer des ressources processeurs, mémoire et bande passante aussi bien disque que réseau à différentes bases de données Oracle hébergées sur un même serveur.

En revanche, le calcul des licences Oracle s’effectue toujours sur le nombre total des cœurs déployés dans le serveur.

(Exemple)
Base de données rouge    : 4 cpus 72 Go RAM
Base de données orange  : 2 cpus 12 Go RAM
Base de données jaune    : 3 cpus 72 Go RAM
Base de données verte: 1 cpu   3 Go RAM

Configuration des groupes de contrôle

Afin de garantir l’étanchéité et l’isolation de l’utilisation des ressources ‘système’ par les applications, le mécanisme RHEL Control Group a été mis en œuvre pour réserver la CPU et la mémoire à chaque instance Oracle. Il s’agit d’un partitionnement logique du serveur en allouant des ressources CPU et mémoire à chacune des bases de données.

Step 1: Vérification du package libcgroup

Pour utiliser Group Control, il faut vérifier avant tout l’existence du package libcgroup

# yum list libcgroup
Loaded plugins: refresh-packagekit
Installed Packages
libcgroup.x86_64 0.37-2.el6 @anaconda-OracleLinuxServer-201105261616.x86_64/6.1

Le cas échéant, installer ce package

yum install libcgroup

Step 2: Création de l’arborescence du groupe de contrôle et de son sous-système

Deux méthodes existent pour créer une arborescence ;
La première méthode consiste à créer un point de montage puis d’attacher les sous-systèmes appropriés avec la commande mount :

# mkdir /cgroup/dboracle
# mount -t cgroup -o cpu,cpuset,memory - /cgroup/dboracle

La deuxième méthode pour créer l’arborescence est de lancer le service cgconfig qui lit le fichier de configuration /etc/cgconfig.conf. Le fichier devrait détenir les entrées suivantes pour le montage de l’arborescence :

mount {
   cpuset  = /cgroup/dboracle;
   cpu     = /cgroup/dboracle;
   memory  = /cgroup/dboracle;
}

Redémarrer le service cgconfig qui lit le fichier de configuration et crée l’arborescence /cgroup/dboracle :

# service cgconfig restart

Le montage a pour effet de remplir l’arborescence avec les paramètres ayant pour nom les sous-systèmes.

# ls /cgroup/dboracle
cgroup.procs                     memory.failcnt
cpu.rt_period_us                 memory.force_empty
cpu.rt_runtime_us                memory.limit_in_bytes
cpuset.cpu_exclusive             memory.max_usage_in_bytes
cpuset.cpus                      memory.memsw.failcnt
cpuset.mem_exclusive             memory.memsw.limit_in_bytes
cpuset.mem_hardwall              memory.memsw.max_usage_in_bytes
cpuset.memory_migrate            memory.memsw.usage_in_bytes
cpuset.memory_pressure           memory.soft_limit_in_bytes
cpuset.memory_pressure_enabled   memory.stat
cpuset.memory_spread_page        memory.swappiness
cpuset.memory_spread_slab        memory.usage_in_bytes
cpuset.mems                      memory.use_hierarchy
cpuset.sched_load_balance        notify_on_release
cpuset.sched_relax_domain_level  release_agent
cpu.shares                       tasks

Le fichier tasks conserve la trace des processus qui sont associés au groupe de contrôle et sont régis par la définition des paramètres.

Step 3: Création des groupes de contrôle  (cgcreate)

La commande cgcreate permet de créer les groupes dbrouge et dborange :

# cgcreate -t oracle:dba -a root:root -g cpuset:/dbrouge
# cgcreate -t oracle:dba -a root:root -g cpuset:/dborange

L’option -t <uid:gid> spécifie l’utilisateur et le groupe autorisés à assigner des tâches au groupe de contrôle et l’option -a <uid:gid>  désigne ceux qui sont autorisés à administrer le groupe de contrôle et modifier les paramètres des sous-systèmes.

cgcreate -t <uid:gid> -a <uid:gid> -g <subsystems:cgroup-path>

Step 4: Initialiser les paramètres du sous-système pour le groupe de contrôle (cgset)

La commande cgset permet d’initialiser les paramètres CPU et mémoire pour les groupes dbrouge et dborange :

# cgset -r cpuset.cpus='0,2,1,3' dbrouge
# cgset -r cpuset.cpus='4,6' dborange
# cgset -r cpuset.mems='0-1' dbrouge
# cgset -r cpuset.mems='0-1' dborange
#   cgset -r memory.limit_in_bytes=77309411328 dbrouge
#   cgset -r memory.limit_in_bytes=12884901888 dborange

A noter que les paramètres cpuset.cpus et cpuset.mems sont obligatoires lorsque le sous-système cpuset est utilisé dans la définition du groupe de contrôle. Tous les paramètres des sous-systèmes du noyau kernel sont documentés dans le Resource Management Guide.

Step 5 : Assignation d’un processus à un groupe de contrôle

Il y a plusieurs façons d’assigner un processus à un groupe de contrôle.
La commande cgclassify associe un processus existant à un groupe de contrôle :

# cgclassify -g cpuset:dbrouge 1683

Cette commande est équivalente à mettre le PID 1683 dans le fichier tasks :

# echo 1683 > /cgroup/dboracle/dbrouge/tasks

Les processus fils héritent du même groupe de contrôle que leur processus parent.
Autre alternative, la commande cgexec qui peut lancer un processus dans un groupe de contrôle spécifique :

# cgexec -g cpuset:dbrouge /u01/app/oracle/product/11.2.0.4/db_1/bin/sqlplus

A partir de la release 11.2.0.4 le paramètre de l’instance Oracle processor_group_name permet d’associer une instance à un groupe de contrôle dès son démarrage ce qui évite l’utilisation de la commande cgexec pour établir la relation entre l’instance et le groupe de contrôle.

SQLPLUS> alter system set processor_group_name=’dbrouge’ scope=spfile;

Capture des paramètres

Une fois que la création des groupes de contrôle ainsi que la définition des paramètres des sous-systèmes sont faites, la capture du fichier de configuration peut être envisagée avec la commande cgsnapshot :

# cgsnapshot -s > cgconfig-example.conf

Affichage à l’écran de la commande cgsnapshot

# Configuration file generated by cgsnapshot
mount {
        cpuset = /cgroup/dboracle;
        cpu = /cgroup/dboracle;
        memory = /cgroup/dboracle;
}
group dborange {
perm {
task {
uid = oracle;
gid = dba;
}
admin {
uid = root;
gid = root;
}
}
        cpuset {
               cpuset.memory_spread_slab="0";
               cpuset.memory_spread_page="0";
               cpuset.memory_migrate="0";
               cpuset.sched_relax_domain_level="-1";
               cpuset.sched_load_balance="1";
               cpuset.mem_hardwall="0";
               cpuset.mem_exclusive="0";
               cpuset.cpu_exclusive="0";
               cpuset.mems="1";
               cpuset.cpus="4,6";
        }
        cpu {
               cpu.rt_period_us="1000000";
               cpu.rt_runtime_us="0";
        }
        memory {
               memory.memsw.failcnt="0";
               memory.memsw.limit_in_bytes="9223372036854775807";
               memory.memsw.max_usage_in_bytes="0";
               memory.swappiness="60";
               memory.use_hierarchy="0";
               memory.failcnt="0";
               memory.soft_limit_in_bytes="9223372036854775807";
               memory.limit_in_bytes="12884901888";
               memory.max_usage_in_bytes="0";
        }
}
group dbrouge {
perm {
task {
uid = oracle;
gid = dba;
}
admin {
uid = root;
gid = root;
}
}
        cpuset {
               cpuset.memory_spread_slab="0";
               cpuset.memory_spread_page="0";
               cpuset.memory_migrate="0";
               cpuset.sched_relax_domain_level="-1";
               cpuset.sched_load_balance="1";
               cpuset.mem_hardwall="0";
               cpuset.mem_exclusive="0";
               cpuset.cpu_exclusive="0";
               cpuset.mems="0";
               cpuset.cpus="0,2,1,3";
        }
        cpu {
               cpu.rt_period_us="1000000";
               cpu.rt_runtime_us="0";
        }
        memory {
               memory.memsw.failcnt="0";
               memory.memsw.limit_in_bytes="9223372036854775807";
               memory.memsw.max_usage_in_bytes="7303168";
               memory.swappiness="60";
               memory.use_hierarchy="0";
               memory.failcnt="0";
               memory.soft_limit_in_bytes="9223372036854775807";
               memory.limit_in_bytes="77309411328";
               memory.max_usage_in_bytes="7303168";
        }
}

Référence

http://www.oracle.com/technetwork/articles/servers-storage-admin/resource-controllers-linux-1506602.html

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *