【问题标题】:Slow response from getaddrinfogetaddrinfo 响应缓慢
【发布时间】:2009-11-22 12:17:03
【问题描述】:

我正在使用 getaddrinfo 从 Windows 上的 C++ 执行 DNS 查询。我曾经使用 Windows API DnsQuery 并且效果很好,但是在向我的软件添加 IPv6 支持时,我切换到了 getaddrinfo。从那时起,我看到了以下内容:

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

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

  • 我调用函数 getaddrinfo。
  • 15 秒后,我的机器查询 DNS 服务器。
  • 几毫秒后,我收到了来自 DNS 服务器的响应。

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

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

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

编辑:

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

编辑 2

  • 我的软件进行的一种 DNS 查询是反垃圾邮件 DNSBL 查询。一位用户的日志显示,查找 ip.address1.example.com 似乎总是需要 2039 秒,而查找 another.ip.address.example.com 总是需要 1324 秒。在那之后的第二天,这些地址的查找就很好了。起初我认为 DNS BL 作者在他们这边设置了某种超时。但如果这是核心问题,getaddrinfo 应该早就超时了吧?

【问题讨论】:

  • 它是否只查询某些速度较慢的特定地址?
  • 尝试运行 FileMon 之类的东西,并确保它不会在每次调用 getaddrinfo() 时做一些愚蠢的事情,比如读取和解析 c:\windows\system32\drivers\etc\servicesc:\windows\system32\drivers\etc\hosts
  • 它几乎肯定会至少在每次调用时解析主机文件,但这不应该超过一两毫秒。
  • @D.Shawley。你是对的。实际上,我每次执行 DNS 查询时都会解析 etc\services(或 getaddrinfo),这当然非常愚蠢。我不认为仅凭这一点就可以解释速度缓慢,除非 Windows 尝试解析位于网络中或 Active Directory 中的另一台服务器上的服务文件(我不确定 Windows 中是否存在这种可能性)。 :-\
  • 所讨论的系统上是否还有其他任何东西,例如人们认为可能涉及的防火墙或 AV 软件?我在想,如果所有“问题”系统都具有相同的防火墙,那么防火墙可能正在做一些奇怪的事情?

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


【解决方案1】:

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

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

[已编辑]

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

很遗憾,我无法访问任何 Windows 服务器,因此我无法自己测试/复制它。

【讨论】:

  • 嗯,这样回答了我的问题。但是 DnsQuery 使用了相同的缓存,我在使用该函数时从未发现过问题。我的软件部署在大约 10 000 个位置,直到我切换到 getaddrinfo,很多用户才开始报告这个问题。此外,在本地 DNS 缓存中查找需要 15 秒似乎很荒谬。
  • 可以通过多次发出相同的命令来检查它是否是缓存。我怀疑它没有查看缓存,这是问题的一部分。另一个问题是它还会查找 ipv6 地址,并且由于某些原因,这些查找在某些设置上很慢。
猜你喜欢
  • 2021-08-17
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 2013-02-16
  • 2012-12-30
相关资源
最近更新 更多