viernes, 27 de abril de 2012

Más conexiones en tu PostgreSQL

Bueno, este artículo es un clásico, pero no podía faltar aquí.
El tema es así, resulta que tenemos un máximo de conexiones en PostgreSQL de 100, ni una más, ni una menos.
Y como siempre pasa, llegamos al límite.
Entonces, intentamos incrementarlo de una forma muy sencilla, cambiando el parámetro "max_connections" en el archivo postgresql.conf.
Pero es entonces, cuando ejecutamos el comando "service postgresql-9.1 restart" que vemos que un mensaje del estilo de "Failed" aparece.
Verificamos nuestro archivo de startup de postgres ("pgstartup.log"), y nos encontramos con esto: 

FATAL:  could not create shared memory segment: Invalid argument
DETAIL:  Failed system call was shmget(key=5432001, size=39223296, 03600).
HINT:  This error usually means that PostgreSQL's request for a shared memory
segment exceeded your kernel's SHMMAX parameter.  You can either reduce the re
quest size or reconfigure the kernel with larger SHMMAX.  To reduce the request
size (currently 39223296 bytes), reduce PostgreSQL's shared memory usage,
perhaps by reducing shared_buffers or max_connections.
        If the request size is already small, it's possible that it is less
than your kernel's SHMMIN parameter, in which case raising the request size or
reconfiguring SHMMIN is called for.
        The PostgreSQL documentation contains more information about shared
memory configuration.


Eso quiere decir que, antes de cambiar el valor de "max_connections", tenemos que aumentar el valor del parámetro de kernel "shmmax".
Para ver este valor podemos ejecutar el siguiente comando:

[root@server ~]# ipcs -lm

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


El valor que tendremos que incrementar es el identificado con "max seg size (kbytes)". Está en 32 MB, y lo subiremos para que soporte cuatro veces lo que ahora tenemos.



Para saber el valor en bytes tenemos dos opciones: usar la calculadora, o ejecutar el siguiente comando:

[root@server ~]# cat /proc/sys/kernel/shmmax
33554432

Entonces, sencillamente multiplicamos este valor por cuatro (134217728), y agregamos una línea como la siguiente en el archivo /etc/sysctl.conf:

kernel.shmmax = 134217728

Ahora si ya teníamos el valor de "max_connections" en 400, podremos rebootear nuestro sistema, y ver cómo la base de datos funciona sin problemas, mostrándonos su capacidad de soportar hasta 400 conexiones.

Listo, todo funcionando! Hasta la próxima!