Está en la página 1de 3

[ cybercanibal@guaicaipuro-server:~$ ] - El Refugio del Canibal

Tunning Postgres
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. Se puede mejorar el rendimiento de PostgreSQL atacando desde dos frentes: - Hardware: configurando y optimizando los recursos hardware de que va a disponer el servidor, como por ejemplo la memoria. - Software: utilizando tcnicas basadas en software como el uso de ndices, optimizacin de consultas, vacuuming, etc. Es muy importante comenzar por ajustar el hardware para, una vez optimizado, olvidarnos de l y poner todas nuestras luces en la afinacin sotfware. En este artculo pretendo explicar de manera sencilla cmo se puede pasar de un rendimiento del 0% al 100% modificando tan slo un par de parmetros de su fichero de configuracin ( postgresql.conf). Me he basado en el excelente documento de Bruce Momjian, PostgreSQL Hardware Performance Tunning, para escribir esta pequea gua prctica. La intencin es la de ayudar al lector en este proceso. Va dirigido a cualquier persona que ya ha instalado PostgreSQL en su sistema GNU/Linux y ahora se dispone a extraer toda la potencia de este magnfico RDBMS. El enfoque utilizado es eminentemente prctico: seguiremos todos los pasos para hacer un ajuste real. Asumiremos que disponemos de un servidor PostgreSQL 8.x, 1 GB de RAM y un mximo de 100 conexiones a la BD. 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. Memoria RAM y paginacin Antes de comenzar, es preciso recordar aunque sea de forma somera, el papel de la memoria RAM en un ordenador, as como los efectos indeseados de la paginacin. 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: - Cuntos shared_buffers puedo asignar? - Cmo s cual es el tamao de un segmento? - Qu puedo hacer si se supera el tamao mximo del segmento? Vamos a resolver todas estas cuestiones de forma prctica, as que coge una taza de caf y sintate frente a tu servidor. El proceso consiste en los siguientes pasos:
http://www.cybercanibal.com Potenciado por Joomla! Generado: 9 February, 2009, 08:20

[ cybercanibal@guaicaipuro-server:~$ ] - El Refugio del Canibal

- Considerar un nmero superior al actual de shared buffers (comenzaremos por un 10% del total de la memoria) - Modificar el tamao del segmento si no cabe el nmero de buffers - Comprobar el rendimiento y paginacin - En funcin del resultado obtenido, aumentar o disminuir el porcentaje de memoria y empezar de nuevo Una buena recomendacin (lee el artculo de B. Momjian) es la de empezar asignando un 10% del total de la memoria RAM para shared_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 o ipcs (consulta sus pginas man). Comenzamos: El 10% de 1 GB: (1048576 KB/10) = 104857 KB shared_buffers: (104857 KB/8 KB) = 13107 Asignamos este valor a la variable shared_buffers (postgresql.conf) y reiniciamos el servidor. Qu ocurre? Lo peor. Ahora… ni siquiera arranca!. Bueno, no te pegues un tiro todava y mira el log (generalmente postgresql.log): FATAL: no se pudo crear el segmento de memoria compartida: Argumento invlido DETALLE: La llamada a sistema fallida fue shmget(key=5432001, size=112009216, 03600). HINT: Este error generalmente significa que una peticin de PostgreSQL para obtener un segmento de memoria compartida excedi el parmetro SHMMAX del kernel. Puede reducir el tamao de la peticin o reconfigurar el kernel con un SHMMAX superior. Para reducir el tamao de la peticin (actualmente 112009216 bytes), reduzca el parmetro de PostgreSQL shared_buffers (actualmente 13107) y/o el parmetro max_connections (actualmente 100). Si el tamao de la peticin ya es pequeo, es posible que sea inferior al parmetro SHMMIN del kernel, en cuyo caso se requiere alzar el tamao de la peticin o disminuir SHMMIN. La documentacin de PostgreSQL contiene ms informacin acerca de la configuracin de memoria compartida. 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. En Linux, de forma predeterminada, el tamao de un segmento de memoria compartida es de 32MB. Podemos comprobarlo haciendo (el resultado es en n de bytes): $ cat /proc/sys/kernel/shmmax $ 33554432 Y el espacio que requiere el nmero de buffers, es superior al tamao del segmento: 13107 buffers ocupan 107372544 bytes (13107 * 8192 bytes/bloque) 107372544 > 33554432 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. Podemos cambiar fcilmente el valor usando el programa sysctl: # sysctl -w kernel.shmmax=112009216 Alternativamente, si tu S.O. no dispone de ese programa, puedes usar la forma clsica: # echo 111766938 > /proc/sys/kernel/shmmax # echo 111766938 > /proc/sys/kernel/shmall 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.
http://www.cybercanibal.com Potenciado por Joomla! Generado: 9 February, 2009, 08:20

[ cybercanibal@guaicaipuro-server:~$ ] - El Refugio del Canibal

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. En nuestro ejemplo, hemos optado por usar un 4% de la memoria: El 4% de 1 GB: 41943 KB (1048576 KB*4)/100 work_men = 41943 Referencias - PostgreSQL Hardware Performance Tunning - http://www.ca.postgresql.org/docs/momjian/hw_performance/ - Managing Kernel Resources - http://developer.postgresql.org/docs/postgres/kernel-resources.html - Lista de correo pgsql-es-ayuda - http://archives.postgresql.org/pgsql-es-ayuda/2005-11/msg00563.php - Tomado de: http://www.juancarlosmoral.es/index.php/postgresql-hardware-tunning/

http://www.cybercanibal.com

Potenciado por Joomla!

Generado: 9 February, 2009, 08:20