Kernel parameters 11gR2

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Script shell
Contexte Prérequis noyau Oracle Database 11g R2
Voir aussi Sysctl.conf · Database tunning

Script shell qui calcule automatiquement, en fonction de la RAM détectée sur la machine, les valeurs de mémoire partagée à positionner dans `/etc/sysctl.conf` pour une installation Oracle Database 11g R2 — évite de reprendre à la main les calculs `SHMMAX`/`SHMALL` documentés dans le guide d'installation Oracle. Voir aussi Sysctl.conf pour le détail statique de ces paramètres.

Script

⚠️ Bug corrigé par rapport à la source : la condition `elif [[ $RAM -ge 3000 ]] & [[ ${RAM} -le 4000 ]]` utilisait un simple `&` (exécution en tâche de fond du test précédent) au lieu de `&&` (ET logique) — sans quoi cette branche ne fonctionne pas comme attendu.

#!/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                                           |
# +---------------------------------------------------------+

# Maximum size (in bytes) for a shared memory segment
kernel.shmmax = $SHMMAX

# Maximum amount of shared memory (in pages) that
# can be used at one time on the system and should be at
# least ceil(SHMMAX/PAGE_SIZE)
kernel.shmall = $SHMALL

# Maximum number of shared memory segments system wide
kernel.shmmni = $PAGESIZE

# +---------------------------------------------------------+
# | SEMAPHORES                                              |
# +---------------------------------------------------------+

# SEMMSL_value  SEMMNS_value  SEMOPM_value  SEMMNI_value
kernel.sem = 250 32000 100 128

# +---------------------------------------------------------+
# | NETWORKING                                              |
# +---------------------------------------------------------+

# Defines the local port range that is used by TCP and UDP
# traffic to choose the local port
net.ipv4.ip_local_port_range = 9000 65500

# Default setting in bytes of the socket "receive" buffer which
# may be set by using the SO_RCVBUF socket option
net.core.rmem_default = 262144

# Maximum setting in bytes of the socket "receive" buffer which
# may be set by using the SO_RCVBUF socket option
net.core.rmem_max = 4194304

# Default setting in bytes of the socket "send" buffer which
# may be set by using the SO_SNDBUF socket option
net.core.wmem_default = 262144

# Maximum setting in bytes of the socket "send" buffer which
# may be set by using the SO_SNDBUF socket option
net.core.wmem_max = 1048576

# +---------------------------------------------------------+
# | FILE HANDLES                                            |
# +---------------------------------------------------------+

# Maximum number of file-handles that the Linux kernel will allocate
fs.file-max = 6815744

# Maximum number of allowable concurrent asynchronous I/O requests
fs.aio-max-nr = 1048576

# +---------------------------------------------------------+
# | AUTRES TUNING OPTIONNELS                                |
# +---------------------------------------------------------+
# Tuning Page Cache
#vm.min_free_kbytes = 1024
#vm.swappiness = 10
#vm.dirty_background_ratio = 3
#vm.dirty_ratio = 15
#vm.dirty_expire_centisecs = 500
#vm.dirty_writeback_centisecs = 100

EOF

sysctl -p

⚠️ Le script suppose une RAM proche de paliers ronds (2, 4, 8, 16, 32, 64 Go) : une machine avec une quantité de RAM intermédiaire (par exemple 6 Go) ne correspond à aucune des conditions et ressort avec la valeur `$RAM` brute (en Mo) utilisée telle quelle dans les calculs — à fiabiliser si le script est repris.

Voir aussi