故障現象:
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值,就可以徹底解決此問題。