From: | Silvio Quadri <silvioq(at)gmail(dot)com> |
---|---|
To: | p2p p2p <p2pvideo(at)gmail(dot)com> |
Cc: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: High Load Average |
Date: | 2009-02-13 14:35:01 |
Message-ID: | 61dc71dc0902130635m32525b9eg8a7027beaaee7c91@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
El día 13 de febrero de 2009 11:27, p2p p2p <p2pvideo(at)gmail(dot)com> escribió:
>
>
> El 13 de febrero de 2009 12:45, Silvio Quadri <silvioq(at)gmail(dot)com> escribió:
>>
>> El día 12 de febrero de 2009 22:06, p2p p2p <p2pvideo(at)gmail(dot)com> escribió:
>> >
>> >
>> > El 12 de febrero de 2009 20:06, Silvio Quadri <silvioq(at)gmail(dot)com>
>> > escribió:
>> >>
>> >> El día 12 de febrero de 2009 15:40, p2p p2p <p2pvideo(at)gmail(dot)com>
>> >> escribió:
>> >> > Buenas tardes,
>> >> >
>> >> > Tengo una aplicación web que está utilizando PostgreSQL, y en
>> >> > determinados
>> >> > momentos del día cuando hay aproximadamente unos 50 usuarios
>> >> > conectados
>> >> > la
>> >> > cosa va bien, la máquina suele estar con un load average de 3.5
>> >> > aproximadamente, si las consultas que le hacen los usuarios son muy
>> >> > pesadas.
>> >> > El problema es que hay momentos del día
>> >> > en los que la máquina se queda completamente colgada y no se recupera
>> >> > en
>> >> > cuestión de horas.
>> >> >
>> >> > Al principio pensaba que podría ser por el número de conexiones que
>> >> > puede
>> >> > admitir como máximo (max_connections) y le aumenté este valor a 500,
>> >> > y
>> >> > el de
>> >> > shared_buffers a 8MB. Por lo que he podido observar, en los momentos
>> >> > que
>> >> > la
>> >> > máquina se queda colgada es cuando están las 500 conexiones activas.
>> >> > Hay
>> >> > muchísimas consultas que indican que llevan varios minutos en
>> >> > ejecución,
>> >> > algunas otras en estado IDLE, y otras tantas que aparecen repetidas.
>> >> >
>> >> > He estado monitorizando con top, y veo que el load average puede
>> >> > llegar
>> >> > a
>> >> > alcanzar picos de hasta 120. Otro detalle que he observado es que la
>> >> > máquina
>> >> > no hace swap, lo que me hace pensar que no es problema de memoria. La
>> >> > máquina es un servidor con 3 GB de RAM, y la versión de PostgreSQL es
>> >> > la
>> >> > 8.2.
>> >>
>> >> ¿8MB de shared buffers? Es lo mismo que nada.
>> >> ¿500 conexiones web o 500 usuarios?
>> >> Silvio
>> >>
>> >
>> > En la documentación dice que el valor de shared_buffers debe ser igual
>> > al
>> > número de max_conections x 16 KB.
>> >
>> > max_conections x 16 KB = 500 x 16 = 8000
>> >
>> > De ahí que haya puesto 8MB. ¿Qué valor para shared buffers me
>> > recomiendas?
>> >
>>
>> La documentación dice AT LEAST 128 kilobytes and AT LEAST 16 kilobytes
>> times
>>
>> "
>> Sets the amount of memory the database server uses for shared memory
>> buffers. The default is typically 32 megabytes (32MB), but might be
>> less if your kernel settings will not support it (as determined during
>> initdb). This setting must be at least 128 kilobytes and at least 16
>> kilobytes times max_connections. (Non-default values of BLCKSZ change
>> the minimum.) However, settings significantly higher than the minimum
>> are usually needed for good performance. Several tens of megabytes are
>> recommended for production installations. This parameter can only be
>> set at server start.
>> "
>>
>> Ponele 200M para empezar, pero no es el único parámetro que vas a
>> tocar. Otros más avezados que yo te pueden guiar mejor. Vas a tener
>> que tocar un parámetro en el sistema operativo antes de reiniciar.
>>
>> http://www.postgresql.org/docs/8.3/interactive/kernel-resources.html#SYSVIPC
>>
>>
>> > Las 500 conexiones, son conexiones a la BD. Según una tabla que tengo
>> > que me
>> > indica los usuarios que están online, suele estar entre 50 o 60
>> > usuarios.
>>
>> ¿Y las 500 son de Web server? Al principio decías que era una
>> aplicación Web ... Hay algo que está mal en el web server.
>>
>> ¿Identificaste el proceso que "chupa" todo el procesador cuando se cuelga?
>
> Las 500 conexiones son consultas que se hacen desde el Web Server.
> La arquitectura actual es: 1 Balanceador de peticiones web + 4 Frontales Web
> (Apache) + 1 BD PostgreSQL
>
> Los frontales web tienen un load average de 0.x, y la máquina de la BD un
> load average que llega a alcanzar hasta 1XX.
>
> Los procesos que consumen toda la CPU son múltiples procesos de
> "postmaster".
Es posible que tengas una o varias consulta con problemas. Un Join
abierto, o un acceso mal al plan.
Tantas conexiones se te dan porque los usuarios empiezan a hacer F5 o
vuelven a ejecutar la consulta, ya que empiezan a desesperar y el
Apache manda los requerimientos al PostgreSQL sin importarle si el
navegador se cerró o qué paso ...
Más teniendo en cuenta que tenés un shared_buffers tan bajo.
Incrementá ese valor primero. El work_mem también deberías tocarlo,
aunque deberías buscar en el foro mensajes viejos para ver cuál es el
conveniente.
Saludos!
Silvio
From | Date | Subject | |
---|---|---|---|
Next Message | Alvaro Herrera | 2009-02-13 15:03:06 | Re: Mejor metodo para pasar arrays a función pl |
Previous Message | Conrado Blasetti | 2009-02-13 14:32:03 | RE: Error pl : missing FROM-clause entry for table |