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"; } }