Définition des sémaphores
Les sémaphores peuvent être décrits comme des compteurs utilisés pour assurer la synchronisation entre processus (ou threads au sein d’un processus) pour des ressources partagées.
Les sémaphores sont gérés par ensembles (sets), chacun étant un sémaphore de comptage. Ainsi, lorsqu’une application demande des sémaphores, le noyau les publie par groupes. Le nombre de sémaphores par ensembles est géré par plusieurs paramètres.
SEMMSL : nombre maximal de sémaphores par set
Oracle recommande que SEMMSL soit au moins égal à 250 pour les bases de données 9i R2 et 10g R1 / R2 (à l’exception de 9i R2 sur les plates-formes x86 où la valeur minimale est inférieure). Ces recommandations étant des minima, il est préférable de toujours définir au moins 250 pour les bases de données 9i et 10g sur les plates-formes x86 et x86-64.
cf. notes Oracle 187405.1 et Note: 184821.1 à propos de SEMMSL : « Le paramètre SEMMSL doit être égal à 10 plus le paramètre PROCESSES le plus important de toute base de données Oracle sur le système ».
Même si ces notes parlent de bases de données 9i, cette règle SEMMSL s’applique également aux bases de données 10g.
SEMMNI : nombre maximal de sémaphores sets
Ce paramètre définit le nombre maximal pour l’ensemble du système Linux.
Oracle recommande que SEMMNI soit d’au moins 128 pour les bases de données 9i R2 et 12c (à l’exception de 9i R2 sur les plates-formes x86 où la valeur minimale est inférieure).
SEMMNS : nombre maximal de sémaphores
Ce paramètre définit le nombre maximal pour l’ensemble du système Linux, et non pas par set.
Vous vous en doutez : indiquer des valeurs supérieures à SEMMSL * SEMMNI rendent ce paramètre non pertinent. Le nombre maximal de sémaphores pouvant être alloués sur un système Linux sera le minimum entre « SEMMNS » et « SEMMSL * SEMMNI ».
Oracle recommande que SEMMSL soit d’au moins 32 000 pour les bases de données 9i R2 à 12c (à l’exception de 9i R2 sur les plates-formes x86 où la valeur minimale est inférieure).
Définir SEMMNS sur 32000 permet d’utiliser les sémaphores SEMMSL * SEMMNI = 250 * 128 = 32000.
Par conséquent, il est recommandé de définir SEMMNS sur 32 000 minimum pour les bases de données sur les plates-formes x86 et x86-64.
SEMOPM : nombre maximal d’opérations sémaphores par appel système
Oracle recommande de définir SEMOPM sur une valeur minimale de 100 pour les bases de données 9i R2 à 12c sur les plates-formes x86 et x86-64.
Paramétrage des sémaphores
Cf. note Oracle 2243692.1.
Lire les paramètres actuels
Les 2 commandes suivantes permettent de lire les valeurs des paramètres de sémaphores actuels.
[root@Serveur ~]# /sbin/sysctl -a | grep sem kernel.sem = 250 32000 100 256 kernel.sem_next_id = -1 [root@Serveur ~]# cat /proc/sys/kernel/sem 250 32000 100 256
Ces valeurs représentent, dans l’ordre, SEMMSL, SEMMNS, SEMOPM et SEMMNI.
Le nombre maximum de sémaphores pouvant être créés est donc le minimum entre min(250 * 256 , 32000), soit min (64000, 32000), soit 32000 sémaphores.
Dans cet exemple, les paramètres SEMMSL, SEMMNS et SEMMNI ne sont donc pas à priori en adéquation les uns avec les autres.
La commande « ipcs » suivante vous permet également de récupérer les valeurs des paramètres :
[root@Serveur ~]# ipcs -ls ------ Semaphore Limits -------- max number of arrays = 256 max semaphores per array = 250 max semaphores system wide = 32000 max ops per semop call = 100 semaphore max value = 32767
On notera le dernier paramètre ci-dessous indiquant qu’on ne pourra en aucun cas excéder 32767 sémaphores, quels que soient les autres paramètres SEMMSL, SEMMNS et SEMMNI spécifiés.
Modifier les paramètres
Cf. note Oracle 242529.1.
La modification des paramètres peut se faire via l’une des 2 commandes suivantes :
echo 250 32000 100 128> /proc/sys/kernel/sem sysctl -w kernel.sem = "250 32000 100 128"
ATTENTION :
Les paramètres des sémaphores peuvent être modifiés dynamiquement, en mémoire. Cependant, ils seront réinitialisés au prochain redémarrage si vous n’y prenez pas garde.
Pour rendre la modification permanente, ajoutez ou modifiez la ligne suivante dans le fichier /etc/sysctl.conf.
echo "kernel.sem = 250 32000 100 128" >> /etc/sysctl.conf
Ce fichier est utilisé pendant le processus de démarrage.
1 réflexion sur “Gestion des sémaphores sous Oracle”
Merci Jean-yves cela m’a été bien utile
aprés la modification du sysctl.conf
un sysctl -p relit la nouvelle configuration
Les commentaires sont fermés.