Gestion des sémaphores sous Oracle

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”

  1. Arnaud Presles

    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.