来自getaddrinfo的反应缓慢

时间:2009-11-22 12:17:03

标签: c++ windows dns performance getaddrinfo-a

我正在使用getaddrinfo在Windows上从C ++进行DNS查询。我以前使用Windows API DnsQuery并且工作正常,但是当我向我的软件添加IPv6支持时,我切换到了getaddrinfo。从那时起,我见过以下内容:

我的问题是有时候getaddrinfo需要很长时间才能完成。来自getaddrinfo的典型响应只需几毫秒,但大约是10000次中的1次,需要更长的时间,在某些情况下大约需要15秒,但有几种情况需要几分钟。

我在服务器上运行Wireshark并分析了我的应用程序调试日志,并看到以下内容:

  • 我调用函数getaddrinfo。
  • 15秒后,我的机器查询DNS服务器。
  • 几毫秒后,我从DNS服务器获得响应。

这里奇怪的是,实际的DNS查询只需要十分之一秒,但getaddrinfo实际执行的时间要长得多。

许多用户已经报告了这个问题,所以这不是我的机器特有的。

那么getaddrinfo除了联系DNS服务器之外还做什么呢?

编辑:

  • 多个地址出现了问题。如果我尝试使用这些地址重现问题,则不会发生此问题。
  • 我做了些蠢事。在每次DNS查询时,都会解析etc / services。但是,这并不能解释几分钟后的延迟。 (感谢D.Shawley)

编辑2

  • 我的软件提出的一种DNS查询是反垃圾邮件DNSBL查询。来自一个用户的日志显示,ip.address1.example.com的查找似乎总是花费2039秒,而另一个.ip.address.example.com的查找总是花费1324秒。第二天,这些地址的查找就好了。起初我认为DNS BL的作者已经放弃了某种超时。但如果这是核心问题,getaddrinfo应该早点超时吗?

1 个答案:

答案 0 :(得分:4)

Windows有一个执行DNS缓存的本地守护程序。您对getaddrinfo()的调用将被路由到该守护程序,该守护程序可能在将查询提交到DNS服务器之前检查其缓存。

有关禁用缓存的详细信息,请参阅Windows Knowledge Base article 318803

<强> [编辑]

听起来好像您的Windows Server 2003实例未正确配置IPv6。一旦IPv6查找超时,它将回退到IPv4。可能有用的知识库文章包括:

不幸的是,我无法访问任何Windows服务器,因此我无法自行测试/复制。

相关问题