tags:

views:

2121

answers:

2

Note that I'm talking about the client DNS resolver cache. This message is not concerned with the Windows DNS Server.

I have a C# program that does a lot of DNS resolutions. Because the HTTPWebRequest component won't let me change the Host header, I can't create my own internal DNS cache. So I have to depend on the Windows DNS cache, which doesn't appear amenable to change.

There's a reasonably good TechNet article about the DNS cache Registry settings in Windows Server 2003, but I haven't been able to prove that setting them does anything. All the other pages I found through a Google search either reference that page, or paraphrase it, sometimes incorrectly.

Windows' ipconfig command has a /displaydns switch that will output the contents of the cache. To my knowledge, that's the only way to determine the size of the DNS cache. In my experiments on a 32 bit Windows XP box with 2 GB of memory, no matter what I set the DNS cache registry values to, I always end up with between 30 and 40 items in the cache--even after doing thousands of DNS resolutions. On my 64-bit Windows 2008 machine with 16 GB of memory, I always get between 270 and 300 items in the cache.

I'm stumped. I don't know what the answer is, but I figure one of the following is the case:

  1. It's not possible to change the size of the DNS resolver cache.
  2. It is possible, but the documentation is wrong.
  3. The documentation is correct as far as it goes, but it’s incomplete.
  4. The documentation is correct and complete, but I’m too dumb to make sense of it.
  5. The documented registry entries actually changed the size of the cache, but ipconfig isn’t showing me all the entries that are in the cache.

Can anybody tell me if it's possible to configure the size of the DNS resolver cache in Windows XP, Vista, or Server 2008?

A: 

By default the minimum TTL for cache is 1 day, I've toyed with it but by default I believe the registry entry isn't there by default.

This is the key you're looking for, at least in XP:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DNSCache\Parameters

You need to add a DWORD MaxCacheTtl - This will change the minimum TTL to store in the resolver cache.

Since it defaults to 86,400 (value is in seconds, default = 1 day), anything shorter than this simply isn't cached. If you lowered it to say 300, you'd see tons more getting cached on the client.

Nick Craver
According to the Knowledge Base article at http://support.microsoft.com/kb/318803, the amount of time the record will be cached is "the lesser of: 1) the number of seconds specified in the response the resolver received; 2) The value of the MaxCacheTtl setting." Your answer conflicts with that.
Jim Mischel
I wasn't speaking to the TTL of the cache entry, but rather the threshold that determines if it even qualifies to be cached.
Nick Craver
Could you please expand your answer to explain how reducing MaxCacheTtl will cause more records to be placed in the cache? Everything I've read in the Knowledge Base and the linked TechNet article indicates that I want to increase MaxTtl to make the cache more effective.
Jim Mischel
A: 

A hack you can use is to add entries to the hosts file on Windows, which would make it not make DNS queries for all the entries in the file. You can periodically then query again to verify entries.

sjbotha
It's an intriguing idea, but the number of DNS requests I do makes it impractical. I'd also rather not give my program access to the hosts file or the directory that it contains.
Jim Mischel
-1 - hacking hosts is pretty clearly not a solution for the question.
benc