Encontrando consultas que consumen recursos

From PostgreSQL wiki
Jump to navigationJump to search

Ubicar que consultas está ejecutando un proceso apache.

Hace poco estuve asesorando a un cliente que tenia una serie de problemas de rendimiento. Hice cuanto pude con las configuraciones pero lamentablemente una consulta mal escrita puede dar como resultado un pésimo rendimiento sin importar la máquina o las configuraciones...

El gran problema es que era una aplicación web que fue armada como Frankenstein (con partes de diversos proveedores) y lo peor de todo es que las consultas se generan dinámicamente, lo que hace que darle mantenimiento sea un dolor de cabeza... imaginen tratar de obtener que página está ejecutando que consulta en ese ambiente (si alguien sabe de una solución simple se la agradecería).

Lo que he logrado por ahora es determinar que sentencias ejecuta un determinado proceso apache, con eso pude rastrear hasta determinar porque en ciertos momentos el servidor se colgaba (determinar exactamente que pagina enviaba las consultas ya es otro cuento).

Asi que a lo mejor a ustedes también les sirva:

Preparar el log de PostgreSQL para el monitoreo de los procesos apache.

Primero debemos modificar unos parámetros en el postgresql.conf:

log_line_prefix = '%r'

Podemos mantener lo que haya tenido antes el parámetro, solo es necesario añadir el %r. Esto grabará la dirección IP y el puerto de la máquina cliente.

log_statement = all o log_min_duration_statement = un_valor_razonable

Para no llenar demasiado el log con información inútil puede usar 'mod' si usa log_statement o un valor razonable si usa log_min_duration_statement.

Escoger el proceso apache que queremos monitorear.

Para escoger el proceso apache que queremos monitorear podemos usar el siguiente comando (en el servidor de aplicaciones):

ps aux | grep httpd | awk '{print $2, $6}' | sort -­n -­k 2

Este comando nos mostrará una lista ordenada de procesos apache, donde la primera columna es el PID del proceso y la segunda columna es la cantidad de memoria que esta consumiendo (la lista sale ordenada por esta columna de menor a mayor).

Escogeremos un proceso que sostenidamente este ocupando mucha memoria.

Enlazar el proceso apache con una conexión a la base de datos.

Una vez escogido un proceso ejecutamos el siguiente comando (aun en el servidor de aplicaciones):

lsof -­i TCP@$ip_servidor_bbdd | grep $pid_escogido | awk '{print $8}'

Lo cual genera una salida similar a la siguiente (ip_cliente:puerto_cliente­->ip_servidor_bdd:puerto_sevidor_bdd):

webserver.servidorweb.com:55774­>postgresql.servidorpgsql.com:postgres

Usando esos datos podemos buscar en el log de postgres que sentencia SQL fue ejecutada desde esa IP cliente a traves de ese puerto cliente.

grep $ip_cliente $archivo_log | grep $puerto_cliente

NOTA: Al buscar en el archivo de log se debe hacer usando la IP de la máquina cliente y no el nombre en la red.