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