cgroups et Oracle Database 12c

En version 12c, la base de données Oracle peut s’intégrer au sous-système « cpuset » des groupes de contrôle Linux (aka les cgroups). Cela permet de contrôler les processeurs utilisés dans des environnements mutualisés et ainsi d’éviter qu’une instance n’empiète sur les resources d’une autre instance[1].

Comparée à l' »Instance Caging » d’Oracle 11.2, cette approche a plusieurs intérêts. Grace aux paramètres cpuset des cgroups, il est possible d’assurer qu’aucun autre processus ne viendra utiliser des ressources dédiées à une instance. Il est également possible sur les systèmes NUMA de faire de l’affinité entre processeurs et mémoire. Pour l’ensemble des paramètres liés aux cpuset, reportez-vous à la section correspondante de la documentation d’Oracle Linux 6.

Cet article présente comment mettre en place cette intégration entre Oracle et Linux…

Installer les Cgroups sur Linux

Les cgroups sont omniprésents dans Linux pour contrôler les ressources, pour les comptabiliser (CPUACCT) ou pour certaines fonctionnalités avancées comme les containers LXC.

Installer cette fonctionnalité consiste à installer les RPM libcgroup et libcgroup-pam[2] sur Redhat et Oracle Linux :

yum install libcgroup libcgroup-pam

Une fois les RPM installés, démarrez les services associés à l’aide de la commande ci-dessous :

service cgconfig start
chkconfig cgconfig on

Enfin si vous voulez pouvoir configurer des règles au niveau des utilisateurs connectés, ajoutez le PAM associé dans le fichier /etc/pam.d/su ; rajoutez la ligne ci-dessous dans le fichier:

session optional pam_cgroup.so

Configurer et tester les Cgroups

Oracle utilise uniquement les paramètres CPUSET des cgourps. Créez un cgroup blackdb pour ces paramètres à l’aide des commandes cgclear, cgcreate et cgset comme ci-dessous :

cgclear
cgcreate -t oracle:dba -a oracle:dba -g cpuset:blackdb
cgset -r cpuset.cpus=0 blackdb
cgset -r cpuset.mems=0 blackdb

Note:
Les paramètres cpuset.cpus et cpuset.mems sont obligatoires ; ils définissent les threads ainsi que les zones mémoires utilisables. 

Une fois le cgroup créé, vous pouvez visualiser son contenu dans /cgroup/cpuset, enregistrez le dans /etc/cgconfig.conf à l’aide de la commande cgsnapshot

cgsnapshot -f /etc/cgconfig.conf

Pour tester le fonctionnement du cgroup, lancez un processus dans ce cgroup à l’aide de la commande cgexec comme ci-dessous :

cgexec -g cpuset:/blackdb top

Vous pourrez contrôler avec ps que la commande est dans le cgroup correspondant :

ps -eo command,pid,%cpu,stat,cgroup 
|sed -e 's/blkio:/;//g'
|sed -e 's/net_cls:/;//g'
|sed -e 's/freezer:/;//g'
|sed -e 's/devices:/;//g'
|sed -e 's/memory:/;//g'
|sed -e 's/cpuacct:/;//g'
|sed -e 's/cpu:/;//g'
|grep -e [t]op -e [C]GROUP

COMMAND PID %CPU STAT CGROUP
top 3961 0.7 S+ cpuset:/blackdb

Paramétrer Oracle 12c pour s’intégrer au CGroup

Pour utiliser le Cgroup dans l’instance, il suffit de positionner le paramètre processor_group_name comme ci-dessous ; attention il s’agit d’un paramètre statique et l’instance doit être redémarrée :

alter system set PROCESSOR_GROUP_NAME='blackdb' scope=spfile;

Par ailleurs, vous devrez également activez le broker de l’instance pour que les sessions/processus soient démarrées par l’instance et plus par le listener. Pour cela positionnez le paramètre use_dedicated_broker au niveau de l’instance :

alter system set use_dedicated_broker=true;

Enfin modifiez le listener pour qu’il s’appuie sur ce broker en ajoutant la ligne suivante dans le fichier listener.ora :

dedicated_through_broker_LISTENER=ON

Note:
Remplacez LISTENER par le nom de votre listener. 

Votre base de données est paramétrée. Vous pouvez la redémarrer et tester que les connexions entre dans le CGROUP que vous avez créé comme l’ensemble des processus de l’instance ; connectez-vous via le réseau à l’aide de SQL*Plus :

ps -eo command,pid,%cpu,stat,cgroup 
|sed -e 's/blkio:/;//g'
|sed -e 's/net_cls:/;//g'
|sed -e 's/freezer:/;//g'
|sed -e 's/devices:/;//g'
|sed -e 's/memory:/;//g'
|sed -e 's/cpuacct:/;//g'
|sed -e 's/cpu:/;//g'
|grep -e [C]GROUP -e oracle[B]LACK

COMMAND PID %CPU STAT CGROUP
oracleBLACK 4625 0.1 Ss cpuset:/blackdb

[1] Ce mécanisme, comme l’instance caging, n’est pas considéré comme du hard partitioning et ne permet pas de réduire les licences nécessaire pour un système. Il permet simplement de faciliter la mutualisation des instances sur un autre système.
[2] Le package libcgroup-pam n’est pas disponible sur le DVD de la distribution Oracle Linux 6.4. Vous pouvez simplement le télécharger sur le site d’update d’Oracle Linux.