来自getaddrinfo的反应缓慢

Nit*_*amk 9 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应该提前超时吗?

Cra*_*der 4

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

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

[编辑]

在我看来,您的 Windows Server 2003 实例似乎没有正确配置 IPv6。一旦 IPv6 查找超时,就会回退到 IPv4。可能有帮助的知识库文章包括:

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

  • 嗯,这回答了我的问题。但 DnsQuery 使用了相同的缓存,并且在使用该函数时我从未发现过问题。我的软件部署在大约 10,000 个位置,直到我切换到 getaddrinfo,很多用户才开始报告此问题。此外,本地 DNS 缓存中的查找需要 15 秒,这似乎很荒谬。 (2认同)