El día 13 de febrero de 2009 11:27, p2p p2p <[email protected]> escribió: > > > El 13 de febrero de 2009 12:45, Silvio Quadri <[email protected]> escribió: >> >> El día 12 de febrero de 2009 22:06, p2p p2p <[email protected]> escribió: >> > >> > >> > El 12 de febrero de 2009 20:06, Silvio Quadri <[email protected]> >> > escribió: >> >> >> >> El día 12 de febrero de 2009 15:40, p2p p2p <[email protected]> >> >> 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 -- TIP 4: No hagas 'kill -9' a postmaster
