故障现象:
DNS服务可能因为程序自身的线程超过限制而无法启动。同时,您可能在 系统事件日志 中找到下面的错误信息,
DNS Server 服务因下列错误而停止: 无法创建此服务的线程。
故障原因:
在当前Windows 2003 R2 x64以及Windows Server 2008 或 Windows Server 2008 R2 DNS服务的代码中 硬性的规定了 DNS 线程的最大数量为120个 (这个是写死在代码中的)。但是,DNS 对 CPU 的核心数并没有作任何的限制,因此会创建超过120个线程。
具体,DNS服务有2个功能的线程创建是根据CPU数量来决定的,一个是DNS Dynamic update功能以及 UDP I/O and dispatch 程序。 在64核的机器上,它们会创建64个Dynamic update的线程和64个UDP处理线程。因此,在64核CPU的平台上,线程数量就会大大的超过限制的数量。 64 *2 + (64/2 or NumberOfZones ) + 6 = Max 166 > 120, 因此就会报ERROR_SERVICE_NO_THREAD 的错误。 在32核的平台上, DNS 服务就工作正常,因为它最多创建86左右的线程。32 * 2 + 16 + 6 = 86 threads.
解决方法:
我们目前确认这个是Windows DNS服务的一个bug,但是这个问题可能仅会在Windows 8中被fix. 因此,当下,我们唯一的选择是使用少于48核CPU的平台来提供DNS服务。48*2+18+6 = 120 (我们可以通过减少AD集成的DNS区域到18个来符合线程的限制)。当然,如果我们仅用 32核CPU,那就更没有问题了。
当然,通过MSCONFIG 屏蔽CPU至48后,对Cluster 系统及本上没有任何影响。 开始——运行,键入msconfig,掉出“系统配置”窗口,“引导”选项里找到“高级选项卡”,更改CPU个数,一般改为32值,就可以彻底解决此问题。
转载于:https://blog.51cto.com/kingmacro/708315