lunes, 21 de octubre de 2013

El error ORA-27102, use_large_pages y la relacion con SHMALL y SHMMAX en Linux

El otro día me pasaron la configuración de un nuevo servidor, y según esto el SA había hecho todos los pre-requisitos que menciona el manual de instalación de Oracle 11gR2  (11.2.0.3) . Teníamos un poco de prisa y me fié de que lo había hecho correctamente, pero para mi sorpresa cuando trate de subir la base de datos y usando el parámetro use_large_pages='ONLY' me tope con el siguiente error

oracle $ sqlplus

SQL*Plus: Release 11.2.0.3.0 Production on Tue Oct 8 18:07:58 2013

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Enter user-name: /as sysdba
Connected to an idle instance.

SQL> startup nomount pfile='/home/oracle/working/antunez/initBLADB.ora';
ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device
SQL> exit
Disconnected

El error en el trace file era el siguiente:

Large Pages segment allocation succeed, size = 201326592, shmid = 425984, target_node = 129, large page used 96
skgm warning: ENOSPC creating segment of size 0x680000000
fix shm parameters in /etc/system or equivalent

Entonces me puse ahora si a checar que estaba pasando, ya que teníamos 31g de memoria en el servidor y la BD ocupaba nada mas 25, era obvio que si este es un nuevo servidor dedicado y nada estaba siendo utilizado, que había una configuración errónea en los parámetros de memoria del kernel.

Originalmente estos eran mis parámetros de kernel

kernel.shmmax = 68719476736
kernel.shmall = 2097152

Para poder explicar lo que hice, tengo que dar la definición de estos dos parámetros y uno mas:

SHMALL .- Establece, en numero de paginas, la cantidad total de páginas de memoria compartidas que se puede utilizar en todo el sistema.

SHMMAX .- Es el tamaño máximo de un segmento único de memoria compartida en bytes. El parámetro SHMMAX es un parámetro protector que establece el límite superior de la cantidad de memoria compartida que un proceso posiblemente puede solicitar. El valor máximo admitido de SHMMAX en un sistema de 32 bits es 4 GB - 1 byte.

SHMALL es la division de  SHMMAX/TAMAÑO_DE_PAGINA

SHMMNI .- El número máximo de segmentos de memoria compartida en un sistema

Viendo la definición de estos dos parámetros, y el error en el trace file están mal definidos, ya que esta tratando de crear un segmento de tamaño 27917287424 (Convertido de Hexadecimal a Decimal), así que me di a la primer tarea de obtener el valor del tamaño de la pagina

oracle $ getconf PAGE_SIZE
4096

Ahora si que tenia el numero de pagina y el tamaño de segmento que la base de datos estaba tratando de crear, lo único que tenia que hacer es dividir  25568477184/4096 y estos son los nuevos valores que necesitaba poner en mi configuración del kernel

kernel.shmall = 6815744
kernel.shmmax = 27917287424

Una vez que cambie los parámetros como root en /etc/sysctl.conf , aplique los cambios con sysctl -p y listo

root $ vi /etc/sysctl.conf
root $ sysctl -p
...
kernel.shmall = 6815744
kernel.shmmax = 27917287424
kernel.shmmni = 4096
...
vm.nr_hugepages = 12292

Y listo, ahora si pude abrir mi base de datos :)


SQL> startup nomount pfile='/home/oracle/working/antunez/initBLADB.ora';
ORACLE instance started.

Total System Global Area 2.5655E+10 bytes
Fixed Size      2240344 bytes
Variable Size   2818572456 bytes
Database Buffers  2.2750E+10 bytes
Redo Buffers     84033536 bytes
SQL> show parameter large

NAME         TYPE  VALUE
------------------------------------ ----------- ------------------------------
large_pool_size        big integer 0
use_large_pages        string  ONLY

Espero que te sirva estas definiciones y compartelo si te gusta o tambien cualquier opinion es bien recibida.