2009-11-22 10 views
8

Windows'ta C++ 'dan DNS sorguları yapmak için getaddrinfo kullanıyorum. Windows API DnsQuery'yi kullandım ve bu iyi çalıştı, ancak yazılımıma IPv6 desteği eklerken getaddrinfo'ya geçtim. O zamandan beri, ben gördüm:Yavaş yanıt getaddrinfo'dan

Benim sorunum getaddrinfo tamamlamak için çok uzun zaman alıyor olmasıdır. Getaddrinfo'dan gelen tipik yanıt yalnızca birkaç milisaniye sürer, ancak yaklaşık 10000'den 1 kez daha uzun zaman alır, bazı durumlarda yaklaşık 15 saniye sürer, ancak birkaç dakika sürdüğü birkaç durum vardır.

sunucuda Wireshark'ı çalıştırın ve uygulamalarım ayıklama günlükleri analiz ve aşağıdakilere bakın ettik:

  • ben işlev getaddrinfo diyoruz.
  • 15 saniye sonra, makinem DNS sunucusunu sorgular.
  • Bazı milisaniye sonra, DNS sunucusundaki yanıtı alıyorum.

Burada garip olan şey, gerçek DNS sorgusunun yalnızca saniyenin onda birini almasıdır, ancak getaddrinfo'nun gerçekten çalıştığı süre çok daha uzun.

Sorun, birçok kullanıcı tarafından bildirilmiştir, bu yüzden makinem için belirli bir şey değil.

Getaddrinfo, DNS sunucusuyla iletişim kurmanın ötesinde ne yapar?

Düzenleme:

  • sorun sayıda adres oluştu. Bu adresleri kullanarak sorunu yeniden oluşturmaya çalışırsam sorun oluşmaz.
  • Aptalca bir şey yaptım. Her DNS sorgusunda, etc/services ayrıştırılır. Ancak, bu birkaç dakika gecikmeyi açıklamıyor. Benim yazılım tarafından yapılan DNS sorgularının (teşekkürler D.Shawley)

Düzenleme 2

  • Bir tür anti-spam DNSBL sorguları olduğunu. Bir kullanıcıdan gelen günlük, her zaman tam olarak 2039 saniyeyi aldığını görünce, ip.address1.example.com aramasının her zaman tam olarak 1324 saniye sürdüğünü gösterdi. Bundan sonraki gün, bu adreslerin aramaları gayet iyi. İlk başta, DNS BL yazarlarının kendi taraflarında bir çeşit zaman aşımı olduğunu düşündüm. Ama bu temel problem olsaydı, getaddrinfo daha önce zaman aşımına uğramış olmalıydı?
+0

Yalnızca belirli, belirli adresler için sorgular yavaş mı? – SimonJ

+0

FileMon gibi bir şey çalıştırmayı deneyin ve "c: \ windows \ system32 \ drivers \ etc \ services" ve "c: \ windows \ system32 \ drivers \ etc \ hosts" öğelerini okuma ve ayrıştırma gibi aptalca bir şey yapmadığından emin olun. getaddrinfo() 'aradığınız süre. –

+1

Hemen hemen her çağrıda ana bilgisayar dosyasını ayrıştırırdı, ancak bu bir milisaniye veya ikiden fazla sürmemelidir. –

cevap

3

Windows DNS önbelleği yapan bir yerel cini vardır. Getaddrinfo() çağrınız, sorguyu DNS sunucunuza göndermeden önce önbelleğini kontrol eden o daemona yönlendiriliyor.

Önbelleği devre dışı bırakma hakkında daha fazla bilgi için bkz Windows Knowledge Base article 318803. Windows Server 2003 örneği IPv6 için doğru yapılandırılmamış sanki

[Düzenlendi]

bana geliyor. IPv6, zaman aşımına uğradığında, IPv4'e geri döner.yardımcı olabilecek Bilgi Bankası makaleleri şunlardır:

, ben herhangi bir Windows Sunucularına erişimi yok, bu yüzden test edemez/çoğaltmak bu kendim.

+2

Peki, bu tür bir cevap benim sorum. Ancak aynı önbellek DnsQuery tarafından kullanıldı ve bu işlevi kullanırken hiç bir zaman problemi görmedim. Yazılımım ~ 10 000 yerde konuşlandırıldı ve getaddrinfo'ya geçene kadar pek çok kullanıcı bu sorunu bildirmeye başlamamıştı. Ayrıca, yerel DNS önbelleğindeki bir aramanın 15 saniye sürmesi saçma görünüyor. – Nitramk

+0

Aynı komut birden çok kez verilip verilmediğini bir önbellek olup olmadığını kontrol edebilir. Önbelleğe bakmadığından ve bu sorunun bir parçası olduğundan şüpheleniyorum. Diğer problem, aynı zamanda ipv6 adreslerini de görmesi ve bu aramaların bazı nedenlerle belirli kurulumlarda yavaş olmasıdır. – highBandWidth

İlgili konular