“磁碟#的邏輯塊地址#的IO操作已重試”是什麼意思?在 Windows Server 系統事件日誌中看到的意思是什麼?
我有多路徑 IO 配置的伺服器 2012 刀片,在 MPIO 路徑故障期間顯示如下警告:
磁碟 7 的邏輯塊地址 0 處的 IO 操作已重試。
我知道是什麼導致了警告的發生,所以我不是在尋找原因,但這條消息的實際含義是什麼?
這是否意味著如果此 IO 是寫入操作,那麼伺服器實際上會失去它試圖寫入的數據?
感謝您提供任何關於此警告資訊含義的資訊。
不,這並不意味著數據失去了。它只是意味著 IRP(IO 請求數據包)在 IO 系統等待它完成時超時,因此再次嘗試。當一個執行緒開始任何 IO 操作時,IO 管理器會創建一個 IRP 來表示該操作通過系統。
IRP 以其初始狀態儲存在緩衝區/備份列表中,以便在第一次失敗時可以重試。這提供了人們期望從任何事務系統中獲得的原子性,因此我們可以更加確信您不會將一堆損壞或不完整的數據寫入磁碟。
如果發生 MPIO 故障,此事件非常有意義。假設 Windows 從 SAN 儲存讀取或寫入某些內容。請求已發送,同時,我切斷了連接 SAN 的一根電纜。該請求永遠不會完成,因此 Windows 將再次嘗試該請求,只是這次請求將遵循另一條路徑。
當磁碟負載過重或速度非常慢時,也會發生這些事件。您可能會注意到這些消息與計劃的備份等相吻合。磁碟可能只是緩慢而忙碌,並且一些隨機 IRP 超時並不得不重試。IRP 可能會卡在中斷服務常式或延遲過程呼叫或其他任何情況下。
我可以看到你的堆棧中有很多 IO 過濾器驅動程序也會加劇這個問題。
並不是說這種行為在以前的 Windows 版本中沒有發生過,只是微軟顯然決定在 Win8/Server 2012 中公開這些事件。
**編輯:**您可以使用核心調試器找到執行緒的未完成 IRP:
kd> !irp 1a2b3c4d
,您之前通過發出命令找到該地址,該命令kd> !process 8f7d6c4a
將列出與該程序關聯的執行緒關聯的所有 IRP。kd> !process 0 0
列出所有正在執行的程序。一旦你使用 !irp 命令列出了有關 IRP 的資訊,你就可以很容易地發現哪個驅動程序最後處理了 IRP,因為它會
>
在列表中指向它。然後,要獲取有關該驅動程序對該 IRP 執行的操作的更多資訊,請在kd> !devobj 1a2b3c4d5e6f
其中執行設備對象的實際地址。然後
kd> dt 0x1a2b3c3c2b1a _CLASS_PRIVATE_FDO_DATA
使用您獲得的 PrivateFdoData 結構的地址進行操作。現在您已準備好轉儲從 PrivateFdoData 獲得的 AllTransferPacketsList 資料結構。
這個想法是,您正在跟踪上次看到 IRP 時哪個驅動程序對 IRP 做了什麼。如果 IRP AWOL 的時間過長,它就會超時並從頭開始重試。這可能是由很多事情造成的……甚至是雜散的宇宙射線。但重要的是,事務會從頭開始重試,直到 IO 管理器說完成後才認為完成。
哦,還有與執行緒無關的 IO,它是完全不同的蠕蟲罐頭。:)
為了進一步閱讀這個主題,我強烈推薦 Mark Russinovich、Margosis 等人的 Windows Internals 第 6 版的第 8 章,I/O 系統。
編輯: 我終於找到了這個錯誤的官方知識庫:http: //support.microsoft.com/kb/2819485/EN-US
IO 操作應該重試 8 次,每分鐘一次,直到 Windows 放棄。
編輯:如承諾:https ://docs.microsoft.com/en-us/archive/blogs/ntdebugging/interpreting-event-153-errors