在去年底的時候曾經在客戶的網站主機收到一個 載入組態檔時發生錯誤: 無法開始監視 '\\10.0.1.1\Shared\8666-f79049226252' 的變更,因為已經到達網路 BIOS 命令限制 的錯誤,當時並不知道是什麼問題,只知道重新啟動 IIS 或回收應用程式集區就會恢復正常,但最近已經瞭解了問題發生的主因。
當時的環境是兩台 Windows Server 2003 (x86) / IIS6 網站伺服器,兩台主機做負載平衡(Load Balance),而網站有部分目錄是共用的,所以透過 UNC 路徑的方式將檔案放置在另一台 Windows Server 2003 (x86) 主機上,在平時都運作正常,但偶而會發生以下錯誤訊息:
載入組態檔時發生錯誤: 無法開始監視 '\\10.0.1.1\Shared\8666-f79049226252' 的變更,因為已經到達網路 BIOS 命令限制。如需此錯誤的詳細資訊,請參閱 Microsoft 知識庫文件 810886。不支援在 Windows XP 平台的 UNC 共用上裝載。 (\\10.0.1.1\Shared\8666-f79049226252\web.config)
以下是當時從事件檢視器收到的錯誤訊息:
事件代碼: 3008
事件訊息: 發生組態錯誤。
事件時間: 12/22/2009 1:14:55 PM
事件時間 (UTC): 12/22/2009 5:14:55 AM
事件 ID: 96eedefb410b4161b05e2bdce7e9976e
事件序列: 955
事件項目: 1
事件詳細資料代碼: 0
應用程式資訊:
應用程式定義域: /LM/W3SVC/1603528564/Root-1-129059311890503750
信任層級: Full
應用程式虛擬路徑: /
應用程式路徑: C:\inetpub\wwwroot\
電腦名稱: WF-Web1
處理序資訊:
處理序 ID: 2348
處理序名稱: w3wp.exe
帳戶名稱: NT AUTHORITY\NETWORK SERVICE
例外狀況資訊:
例外狀況型別: ConfigurationErrorsException
例外狀況訊息: 載入組態檔時發生錯誤: 無法開始監視 '\\10.0.1.1\Shared\8666-f79049226252' 的變更,因為已經到達網路 BIOS 命令限制。如需此錯誤的詳細資訊,請參閱 Microsoft 知識庫文件 810886。不支援在 Windows XP 平台的 UNC 共用上裝載。 (\\10.39.1.44\Shared\8666-f79049226252\web.config)
要求資訊:
要求 URL: http://www.example.com/images/8666-f79049226252/IMG_0205.jpg
要求路徑: /images/8666-f79049226252/IMG_0205.jpg
使用者主機位址: 192.168.79.13
使用者:
已驗證: False
驗證類型:
執行緒帳戶名稱: NT AUTHORITY\NETWORK SERVICE
執行緒資訊:
執行緒 ID: 1
執行緒帳戶名稱: NT AUTHORITY\NETWORK SERVICE
正在模擬: False
堆疊追蹤: at System.Configuration.ConfigurationSchemaErrors.ThrowIfErrors(Boolean ignoreLocal)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey, Boolean getLkg, Boolean checkPermission)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
at System.Web.Configuration.RuntimeConfig.GetSectionObject(String sectionName)
at System.Web.Configuration.RuntimeConfig.GetSection(String sectionName, Type type, ResultsIndex index)
at System.Web.Configuration.RuntimeConfig.get_Identity()
at System.Web.HttpContext.get_ImpersonationToken()
at System.Web.ClientImpersonationContext.Start(HttpContext context, Boolean throwOnError)
at System.Web.HttpApplication.ThreadContext.SetImpersonationContext()
at System.Web.HttpApplication.ThreadContext.Enter(Boolean setImpersonationContext)
at System.Web.HttpApplication.OnThreadEnterPrivate(Boolean setImpersonationContext)
at System.Web.HttpApplication.ApplicationStepManager.ResumeSteps(Exception error)
自訂事件詳細資料:
請在 http://go.microsoft.com/fwlink/events.asp 查看說明及支援中心,以取得其他資訊。
發生的主因在於 Web 伺服器透過 UNC 連接檔案伺服器(File Server) 時若連線數過大時,可能會導致 RPC 運作失敗因而無法透過 UNC 存取檔案,所以才會出現這樣的錯誤,那是因為在 x86 架構下的不分頁記憶體(non-paged pool memory)有限,在一台 x86 架構下的機器的上限為 256MB,所以 Windows 才會讓 UNC 連接時的同時連線數降低,才不會避免記憶體不足而導致系統不穩定的情況。
即便到了 Windows Server 2008 作業系統,如果你安裝 x86 架構的版本,依然會有可能發生這個錯誤,必須進一步處理。不過此問題在 x64 架構下不會發生,因為 x64 架構下的不分頁記憶體上限有 128GB 之多,所以很難發生類似的錯誤。註: 目前最新版的 Windows Server 2008 R2 僅提供 x64 版本。
解決方法就是調整 Client 端 ( IIS 網站伺服器 ) 與 Server 端 ( 檔案伺服器 ) 的系統機碼,兩端如果都是 x86 架構的作業系統,則兩邊的主機都需要進行設定。
修改 Client 端電腦的機碼 ( 也就是使用檔案伺服器的電腦,也就是執行 IIS 主機 )
建立 Client.reg 機碼檔,並輸入以下內容,並進行合併機碼的動作:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanworkstation\parameters]
"MaxCmds"=dword:00000800
修改 Server 端電腦的機碼 ( 也就提供 UNC 檔案服務的檔案伺服器 )
建立 Server.reg 機碼檔,並輸入以下內容,並進行合併機碼的動作:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters]
"MaxMpxCT"=dword:00000800
"MaxWorkItems"=dword:00002000
---
若你想比較 x86 與 x64 下的記憶體架構,可以參考這篇 KB 文章。
相關連結