viernes, 22 de junio de 2007

Oracle 10g y Linux: memoria compartida

Para conocer las limitaciones de memoria que tenemos podemos usar lo siguiente:
# ipcs -lm

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 1048576
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1

TAMAÑO MAXIMO DE SEGMENTO
Como podemos ver el tamaño máximo de un segmento de memoria compartida en el ejemplo es de 1G. El parámetro que controla esto es el SHMMAX
SHMMAX = cat /proc/sys/kernel/shmmax

Hay que procurar que el tamaño del SGA de oracle coincida con un segmento de memoria.Asi que hay que podificar el SHMMAX para adaptarlo al SGA. Si el SHMMAX es menor que el SGA, se crearán varios segmentos de memoria compartida lo que podría repercutir negativamente sobre las prestaciones de oracle.

Para cambiarlo:

1) sysctl -w kernel.shmmax=2147483648 . Cambia de forma temporal, y sin reiniciar la máquina del parámetro.

2) echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf . Modificamos el archivo de arranque de sistema para modificar el parámetro en cada arranque. O bien modificamos el archivo sysctl.conf con un editor de texto.

El valor de shmmax recomendado es la el de la mitad de la memoria física disponible.

TAMAÑO TOTAL DE LA MEMORIA COMPARTIDA
En linux la maxima cantidad de memoria compartida (Shared Memory) que puede ser usada viene determinada por :
Máxima Cantidad de memoria compartida = shmall * pagesize
donde
pagesize = getconf PAGE_SIZE
shmall = cat /proc/sys/kernel/shmall

shmall debe ser al menos = ceil(SHMMAX/PAGE_SIZE) , redondeo arriba. Para cambiar el parámetro se hace con los mismos comandos que SHMMAX.