Una instalación por defecto de PostgreSQL no necesita ninguna configuración especial del sistema operativo Linux donde se ejecuta.
Pero si vamos a utilizar PostgreSQL en sistemas de producción ó con grandes cantidades de datos, tendremos que ajustar ciertos parametros en el fichero de configuración postgresql.conf y estos cambios con gran probabilidad, harán que PostgreSQL deje de funcionar si no se ajustan ciertos parametros del núcleo de Linux.
Existen dos elementos que probablemente necesiten ajustes en el núcleo de vuestro sistema Linux. Estos elementos son usados por PostgreSQL para organizar los recursos compartidos entre procesos PostgreSQL.
Los parámetros del núcleo que se utilizan para configurarlos son:
Los valores recomendados para estos parámetros para uso con PostgreSQL son los siguientes:
El valor de SHMMAX (bytes) no puede ser menor que el valor definido en shared_buffers. PostgreSQL se negará a arrancar si el valor de SHMMAX es muy pequeño.
Si teneis varios clusters de PostgreSQL ejecutandose en la máquina ó otros programas que usen memoria compartida, tendreis que definir un valor de SHMALL lo suficientemente grande para poder ejecutar todos estos programas a la vez.
Pocas veces hay que modificar este valor.
Los casos mas comúnes de usuarios con problemas de arranque de PostgreSQL son:
FATAL: could not create shared memory segment: Invalid argument DETAIL: Failed system call was shmget(key=5440001, size=4011376640, 03600).
FATAL: could not create semaphores: No space left on device DETAIL: Failed system call was semget(5440126, 17, 03600).
Vamos a ver un ejemplo de como ajustar los valores del núcleo cuando cambiamos algunos valores en postgresql.conf. Vamos a cambiar los valores de shared_buffers, max_connections y autovacuum_max_workers:
shared_buffers = 2048MB max_connections = 300 autovacuum_max_workers = 6
Probablemente, si intentamos arrancar PostgreSQL con los valores por defecto del núcleo, fallará el arranque. Vamos a ver que valores tenemos definidos en nuestro sistema:
root@server:~# getconf PAGESIZE 4096 root@server:~# cat /proc/sys/kernel/shmall 2097152 root@server:~# cat /proc/sys/kernel/shmmax 33554432 root@server:~# cat /proc/sys/kernel/shmmni 4096 root@server:~# cat /proc/sys/kernel/sem 250 32000 32 128
A continuación calculamos los valores que vamos a necesitar y actualizamos, si es necesario, el fichero /etc/sysctl.conf con los mismos.
Si comparamos los valores que tenemos definidos por defecto y los que necesitamos para que PostgreSQL funcione, solamente necesitamos alterar SHMMAX, ya que este es el único parametro con un valor definido por debajo del valor que necesitamos.
Para cambiar el valor de este parametro permanentemente tenemos que editar el fichero /etc/sysctl.conf, y añadir la linea:
kernel.shmmax = 2147483648
Para instalar los cambios tenemos que ejecutar el comando
sysctl -p /etc/sysctl.conf
Despues de este cambio deberiais de poder arrancar PostgreSQL sin problemas.
Desde la linea de comandos podeis ver la memoria compartida y los semáforos usados por postgreSQL en vuestro sistema. Aqui teneis un ejemplo de como podeis consultar la memoria compartida y los semáforos usados por postgreSQL
postgres@bserver:~$ ipcs -m ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x0052e2c1 983040 postgres 600 219332608 5 postgres@server:~$ ipcs -mi 983040 Shared memory Segment shmid=983040 uid=1000 gid=1000 cuid=1000 cgid=1000 mode=0600 access_perms=0600 bytes=219332608 lpid=10125 cpid=22498 nattch=5 att_time=Wed Apr 22 10:33:12 2009 det_time=Wed Apr 22 10:33:13 2009 change_time=Wed Apr 15 21:29:27 2009 postgres@server:~$ ipcs -s ------ Semaphore Arrays -------- key semid owner perms nsems 0x0052e2c1 10944512 postgres 600 17 0x0052e2c2 10977281 postgres 600 17 0x0052e2c3 11010050 postgres 600 17 0x0052e2c4 11042819 postgres 600 17 0x0052e2c5 11075588 postgres 600 17 0x0052e2c6 11108357 postgres 600 17 0x0052e2c7 11141126 postgres 600 17 postgres@server:~$ ipcs -si 10944512 Semaphore Array semid=10944512 uid=1000 gid=1000 cuid=1000 cgid=1000 mode=0600, access_perms=0600 nsems = 17 otime = Wed Apr 15 21:29:27 2009 ctime = Wed Apr 15 21:29:27 2009 semnum value ncount zcount pid 0 1 0 0 22498 1 1 0 0 22498 2 1 0 0 22498 3 1 0 0 22498 4 1 0 0 22498 5 1 0 0 22498 6 1 0 0 22498 7 1 0 0 22498 8 1 0 0 22498 9 1 0 0 22498 10 1 0 0 22498 11 1 0 0 22498 12 1 0 0 22498 13 1 0 0 22498 14 1 0 0 22498 15 1 0 0 22498 16 537 0 0 22498
Bueno esto es todo lo que tenia pensado decir sobre los parametros del kernel y PostgreSQL. Para más información pasaros por la sección 17.4. Managing Kernel Resources de la documentación oficial.
Comentarios
Excelente
Vie, 24/04/2009 - 03:05 — AnónimoEstos valores se pueden aplicar en Windows?
Memoria compartida en Windows
Vie, 24/04/2009 - 08:49 — rafaelmaNo, no funciona con Windows. Todo lo que citamos en este artículo solo funciona en Linux, aunque todos los conceptos som los mismos para los diferentes sistemas Unix.
Existe muy poca información sobre el uso de memoria compartida, postgresql y Windows. Lo poco que he encontrado en la red es que se deberian de usar valores bajos de memoria compartida con PostgreSQL cuando se use en Windows, dejando al sistema operativo encargado de administrar los datos en el caché del mismo.
A lo mejor alguien con conocimientos avanzados de Windows puede darnos más información sobre el tema y una explicación de como funciona la memoria compartida en Windows. Más no te puedo decir, la última vez que tuve control sobre Windows fue en la época del Windows 3.1.
En windows hasta 3GB en 32bit.
Sáb, 25/04/2009 - 20:00 — AnónimoRealmente en Windows el tamaño máximo para los shared buffers sería algo inferior a los 2GB para máquinas de 32bits en Windows 2000/2003/2008, posiblemente algo inferior a los 3GB para máquinas de 32 bits con Windows 2000/2003/2008 Advanced Server y arrancando con el parámetro /3GB en el boot.ini y sin esa limitación para máquinas de 64bit.
Si alguien lo puede probar fenomenal. Hace años que abandoné Windows y salvo para SQL Server no lo he vuelto a tocar jamás como servidor de BBDD (ni de nada más).
parametros del kernel
Vie, 05/06/2009 - 21:19 — juliusCree este script para verificar en megabytes el tamaño de su shhmmax
Dejelo en /usr/local/bin
Yo lo cree con el enombre de giveshmmax.sh
#!/bin/sh
echo $((`cat /proc/sys/kernel/shmmax` / 1048576))
Muy buen articulo
Julius
Enviar nuevo comentario