jueves, 19 de mayo de 2011

Error ORA-27102 en Solaris 10 cuando si tenemos memoria en el Servidor

Error ORA-27102 en Solaris 10 cuando si tenemos memoria en el Servidor Solaris 10 tiene una funcionalidad de manejar recursos para el usuario, y existen varias comandos para administrarlos, como projadd,projmod, projdel, etc. Esto es importante saber por que, que pasa cuando sabemos que en el servidor si tenemos memoria libre pero cuando tratas de levantar la instancia te encuentras con el siguiente error


DBATEST >startup
ORA-27102: out of memory
SVR4 Error: 22: Invalid argument

Lo primero es asegurarnos que el servidor si tenga la memoria suficiente para poder levantar la instancia, con el comando top, podemos ver esta informacion:


root $ top
load averages: 0.70, 0.71, 0.73; up 39+18:13:12 23:19:17
442 processes: 430 sleeping, 11 stopped, 1 on cpu
CPU states: 99.4% idle, 0.1% user, 0.4% kernel, 0.0% iowait, 0.0% swap
Memory: 32G phys mem, 8024M free mem, 36G total swap, 36G free swap

Como podemos ver, tenemos un poco menos de 8g de memoria libre en nuestro servidor, pero no podemos levantar una instancia con una configuracion de 2g memoria. Lo primero que tenemos que hacer es detectar el id al proyecto que el usuario oracle pertenece


root $ id -p
uid=1001(oracle) gid=110(dba) projid=100(user.oracle)

Una vez que logramos identificar el proyecto al que pertenece nuestro usuario, vamos a verificar los recursos que esta utilizando


root $ prstat -J
.
.
.
PROJID NPROC SWAP RSS MEMORY TIME CPU PROJECT
100 251 14G 13G 42% 37:45:26 0.1% user.oracle

Como podemos ver arriba, el usuario oracle esta usando 13g de la memoria del servidor, ahora vamos a verificar cuanto tiene asignado el proyecto


root $ prctl -n project.max-shm-memory -i project 100
project: 100: user.oracle
NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT
project.max-shm-memory
privileged 14.0GB - deny -
system 16.0EB max deny -

Ahora que verificamos que el proyecto al que esta asignado nuestro usuario esta restringido hasta los 14g, vamos a incrementarlo para poder levantar la instancia


root $ prctl -n project.max-shm-memory -r -v 16G -i project 100

Volevemos a checar la memoria asignada a nuestro proyecto, y ahora vemos que tenemos un maximo de 16g


root $ prctl -n project.max-shm-memory -i project 100

project: 100: user.oracle
NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT
project.max-shm-memory
privileged 16.0GB - deny -
system 16.0EB max deny -

Y ahora ya podemos levantar la instancia


DBATEST >startup
ORACLE instance started.

Total System Global Area 2088402944 bytes
Fixed Size 2159904 bytes
Variable Size 1375734496 bytes
Database Buffers 570425344 bytes
Redo Buffers 140083200 bytes

Conclusion
Espero que esta entrada te ayude a comprender el resource manager de Solaris y que te ayude cuando te enfrentes a este tipo de situaciones.