2010-08-19 12 views
7

A veces, al obtener los datos de la base de datos, ya sea a través de la cáscara de pitón o mediante un script en Python, el proceso pitón muere, y una sola palabra se imprime en el terminal: Killed¿Por qué algunas consultas ORM de Django finalizan abruptamente con el mensaje "Asesinado"?

Eso es, literalmente, todo lo que dice. Solo ocurre con ciertos scripts, pero siempre ocurre con esos scripts. Ocurre constantemente con esta única consulta que tarda un tiempo en ejecutarse, y también con una migración hacia el sur que agrega un montón de filas, una por una, a la base de datos.

Mi intuición inicial era que una sola transacción tardaba demasiado, así que entré en autocommit para Postgres. No resolvió el problema

comprobado que los registros de Postgres, y esto es lo único que hay en:

2010-08-19 22:06:34 UTC LOG: could not receive data from client: Connection reset by peer

2010-08-19 22:06:34 UTC LOG: unexpected EOF on client connection

He intentado googlear, pero como era de esperar, un error de una sola palabra el mensaje es difícil de buscar en google

Estoy usando Django 1.2 con Postgres 8.4 en una sola nube de Rackspace de Ubuntu 10.4 VPS, config stock para todo.

+3

Sólo hay una cosa que podría pensar en que va a matar de forma automática un proceso en Linux -.. el asesino OOM. ¿Qué hay en los registros del sistema? –

+0

'19 de agosto 21:38:53 kernel db: [782904.033075] python invocado oom-killer: gfp_mask = 0x200da, order = 0, oom_adj = 0' ¡Tienes razón! Gracias :) – Zain

Respuesta

6

Solo una cosa que podría pensar que matará automáticamente un proceso en Linux: el asesino de OOM. ¿Qué hay en los registros del sistema?

+1

En aras de la exhaustividad, en los servidores Debian y Ubuntu ese es el archivo '/ var/log/syslog'. –

0

Si se usa psycopg, es probable que la conexión de db no esté cerrada.

De acuerdo con el ejemplo psycopg docs:

# Connect to an existing database 
>>> conn = psycopg2.connect("dbname=test user=postgres") 
# Open a cursor to perform database operations 
>>> cur = conn.cursor() 
# Close communication with the database 
>>> cur.close() 
>>> conn.close() 

Tenga en cuenta que si lo hace eliminar la conexión (usando dbcon.close() o borrando el objeto de conexión es probable que tenga que emitir un commit o rollback, dependiendo de qué tipo de operación tipo conexión funciona bajo

Ver the close connection docs para más detalles

Cuestiones relacionadas