我问了这个问题几个月前在 Stack Overflow 上搜索过,但没得到任何有用的答案。也许这里有人有更好的信息。
请注意,我指的是客户端 DNS 解析器缓存。此消息与 Windows DNS 服务器无关。
我有一个 C# 程序,它执行大量 DNS 解析。由于组件HTTPWebRequest
不允许我更改主机标头,因此我无法创建自己的内部 DNS 缓存。因此,我不得不依赖 Windows DNS 缓存,而这似乎无法更改。
有一个相当好的TechNet 文章关于 Windows Server 2003 中的 DNS 缓存注册表设置,但我无法证明在 XP、Server 2003、Vista 或 Server 2008 中设置它们会产生任何作用。我通过 Google 搜索找到的所有其他页面要么引用该页面,要么对其进行解释,有时是错误的。
Windowsipconfig
命令有一个/displaydns
开关,可以输出缓存的内容。据我所知,这是确定 DNS 缓存大小的唯一方法。在我使用 2 GB 内存的 32 位 Windows XP 机器上进行的实验中,无论我将 DNS 缓存注册表值设置为多少,缓存中总会有 30 到 40 个项目 - 即使在进行了数千次 DNS 解析之后也是如此。在我的 16 GB 内存的 64 位 Windows 2008 机器上,缓存中总会有 270 到 300 个项目。
我被难住了。我不知道答案是什么,但我认为以下情况之一就是这种情况:
- 无法更改 DNS 解析器缓存的大小。
- 这是可能的,但是文档是错误的。
- 就目前情况而言,该文档是正确的,但它不完整。
- 该文档是正确且完整的,但我太笨了,无法理解它。
- 记录的注册表项实际上改变了缓存的大小,但
ipconfig
并没有显示缓存中的所有条目。
有人能告诉我是否可以在 Windows XP、Vista 或 Server 2008 中配置 DNS 解析器缓存的大小吗?
答案1
另一种验证方式是查看网络上流动的 DNS 流量。例如,如果您的应用程序在下午 2 点对 domainX 进行查询,而您在跟踪中没有看到下午 2 点对应的 DNS 数据包,那么该名称已使用客户端缓存进行解析。
我知道,确认缓存大小的方法有点复杂。我同意应该有更好的方法来确认这一点。
尝试在 Microsoft 官方论坛上提问,或者尝试向网络团队发送电子邮件
答案2
尝试一下:
HKLM\System\CurrentControlSet\services\Dnscache\参数\MaxCacheSize
我找不到任何相关文档,但 Dnscache 服务在启动时会检查该注册表值是否存在,因此值得测试。
该值可能以千字节为单位。正如我所说,由于它没有记录,因此您必须进行测试。
答案3
我还没有尝试更改 DNS 客户端上的设置,因此无法对此发表意见,但我建议在重新启动服务时运行 processmon (www.sysinternals.com)。您应该会看到任何读取注册表项的尝试。它会准确地告诉您它试图访问哪些注册表项和项。这应该与文档相符,但如果不符,它有望告诉您出了什么问题。