Server Message Block文件共享已經存在了很長一段時間,一般來說是穩定和可靠的。但是一些管理員發現如果從Windows 7或Windows 8客戶端向Windows Server文件共享傳輸大文件的時候會出現一些古怪的問題。
解決文件復制錯誤的第一步是識別哪些行為是本來設計之初就有的,哪些行為代表出現了問題。在Windows 7中,通常來說區分正常文件復制行為和有問題行為非常簡單。不過基于Windows 8有緩存進程工作的方式,有的時候看起來是問題的實際上卻沒有任何問題。
當使用Windows 8來拷貝一個文件到遠程文件共享系統的時候,會用到內存緩存機制。它會將文件的一部分寫入內存中,然后將它拷貝到文件共享系統。傳輸小文件的時候,這種機制可以讓傳輸的速度變得非常快,但是傳輸大文件的時候,文件傳輸進程在開始的時候非常快,但是到后來就緩慢的進行了(如圖1所示)。
圖1. 在Windows 8傳輸大文件到網絡文件共享時,文件傳輸進程在開始的時候非常快,然后速度會明顯下降
如果傳輸的文件不是非常的大,那么圖1中顯示的這種現象會一直持續到拷貝結束為止。如果是更大的文件——或者使用的是很小緩存的計算機——的話,復制的過程會出現抖動。一大塊的數據會被復制,然后會在一段時間內沒有任何動靜。在這段減速的過程中,操作系統會清空緩存然后將新的內容注入內存中去(如圖2所示)。
圖2. 在有些時候,文件復制過程中速度會發生變化
圖1和圖2中的這些情況都沒有表明任何問題。因為這是在Windows 8.1中正常的行為。但是,有的時候文件復制過程中出現了超時,導致錯誤信息出現(如圖3所示)。
圖3. 有的時候,有效期超時也會導致復制出錯
這個問題只會出現在拷貝非常大的文件(10GB甚至更大)的時候出現。在圖3中出現的錯誤代碼是"Error 0x80070079: The semaphore timeout period has expired."。這樣籠統的報錯信息很難診斷問題所在。這種錯誤可能出現在Windows 7、Windows 8和其他Windows版本。這個問題可能是因為Windows桌面、Windows Server或者連接它們之間的網絡導致的。
檢查服務器日志
從檢查服務器的事件日志來開始排錯吧。雖然報錯信息可能不會在日志中產生一個事件,但是你有可能可以從中找到一些關于導致超時的線索。
然后,檢查一下是服務器還是終端導致的問題。盡管Performance Monitor可以幫到你,但主觀的測試也可以是很有效的。開始傳輸一個可能會導致錯誤的文件,然后測試服務器和客戶端的響應能力。比如你能否在客戶端上播放視頻?你能否在復制過程中,用另一臺客戶端向這臺服務器寫入文件?在大多數的情況下,你可能會發現客戶端持續響應,但是服務器的性能在顯著地下降。
使用PowerShell來進行進一步診斷
如果你將問題定位到了服務器端后,你還需要找到導致這個問題的真正原因。問題有很大的可能性是因為存儲設備的瓶頸或者網絡的瓶頸。這些瓶頸可能是因為設計的缺陷或者設備健康問題。在你的文件服務器上執行以下兩個PowerShell命令吧。
Get-PhysicalDisk
Get-PhysicalDisk | Get-StorageReliabilityCounter | Select-Object ReadErrorsTotal, WriteErrorsTotal, Temperature
這些命令會顯示你服務器上的磁盤是否是健康的狀態,以及是否正在發生任何讀寫錯誤。有的時候文件拷貝超時錯誤的出現是因為有一塊不健康的磁盤,它不能跟上I/O請求的速度。
檢查服務器使用的物理網卡狀態也是一個好的方法,特別如果文件服務器是一臺虛擬機的話。想象一下一臺只有單網卡的宿主機如果使用了它所有的帶寬這種情況。虛擬化相關的操作,例如實時遷移和同步操作都可以占用用戶的帶寬并且導致文件復制操作超時。
如果你不能馬上解決文件共享錯誤的問題,那么你可能需要用到專業的文件拷貝工具來作為短期內的解決方案,例如使用Robocopy來替代操作系統自帶的拷貝功能。