我们正在使用dnscache服务,在一两个星期后内存使用量变得过多(〜6GB)。
重新启动服务可释放此内存,但执行ipconfig / flushdns不会,ipconfig / displaydns会在caching中显示aprox 15-20个条目。
我们已经检查,似乎每秒发生aprox 150 DNS查询,但我不希望这会导致此内存问题的影响。
我试图searchMSDN的修补程序或错误报告,但我只能find一个内存泄漏在Windows 2003的引用。任何人都可以build议如何进行。
鉴于您已经search了修补程序,我假设您的服务器已经与最新的Windows Service Pack和当前所有更新的最新? 这总是最好的开始。
对于6 GB的caching大小,我们正在谈论数千万个独特的DNS结果(这是荒谬的)。 你的客户不太可能做出这么多独特的DNS查询。 在你的问题的评论中,你指出应用程序正在执行查找每次客户端发送数据到服务器。 我不知道你的服务器上的应用程序(我假设web应用程序)是如何工作的,但是我想知道是否某个事件正在为每个客户端请求创build唯一的DNS查询,这些查询会作为一个不存在的域返回。 我猜想,如果DNS查询命中带有通配符的域,他们可能会返回有效的响应。 无论哪种方式,这可能占巨大的caching大小。
Ipconfig / displaydns并不总是返回整个caching,这将解释为什么你只看到15-20条目。
你可以(至less我可以)通过执行以下操作来确认这一点…
从Powershell提示符下:
> ipconfig /flushdns > [System.Net.Dns]::GetHostAddresses(“google.com”)
检查DNScaching
> ipconfig /displaydns
您可能会看到Google.com条目。 使用任务pipe理器loggingcaching大小(在任务pipe理器中,finddnscache服务,右键单击它,select去处理)。
现在运行以下命令,其中###是一个很大的数字(我使用了10,000)。 请注意,我设置了本地DNS服务器,以通配符来响应所有.test子域名,所以我没有在短时间内打到我的ISP DNS服务器10000次。
> $i = 0 > do {[System.Net.Dns]::GetHostAddresses(“blahblahfakedomain” + $i++ + “.test”)} while ($i –lt ###)
执行该命令时,请在“任务pipe理器”中查看caching进程的内存利用率。 一旦完成,请检查caching。 您可能不会看到我们刚刚生成的###quires,但DNScaching进程尚未释放内存。
在我的实验中,我能够通过刷新DNScaching来恢复内存(10,000个查询大概是2兆)。 我不知道为什么这不适合你。 也许是因为caching太大了…?
无论如何,我提出了以下解决方法:
修改HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Dnscache \ Parameters项下的MaxCacheTtl和MaxNegativeCacheTtlregistry值( http://support.microsoft.com/kb/318803 ):
修改或创buildDWord值MaxCacheTtl ,将其设置为低,如3600秒(hex0xE10)。 所有值均以秒为单位指定。 默认值是1天(86,400秒)。
修改或创buildDWord值MaxNegativeCacheTtl ,将其设置为0。
这将导致所有logging在添加后至多一小时内从caching中清除。 否定的结果(不存在的域名)根本不会被存储在caching中(我已经在Windows 7桌面上确认了这一点)。
我把这称为解决方法,因为我认为问题在于任何创build荒谬请求的进程。 如果可以的话,尝试阻止来自源的请求洪stream。
我们运行Wireshark捕获来查看哪些DNS查询在哪里运行,结果是每个客户端发送数据到服务器,它连接到另一台计算机上的MSSQL服务器并执行DNS查询以获得这个IP地址SQL服务器。
作为解决方法,我们已经使用SQL服务器IP地址configuration了应用程序服务器,因此应用程序服务器无需查询DNScaching。
然而,问题依然存在,为什么看起来像是正常的DNS查询,在DNScaching中导致这样的内存使用。
我在这里包含了线鲨鱼的痕迹,以便人们可以帮助诊断问题

在Windows 2008 R2上有很多关于DNS高内存利用率的讨论。 他们中的很多人指出禁用EDNS,这不会减less内存使用量。 真正的问题实际上是由于DNS打开的端口:2500 UDP IPv4和2500 UDP IPv6。 对于繁忙的生产DNS服务器来说,这是一个很好的数字,但是对于小型办公室的内部DNS来说,这样做太多了。
要减less打开端口的数量,请运行以下命令。 对于一个内部的DNS,在办公室里有大约20个人的100个端口是绰绰有余的:
Dnscmd /Config /SocketPoolSize 100
一旦该命令执行,重新启动DNS服务; 内存消耗应该减less。
您还可以查看您打开了多less个端口:
Dnscmd /Info /SocketPoolSize
不知道这是否太晚了,但我偶然发现了一个完全不同的问题 – 我认为这是导致问题的.uk域名。
他们继续描述一个简单的regkey修复将解决它。
http://support.microsoft.com/kb/968372
当根提示提供名称parsing时,Windows Server 2008 DNS和Windows Server 2008 R2 DNS服务器可能无法parsing某些顶级域名中的名称查询。 发生这种情况时,问题将继续,直到DNS服务器caching清除或DNS服务器服务重新启动。 这个问题可以通过.co.uk,.cn和.br等域来看,但不限于这些域。
发生问题时,为受影响的名称发出的nslookup命令将返回错误“服务器失败”。 networking跟踪将显示DNS服务器不会将此类请求的任何stream量发送到Internet。 在DNS事件日志中没有报告与问题相关的事件。
如果将DNS服务器configuration为使用转发器进行Internet名称parsing而不是根提示,则不会发生此问题。