Semaphores.sh
| Fiche express | |
|---|---|
| Type | Script shell (préparation noyau Linux pour Oracle 11gR2) |
| Voir aussi | Serveur oracle · Tuning Oracle 10g |
Script shell qui calcule automatiquement les paramètres noyau recommandés par Oracle (mémoire partagée, sémaphores) en fonction de la RAM physique de la machine, puis les ajoute à /etc/sysctl.conf et les applique.
Fonctionnement
Le script détecte la RAM installée, l'arrondit à la valeur standard la plus proche (2, 4, 8, 16, 32 ou 64 Go), puis calcule :
- kernel.shmmax = RAM en octets / 2 (taille max d'un segment de mémoire partagée)
- kernel.shmall = RAM en octets / taille de page (nombre max de pages de mémoire partagée)
#!/bin/bash
PAGESIZE=$(getconf PAGESIZE)
RAM=$(free -m | grep Mem | awk '{print $2}')
if [[ $RAM -ge 2000 ]] && [[ ${RAM} -le 3000 ]] ; then
RAM=2048
elif [[ $RAM -ge 3000 ]] && [[ ${RAM} -le 4000 ]] ; then
RAM=4096
elif [[ $RAM -ge 8000 ]] && [[ ${RAM} -le 9000 ]] ; then
RAM=8192
elif [[ $RAM -ge 16000 ]] && [[ ${RAM} -le 17000 ]] ; then
RAM=16384
elif [[ $RAM -ge 31000 ]] && [[ ${RAM} -le 34444 ]] ; then
RAM=32768
elif [[ $RAM -ge 63000 ]] && [[ ${RAM} -le 65000 ]] ; then
RAM=65536
fi
echo "RAM : $RAM"
echo "PAGE SIZE : $PAGESIZE"
# calcul des variables :
SHMMAX=$(echo $RAM*1024*1024 /2 | bc -l | cut -d'.' -f 1)
SHMALL=$(echo $RAM*1024*1024 /$PAGESIZE | bc -l | cut -d'.' -f 1)
cat >> /etc/sysctl.conf <<EOF
# +---------------------------------------------------------+
# | KERNEL PARAMETERS FOR ORACLE DATABASE 11g R2 ON LINUX |
# +---------------------------------------------------------+
# +---------------------------------------------------------+
# | SHARED MEMORY |
# +---------------------------------------------------------+
kernel.shmmax = $SHMMAX
kernel.shmall = $SHMALL
kernel.shmmni = $PAGESIZE
# +---------------------------------------------------------+
# | SEMAPHORES |
# +---------------------------------------------------------+
# SEMMSL_value SEMMNS_value SEMOPM_value SEMMNI_value
kernel.sem = 250 32000 100 128
# +---------------------------------------------------------+
# | NETWORKING |
# +---------------------------------------------------------+
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
# +---------------------------------------------------------+
# | FILE HANDLES |
# +---------------------------------------------------------+
fs.file-max = 6815744
fs.aio-max-nr = 1048576
EOF
sysctl -p
Bug corrigé : la source historique de ce script utilisait un opérateur & simple (ET binaire) au lieu de && (ET logique) dans la deuxième condition elif — sur bash cela déclenche l'exécution en arrière-plan de la première expression au lieu d'un test combiné. Corrigé ci-dessus.
Signification des paramètres
- kernel.shmmax : taille maximale (en octets) d'un segment de mémoire partagée unique —
doit être au moins égal à la taille de la SGA visée.
- kernel.shmall : quantité totale de mémoire partagée (en pages) utilisable sur le
système.
- kernel.shmmni : nombre maximum de segments de mémoire partagée système — la valeur du
script (égale à PAGESIZE) est à vérifier, la documentation Oracle recommande généralement une valeur fixe (4096) plutôt que la taille de page.
- kernel.sem = SEMMSL SEMMNS SEMOPM SEMMNI : nombre max de sémaphores par jeu (250),
nombre total de sémaphores système (32000), nombre d'opérations par appel semop (100), nombre max de jeux de sémaphores (128).
Ces valeurs sont celles recommandées historiquement pour Oracle Database 11g R2 sur Linux ; à ajuster/valider pour les versions plus récentes (12c+), voir Serveur oracle et Tuning Oracle 10g pour les prérequis complémentaires (limites utilisateur, paquets, huge pages).
Voir aussi
- Serveur oracle — checklist complète de préparation d'un serveur Oracle
- Tuning Oracle 10g — guide historique équivalent pour Oracle 10g / RHEL 5
- SGA — dimensionnement de la mémoire partagée côté base