来自getaddrinfo的响应缓慢

我使用getaddrinfo在Windows上从C ++进行DNS查询。 我曾经使用的Windows API的DnsQuery和工作正常,但是当我的软件添加IPv6支持我切换到getaddrinfo。 从那以后,我看到了以下几点:

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

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

  • 我称之为函数getaddrinfo。
  • 15秒钟后,我的机器查询DNS服务器。
  • 几毫秒后,我得到来自DNS服务器的响应。

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

这个问题已经被很多用户所报道,所以这不是我的机器特有的。

那么getaddrinfo做什么比联系DNS服务器更多?

编辑:

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

编辑2

  • 我的软件所做的一种DNS查询是反垃圾邮件DNSBL查询。 来自一个用户的日志告诉我,查找ip.address1.example.com似乎总是需要2039秒,而查找another.ip.address.example.com总是精确到1324秒。 之后的那一天,查找这些地址就好了。 起初我以为DNS BL的作者已经把某种超时放在了一边。 但如果这是核心问题,getaddrinfo应该早点超时了?

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

有关禁用缓存的更多信息,请参阅Windows知识库文章318803 。

将帖子

这听起来好像你的Windows server 2003实例配置不正确的IPv6。 一旦IPv6查找超时,它将回落到IPv4。 知识库文章可能有助于包括:

  • Windows server 2003部署指南>>>为IPv6 / IPv4共存配置DNS
  • TechNet库:Internet协议版本6
  • TechNet库文库>>>使用Windows工具获取IPv6配置信息

不幸的是,我没有访问任何Windows服务器,所以我不能自己测试/复制这个。