2011-02-12 15 views
5

Tengo que realizar un gran trabajo de fragmentación: la mayor parte del tiempo del script se usa bloqueando debido a una gran cantidad de latencia de red. Estoy tratando de multihilo la secuencia de comandos para que pueda realizar varias solicitudes al mismo tiempo, pero aproximadamente el 10% de mis hilos morir con el siguiente errorSolicitudes web de subprocesos múltiples en python: 'Nombre o servicio no conocido'

URLError: <urlopen error [Errno -2] Name or service not known> 

El otro 90% se hayan completado satisfactoriamente. Estoy solicitando varias páginas del mismo dominio, por lo que parece que puede haber algún problema de DNS. Realizo 25 solicitudes a la vez (25 hilos). Todo funciona bien si me limito a 5 solicitudes a la vez, pero una vez que llego a alrededor de 10 solicitudes, a veces empiezo a ver este error.

He leído Repeated host lookups failing in urllib2 que describe el mismo problema que he tenido y he seguido las sugerencias allí contenidas, pero fue en vano.

También he intentado usar el módulo de multiprocesamiento en lugar de multi-threading, obtengo el mismo comportamiento, aproximadamente 10% de los procesos mueren con el mismo error, lo que me lleva a pensar que esto no es un problema con urllib2 pero algo más.

¿Puede alguien explicar lo que está pasando y sugerir cómo solucionarlo?

ACTUALIZACIÓN

Si código manualmente la dirección IP del sitio en mi guión todo funciona perfectamente, por lo que este error se produce en algún momento durante la búsqueda de DNS.

+0

¿Tiene acceso al servidor? Es posible que se encuentre con algún elemento anti-negación de servicio, o si el servidor no es tan pesado, entonces en realidad podría estar sobrecargándolo ... – jswolf19

+0

Es un sitio web importante que es capaz de manejar cientos o miles de solicitudes simultáneas, mi 25 ni siquiera hace una pequeña mella. Estoy bastante seguro de que es un problema de resolución DNS, porque si reemplazo el nombre de dominio con la dirección IP mi script se ejecuta perfectamente, por lo que el sitio web no me está excluyendo explícitamente. En este punto solo quiero entender por qué las búsquedas de DNS están fallando. –

+0

Entonces puede ser un problema con el servidor DNS que solo permite tantas solicitudes de un cliente durante un cierto período de tiempo, o lo que sea. – jswolf19

Respuesta

1

Sugerencia: Intente habilitar un caché DNS en su sistema, como nscd. Esto debería eliminar los problemas de búsqueda de DNS si su raspador siempre realiza solicitudes al mismo dominio.

Asegúrese de que los objetos de archivo devueltos por urllib2.urlopen se cierran correctamente después de ser leídos, para liberar recursos. De lo contrario, puede alcanzar el límite máximo de sockets abiertos en su sistema.

Además, tenga en cuenta el politeness policy que los rastreadores web deberían evitar para sobrecargar un servidor con múltiples solicitudes.

+1

He hecho ambas cosas, la otra pregunta de desbordamiento de pila a la que me he vinculado en mi publicación hace ambas sugerencias, pero no resuelve mi problema. Usar la dirección IP directamente en lugar del dominio sí lo hace, pero no entiendo por qué nscd no resuelve este problema, ya que parece estar relacionado con el almacenamiento en caché del DNS. –

Cuestiones relacionadas