PostgreSQL Personalizado
PostgreSQL Personalizado
PostgreSQL Personalizado
Introduccin
Creo que muchas de las personas que utilizan PostgreSQL, ya sea a nivel particular o en proyectos de
explotacin, desconocen que este formidable servidor parte inicialmente de una configuracin tan
mnima que resulta inadecuada en la mayora de los casos. Esto se hace para asegurar que el servidor
arrancar casi con cualquier configuracin hardware, aunque, por supuesto, no es vlida para
gestionar tus bases de datos de manera eficiente.
1.
2.
Agradecimiento:
Agradezco a los miembros de la lista plpgsql-es-ayuda y en especial a lvaro Herrera, la ayuda recibida
en la revisin y actualizacin de este artculo.
Podemos imaginarnos la memoria RAM como un recurso limitado divido en rodajas o segmentos. Los
segmentos, de un tamao fijo, se agrupan formando pginas de memoria. En la memoria se guarda
todo lo que la CPU necesita para hacer su trabajo, esto incluye programas, datos requeridos por los
programas, el kernel, y por supuesto, las zonas de trabajo de postgres.
Para optimizar el uso del espacio disponible en la memoria, las pginas que hace algn tiempo no se
utilizaron son expulsadas por el S.O. al disco, a una zona denominada swap (intercambio). Esta
actividad se denomina swap pageout y no supone un inconveniente, ya que se produce en periodos de
inactividad de la CPU.
Lo malo viene cuando hay que recuperar una pgina desde la swap (que recientemente haba sido
expulsada de la memoria), porque el programa que la requiere tendr que esperar hasta que se
encuentre de nuevo all. Este efecto adverso, que crece a medida que hay ms pginas que se tienen
que traer de la swap, se conoce con el nombre swap pagein o paginacin.
El reto de nuestra afinacin va a consistir en optimizar el uso de memoria para postgres, minimizando
en lo posible el nmero de intercambios con la swap (pagein). El mejor ajuste de los parmetros de
configuracin ser aqul que obtenga la mxima disponibilidad en memoria para la BD, sin perjudicar
al resto de elementos, que tambin deben permanecer en memoria.
SHARED_BUFFERS
El nmero de shared_buffers es el parmetro que ms afecta al rendimiento de PostgreSQL. Este valor,
de tipo entero, indica el nmero de bloques de memoria o buffers de 8KB (8192 bytes) que postgres
reservar, como zona de trabajo, en el momento del arranque para procesar las consultas. De forma
predeterminada (en postgresql.conf), su valor es de 1000. Un nmero claramente insuficiente para
conseguir un rendimiento mnimamente aceptable.
Estos buffers se ubican dentro de los denominados segmentos de memoria compartida. Es importante
saber que el espacio ocupado por el nmero de buffers que pretendamos asignar, nunca podr
exceder al tamao mximo que tengan los segmentos de memoria. En caso contrario, postgres se
negar a arrancar avisando con un error que no puede reservar el espacio solicitado.
Llegados a este punto, te preguntars:
1.
2.
3.
4.
Una buena recomendacin (lee el artculo de B. Momjian) es la de empezar asignando un 10% del total
de la memoria RAM parashared_buffers y a partir de ah, ir aumentando o disminuyendo dicho
porcentaje en funcin del rendimiento y la paginacin.
Para comprobar el rendimiento, aplica EXPLAIN a tus consultas. Para ver la paginacin del servidor,
puedes usar herramientas como vmstat oipcs (consulta sus pginas man).
Comenzamos:
El 10% de 1 GB: (1048576 KB/10) = 104857 KB
shared_buffers: (104857 KB/8 KB) = 13107
03600).
HINT:
un SHMMAX superior.
Est claro, no?. El tamao ocupado por los 13107 buffers que has pedido reservar, simplemente no
caben en el tamao actual de segmento (SHMMAX). Postgres en el arranque intenta reservar este
espacio, pero al no poder hacerlo, desiste. Qu podemos hacer?, sigue leyendo.
La solucin est en modificar el tamao mximo del segmento de memoria compartida. Esto lo
hacemos asignando un nuevo valor al parmetro del kernel SHMMAX. Qu valor? Si volvemos atrs, al
mensaje de error, avisa exactamente de cual es el tamao mnimo que postgres necesita para
arrancar. El tamao de SHMMAX debe ser, como mnimo, ese valor.
NOTA:
En la documentacin de la versin 7.4, se ofreca una frmula para calcular un valor razonable del
parmetro SHMMAX en funcin del n de buffers, de las conexiones concurrentes y de varias
constantes. Esta frmula ya no se utiliza en la versin 8.x.
Nota:
Puede guardar este valor de forma permanente en /etc/sysctl.conf, de forma que los cambios se
conserven entre arranques: kernel.shmmax=111766938
Reinicia postgres. Funcion esta vez?. Bien!. Haz nuevas pruebas de rendimiento y sigue con el
algoritmo.
NOTA:
El resto de parmetros del kernel de Linux, como por ejemplo SHMALL, estn generosamente
dimensionados con sus valores default y normalmente no requieren cambios. Si, de todos modos,
quieres modificar el tamao mximo de la memoria compartida (SHMALL), debes tener en cuenta que
hay que expresarlo en nmero de pginas (y no de bytes), usando la siguiente
frmula: ceil(SHMMAX/PAGE_SIZE) El tamao de pgina (PAGE_SIZE) para Linux 2.4 y 2.6, es de 4KB.
WORK_MEM
Este parmetro configura el espacio de memoria que postgres utiliza para realizar ordenaciones de
tablas o de resultados parciales de consultas, sobre todo en clusulas ORDER BY, CREATE INDEX o
MERGE JOIN.
Este valor es ms dificil de configurar porque depende, por un lado, de lo grande que sean las tablas o
resultados que hay que ordenar, y por otro, del nmero de peticiones simultneas para esa misma
consulta (para cada una se emplear la misma cantidad de memoria).
Una buen comienzo es asignar entre un 2% y un 4% del total de la memoria si prevemos pocos
accesos simultneos a grandes sesiones de ordenacin y mucho menor, si esperamos muchos accesos
simultneos a sesiones de ordenacin pequeas. Como antes, lo mejor es ir probando distintos valores
y ver en qu pueden afectar a la paginacin adversa (swap pagein). El valor hay que expresarlo en KB.
Referencias
(1048576 KB*4)/100