2009-11-22 24 views
8

Estoy usando getaddrinfo para hacer consultas DNS desde C++ en Windows. Solía ​​usar Windows API DnsQuery y funcionó bien, pero cuando agregué compatibilidad con IPv6 a mi software, cambié a getaddrinfo. Desde entonces, he visto lo siguiente:Respuesta lenta de getaddrinfo

Mi problema es que algunas veces getaddrinfo toma mucho tiempo en completarse. La respuesta típica de getaddrinfo toma solo unos pocos milisegundos, pero aproximadamente 1 vez de cada 10000, lleva más tiempo, en algunos casos alrededor de 15 segundos, pero ha habido varios casos en los que tarda varios minutos.

me he encontrado Wireshark en el servidor de aplicaciones y analicé mis registros de depuración y ver lo siguiente:

  • que llame a la función getaddrinfo.
  • 15 segundos después, mi máquina consulta el servidor DNS.
  • Algunos milisegundos más tarde, recibo la respuesta del servidor DNS.

Lo extraño aquí es que la consulta DNS real solo toma una décima de segundo, pero el tiempo que getaddrinfo realmente se ejecuta es mucho más largo.

El problema ha sido reportado por muchos usuarios, por lo que no es algo específico de mi máquina.

Entonces, ¿qué hace getaddrinfo más que contactar al servidor DNS?

Editar:

  • El problema ha ocurrido con varias direcciones. Si trato de reproducir el problema usando estas direcciones, el problema no ocurre.
  • He hecho algo estúpido. En cada consulta DNS, se analiza el etc/services. Sin embargo, eso no explica una demora en varios minutos. (Gracias D.Shawley)

Editar 2

  • Un tipo de consultas DNS realizadas por el software es DNSBL consultas anti-spam. El registro de un usuario me mostró que la búsqueda de ip.address1.example.com siempre parecía tomar exactamente 2039 segundos, mientras que la búsqueda de another.ip.address.example.com siempre tomaba exactamente 1324 segundos. El día después de eso, las búsquedas de esas direcciones estaban bien. Al principio pensé que los autores de DNS BL habían puesto un poco de tiempo de espera de su parte. Pero si este era el problema central, ¿debería haber agotado el tiempo de getaddrinfo?
+0

¿Son solo las consultas para ciertas direcciones específicas que son lentas? – SimonJ

+0

Intenta ejecutar algo como FileMon y asegúrate de que no esté haciendo algo estúpido como leer y analizar 'c: \ windows \ system32 \ drivers \ etc \ services' y' c: \ windows \ system32 \ drivers \ etc \ hosts' cada hora a la que llama 'getaddrinfo()'. –

+1

Es casi seguro que analizará el archivo de hosts al menos en cada llamada, pero eso no debería tomar más de un milisegundo o dos. –

Respuesta

3

Windows tiene un daemon local que almacena DNS en caché. Su llamada a getaddrinfo() se enruta a ese daemon, que presumiblemente está verificando su caché antes de enviar la consulta a su servidor DNS.

Consulte Windows Knowledge Base article 318803 para obtener más información sobre la desactivación de la caché.

[Editado]

Me suena como si la instancia de Windows Server 2003 no está configurado correctamente para IPv6. Una vez que finaliza el tiempo de búsqueda de IPv6, regresará a IPv4.artículos de Knowledge Base que pueden ayudar incluyen:

Por desgracia, no tienen acceso a ningún servidor de Windows, así que no puedo probar/replicar esto yo mismo

+2

Bueno, ese tipo de respuestas a mi pregunta. Pero el mismo caché fue utilizado por DnsQuery y nunca vi el problema cuando usé esa función. Mi software se implementó en ~ 10 000 ubicaciones y no fue hasta que cambié a getaddrinfo que muchos usuarios comenzaron a informar sobre este problema. Además, parecería absurdo que una búsqueda en el caché DNS local tome 15 segundos. – Nitramk

+0

Se puede verificar si se trata de la caché o no emitiendo el mismo comando varias veces. Sospecho que no está mirando el caché y eso es parte del problema. El otro problema es que también busca direcciones IPv6 y esas búsquedas son lentas en ciertas configuraciones por alguna razón. – highBandWidth

Cuestiones relacionadas