2011-12-02 50 views
14

Después de ejecutar durante varias horas en Linux, mi programa Python 2.6 que usa urllib2, httplib y subprocesos, comienza a generar este error para cada solicitud:'Falla temporal permanente en la resolución de nombres' después de ejecutarse durante varias horas

<class 'urllib2.URLError'> URLError(gaierror(-3, 'Temporary failure in name resolution'),)

Si reinicio el programa, vuelve a funcionar. Mi suposición es algún tipo de agotamiento de recursos, pero no sé cómo buscarlo. ¿Cómo diagnostico y arreglo el problema?

+2

¿Está cerrando anterior HTTPRequests (o lo que sea que estés usando)? –

+0

tratando de. Me acabo de dar cuenta de que tengo una gran cantidad de conexiones CLOSE_WAIT que deben estar relacionadas con el problema. – 2371

Respuesta

12

Esto se debe a que una biblioteca no cerró las conexiones, lo que provocó un gran número de conexiones bloqueadas en un estado CLOSE_WAIT. Eventualmente, esto causa el error 'Fallo temporal en la resolución del nombre' debido al agotamiento de los recursos.

+12

¿Cuándo se solucionó exactamente este problema? Supongo que ese error fue causado por la biblioteca httplib? – pkaleta

+10

Secundado, por favor brinde más detalles sobre sus hallazgos, ¡gracias! –

+8

@ 2371: ¿Cómo descubrió que se debe al agotamiento de los recursos? – rajpy

0

Estaba experimentando el mismo problema, en mi caso no era agotamiento de recursos, el problema para mí ocurrió cuando mi servidor dhcp cambió la dirección del servidor de nombres, libc no quiso jugar a la pelota y recargar el nuevo archivo resolv.conf, manteniendo el en caché uno y me obliga a reiniciar el script cada vez que cambió.

Todos mis conexiones de socket pitón intentos fallan después de esto, así que encontraron this code que resolvió la situación:

import ctypes 
try: 
    libc = ctypes.CDLL('libc.so.6') 
    res_init = getattr(libc, '__res_init') 
    res_init(None) 
except: 
    pass 

usarlo antes de llamar a la Socket.connect, espero que esta ayuda

Cuestiones relacionadas