Semaphores.sh

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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