2009-11-22 23 views
8

Sto utilizzando getaddrinfo per eseguire query DNS da C++ su Windows. Ho usato DnsQuery dell'API di Windows e questo ha funzionato bene, ma quando ho aggiunto il supporto IPv6 al mio software sono passato a getaddrinfo. Da allora, ho visto quanto segue:Risposta lenta da getaddrinfo

Il mio problema è che alcune volte getaddrinfo impiega molto tempo per completare. La tipica risposta di getaddrinfo richiede solo pochi millisecondi, ma circa 1 volta su 10000, richiede più tempo, in alcuni casi circa 15 secondi, ma ci sono stati diversi casi in cui sono necessari diversi minuti.

Ho eseguito Wireshark sul server e analizzato mie Applicazioni registri di debug e visualizzare le seguenti:

  • chiamo la funzione getaddrinfo.
  • 15 secondi dopo, il mio computer interroga il server DNS.
  • Alcuni millisecondi più tardi, ottengo la risposta dal server DNS.

La cosa strana qui è che la query DNS effettiva impiega solo un decimo di secondo, ma il tempo in cui getaddrinfo viene effettivamente eseguito è molto più lungo.

Il problema è stato segnalato da molti utenti, quindi non è qualcosa di specifico per la mia macchina.

Quindi cosa fa getaddrinfo più che contattare il server DNS?

Edit:

  • Il problema si è verificato con diversi indirizzi. Se provo a riprodurre il problema utilizzando questi indirizzi, il problema non si verifica.
  • Ho fatto qualcosa di stupido. Su ogni query DNS, vengono analizzati i servizi/etc. Tuttavia, ciò non spiega un ritardo su diversi minuti. (Grazie D.Shawley)

Edit 2

  • Un tipo di query DNS fatte da mio software è query DNSBL anti-spam. Il log di un utente mi ha mostrato che la ricerca di ip.address1.example.com sembrava richiedere sempre esattamente 2039 secondi, mentre la ricerca di another.ip.address.example.com richiedeva sempre esattamente 1324 secondi. Il giorno dopo, le ricerche per quegli indirizzi andavano bene. All'inizio pensavo che gli autori dei DNS BL avessero messo una specie di timeout dalla loro parte. Ma se questo fosse il problema principale, getaddrinfo dovrebbe essere scaduto prima?
+0

Sono solo le query per determinati indirizzi specifici che sono lenti? – SimonJ

+0

Prova a eseguire qualcosa come FileMon e assicurati che non stia facendo qualcosa di stupido come leggere e analizzare 'c: \ windows \ system32 \ drivers \ etc \ services' e' c: \ windows \ system32 \ drivers \ etc \ hosts' ogni tempo che chiami 'getaddrinfo()'. –

+1

Quasi certamente analizzerebbe il file hosts almeno su ogni chiamata, ma ciò non dovrebbe richiedere più di un millisecondo o due. –

risposta

3

Windows dispone di un daemon locale che esegue il caching DNS. La chiamata a getaddrinfo() viene instradata a quel demone, che presumibilmente sta controllando la sua cache prima di inviare la query al server DNS.

Vedere Windows Knowledge Base article 318803 per ulteriori informazioni sulla disabilitazione della cache.

[Edited]

Sembra a me come se l'istanza di Windows Server 2003 non è configurato correttamente per IPv6. Una volta scaduto il timeout delle ricerche IPv6, ritornerà a IPv4.articoli della Knowledge Base che potrebbero aiutare comprendono:

Purtroppo, non ho accesso a qualsiasi server Windows, quindi non posso testare/replicare questo me stesso.

+2

Beh, questo tipo di risposte alla mia domanda. Ma la stessa cache è stata utilizzata da DnsQuery e non ho mai visto il problema quando si utilizza quella funzione. Il mio software è distribuito in ~ 10.000 posizioni e solo quando sono passato a getaddrinfo molti utenti hanno iniziato a segnalare questo problema. Inoltre, sembrerebbe assurdo che una ricerca nella cache DNS locale impiegherebbe 15 secondi. – Nitramk

+0

Si può controllare se si tratta della cache o meno emettendo lo stesso comando più volte. Sospetto che non stia guardando il cache e questo è parte del problema. L'altro problema è che cerca anche gli indirizzi IPv6 e quelle ricerche sono lente su alcune configurazioni per qualche motivo. – highBandWidth