Eliminar procesos PostgreSQL y limpiar caché de RAM en Debian

El PostgreSQL, en su base de datos postgres tiene una tabla llamada pg_stat_activity donde guarda el registro de procesos de consultas y operaciones que está realizando el manejador en un determinado momento, existen varios estados de dichos procesos.

Debido a algunos inconvenientes de memoria, me vi obligado a realizar un pequeño script que libera el espacio en RAM y elimina procesos en estado IDLE de la mencionada tabla de PostgreSQL, específicamente los que están en estado <IDLE>. Dejando una tarea programada para que cada cierto tiempo trabaje el script y realice los procesos determinados de depuración.

Se debe tener:

  • python instalado en el sistema operativo
  • psycopg2 instalado o configurado, clase para hacer conexiones a base de datos PostgreSQL mediante python

Se puede crear el script con el lenguaje de programación de preferencia, para estos tipos de tareas generalmente uso bash, en este caso se usé python.

Antes de realizar cualquier cosa, se cambia la contraseña del usuario postgres, como usuario root:

su - postgres

Luego, una vez con sesión postgres se ejecuta:

psql

Se abre la shell de PostgreSQL y se alteran los valores del usuario postgres:

ALTER ROLE postgres WITH PASSWORD 'CLAVEPOSTGRES';

Se cierra la sesión con combinación de teclas: ctrl + d

Configuración del archivo /etc/postgresql/9.1/main/pg_hba.conf como usuario root o con opciones de sudo, dentro de este archivo, se debe cambiar el método de autenticación del usuario postgres que se realiza en la línea parecida a la siguiente:

local   all             postgres        peer

Se cambia el método de peer a md5 quedando de la siguiente forma:

local   all             postgres        md5

Una vez realizado el cambio se reinicia el servicio de PostgreSQL para tomar los cambios, si es en ambientes Linux Debian debería ser con usuario root:

invoke-rc.d postgres restart

Se escribe el script, un archivo tal vez llamado limpiar_ram sería parecido al siguiente:

#!/usr/bin/env python

import os
import psycopg2

try:
    conn = psycopg2.connect("dbname='postgres' user='postgres' password='CLAVEPOSTGRES'")
except:
    print "No hizo conexion"
cur = conn.cursor()
try:
    cur.execute("""SELECT procpid, (SELECT pg_terminate_backend(procpid)) as got_killed FROM pg_stat_activity WHERE current_query LIKE '<IDLE>';""")
    os.system("sync ; echo 3 > /proc/sys/vm/drop_caches")    
except:
    print "No hizo el query"

Posteriormente se copia en un path global del sistema, en ambiente Linux Debian puede ser en /usr/local/bin/, luego se activa la tarea programada, dentro del cron del usuario root:

crontab -e

Se añade al final la línea:

*/15 * * * * /usr/local/bin/limpiar_ram

Finalmente se guarda y se cierra el archivo cron, aquí se ha dejado una tarea programada para que se cumpla cada 15 minutos.

Advertisements

About felixurbina

Humano con todos los defectos y virtudes que vienen de fábrica.
This entry was posted in Debian, Linux, PostgreSQL, Python. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s