題 為什麼損壞的硬盤會凍結整個系統?


為什麼一個已知有壞塊的硬盤(在HDTune和HDDScan中驗證)會凍結整個系統?

它不是操作系統驅動器;它連接到另一個SATA端口,我正在嘗試將文件從它複製到另一個健康的驅動器。

幾乎每個損壞的硬盤和每台Windows PC都經歷過這個問題。

我希望只看到我用來複製文件的程序凍結 (Windows資源管理器等),但我的整個電腦都變得生澀,我無法在從損壞的驅動器複製文件時瀏覽網頁或觀看電影。

長話故事。

我住在農村地區,那裡有電力問題(電壓不足等)。我自己正在使用UPS,我自己的硬盤非常好。但是我的鄰居經常在他們的PC問題上尋求幫助,而且我經常發現他們的硬盤壞了,很可能是因為電力問題。當然,在更換損壞的驅動器後,我建議我的鄰居買一台UPS。

我一直想知道,為什麼我的PC在從損壞的驅動器中檢索數據時完全凍結。這是硬件問題嗎?它是由OS讀取數據的方式引起的嗎?它是Windows特有的,我不會在* nix上體驗它?

無論如何,從現在開始,我將使用一些專用軟件(例如Roadkil的Unstoppable Copier)而不是Windows資源管理器,雖然我不確定這是否會以不同的方式工作,而不會凍結整個PC。

這不是一個求助的請求,它更多是出於教育目的,所以我知道為什麼事情會這樣。


125
2017-08-09 12:35


起源


使用外部USB機箱應該會有所幫助,因為您不再將故障磁盤綁定到系統SATA控制器(此外,在主板和故障磁盤之間添加額外的可犧牲硬件層總是一個好主意)。 - Matteo Italia
它並非特定於SATA,IDE驅動器也是如此。另外,僅僅因為磁盤損壞並不意味著控制器沒有,特別是如果電氣故障損壞了磁盤。 - Chris H
接受的答案很棒,包含了我要說的內容以及更多內容。基本上你是恐慌你的SATA控制器,這是一個非常重要的系統設備,反過來恐慌Windows。我確實想知道在BIOS中啟用AHCI /“熱插拔”是否會改善這種情況。 - Arthur Kay


答案:


這是SATA不是最理想的領域之一。問題出在存儲設備互連協議級別,因此與您運行的軟件無關。使用其他文件複製器或其他操作系統不會神奇地使事情變得更好,除非它可能 嘗試 設置不同的超時值以減少問題的影響(根據硬件和固件可能會或可能不會;可參見下文)。

這裡有幾點重要:

  1. 使用SATA,如果驅動器停止響應, 這可以佔用整個存儲系統, 不只是一個有問題的驅動器。它當然有可能佔用整個控制器,並且由於大多數消費者係統只有一個磁盤控制器(主板上集成了一個),這意味著所有存儲。如果驅動器以某種非標準和/或意外的方式發生故障,情況會更糟,如果驅動器處於邊緣狀態,這肯定會發生。你可能感興趣 硬件SATA RAID-10陣列中的單個磁盤如何使整個陣列停止運行? 在服務器故障。
  2. 大多數消費類SATA硬盤都有 長默認超時期限 (大約幾分鐘)和許多消費類SATA驅動器缺乏可配置性 錯誤恢復控制。所謂的“NAS”驅動器通常具有可配置的ERC,而高端驅動器幾乎總是如此;此類驅動器也可能具有較短的默認超時(7秒是常見值)。如果驅動器保存唯一的數據副本,則很長的超時時間是有利的,不幸的是,這在消費者係統中很常見;它們在冗餘配置中處於劣勢,或者您只是想在驅動器進一步惡化之前盡可能多地從驅動器中獲取。
  3. 一個驅動器會 繼續嘗試閱讀壞扇區 直到達到其超時閾值或直到主機發出中止信號。由於等待讀取完成後SATA總線可能會被束縛,因此操作系統可能無法發出存儲級命令中止信號,在極端情況下,驅動器甚至可能無法很好地響應SATA總線重置在這種情況下。

點#1是主要賣點之一 SAS 在服務器上; SAS有 顯著 比SATA更好的錯誤處理。點#2是驅動器固件限制,而#3實際上只是因為#2而成為問題。

那麼會發生什麼 操作系統向磁盤發出“讀取扇區”命令,並且特定扇區以某種方式損壞。因此,磁盤進入重試模式以嘗試從盤片中獲取數據,一次又一次地嘗試讀取,直到它獲得足夠好的數據,磁盤自身的糾錯(FEC)能夠糾正剩餘的錯誤。如果你運氣不好,這可能永遠不會,但是驅動器將在相當長的一段時間內繼續嘗試,然後再決定這次讀取不會成功。

因為操作系統正在等待讀取,所以這至少會使復製過程減慢到爬行速度,並且取決於確切的OS體系結構可能導致操作系統變得不穩定甚至凍結持續時間。此時,磁盤正忙於原始讀取,並且在當前正在執行的磁盤結束(成功或不成功)之前不會響應進一步的讀取命令,而其他軟件通常不會比操作系統做得更好正在運行。

因此,任何觸發其他地方閱讀的東西(理想,只有在損壞的驅動器上)必須排隊等待,直到損壞的驅動器成功讀取有問題的扇區,或確定無法讀取。 由於SATA對無響應驅動器的處理不夠理想, 這可能意味著您複製的驅動器不僅會延遲其I / O.這很容易導致其他軟件變慢或無響應,因為該軟件等待不同的I / O請求完成,即使操作系統能夠應對。

此處還要注意,即使您沒有顯式訪問磁盤上的任何文件,也可能發生磁盤I / O.造成這種情況的兩個主要原因是按需加載可執行代碼和交換。由於即使在系統沒有內存壓力的情況下有時也會使用交換,並且按需加載可執行代碼在現代系統上並且具有現代可執行文件格式是常見的,因此在正常使用期間非預期的磁盤讀取活動是非常可能的。

正如對該問題的評論所指出的那樣 Matteo Italia一種緩解策略是使用不同的存儲互連,這是一種複雜的說法“將磁盤放入USB機箱”。通過抽象來抽象 USB海量存儲 協議,這將有問題的SATA部分與系統的其餘部分隔離開來,這意味著 理論上,只有該特定磁盤上的I / O應受該磁盤上的I / O問題的影響。

作為一點點,這就是為什麼SATA(特別是沒有驅動級ERC的SATA)經常不鼓勵RAID(特別是 RAID級別 冗餘,其中標準的除外 RAID 0);如果冗餘存在且RAID存儲控制器只是知道這就是問題,那麼很長的超時時間和糟糕的錯誤處理很容易導致整個設備被拋出陣列以用於單個壞扇區,RAID控制器可以處理得很好。 SAS專為大型存儲陣列而設計,因此期望在各種驅動器上偶爾會出現問題,這導致它被設計為處理單個有問題的驅動器或I / O請求的情況 優雅 即使驅動器沒有。有問題的磁盤在消費者係統中並不常見,因為它們往往沒有安裝多個磁盤,而且安裝的磁盤幾乎從不具有冗餘;由於SATA旨在取代PATA / IDE而不是SCSI(後者是SAS所針對的利基),因此其錯誤處理功能和要求(或保證)可能被認為足以滿足其預期用例。


163
2017-08-09 13:28



感謝您實際發布了一個明智的答案,解釋了正在發生的事情。這是一個問題,我通常會看到模糊的答案,例如“因為系統正在等待驅動器”或“因為它的設計方式”。 - Mehrdad
@kasperd:差不多。雖然它的一部分也是Windows的“故障”,因為它可以很容易地與多個控制器一起發生。 IMO這個答案有點 故意模糊看到企業SAS控制器也無法解決這個問題。它實際上歸結為某些阻塞I / O請求。一些硬盤操作要求操作X保證在操作Y之前完成,如果X永遠不會完成,Y就永遠不能開始 - 並且Y之後的任何東西都會卡住,無論驅動器,控制器,驅動程序或操作系統是否處於打開狀態故障。 - qasdfdsaq
@JustAMartin實際上,它幾乎都是異步的 - 現在任何支持DMA的外設都是異步的;內核只調度請求並處理髮出請求信號的中斷。問題是有時你 必須 等待操作完成 - 在此過程中,他們可以阻止重要的事情。正如用戶20574所指出的那樣,虛擬內存就是其中之一,但是有很多東西需要一些保證。內核的某些部分不是異步的,當然,一些驅動程序/設備只是很糟糕。 - Luaan
@MichaelKjörling “因為操作系統正在等待讀取,這至少會使復製過程減慢到爬行速度,並且取決於確切的操作系統架構,可能導致操作系統變得不穩定甚至凍結持續時間。”  - 為什麼操作系統在從輔助(非系統)驅動器讀取時會變得不穩定?問題不能完全歸因於SATA控制器的錯誤處理行為。我認為這個答案可以從有關Windows如何處理其磁盤子系統中的錯誤的信息中受益。 - Jordan Rieger
@MichaelKjörling足夠公平。答案有很多好的信息,但我認為它並沒有完全解釋OP的具體情況。從不同的角度來看,你能引用任何參考來支持你的觀點#1: “使用SATA,如果驅動器停止響應,這可能會佔用整個存儲系統,而不僅僅是一個有問題的驅動器。它肯定有可能佔用整個控制器。”?這看起來像一個可怕的設計。難道不是操作系統磁盤子系統更可能是罪魁禍首嗎?即控制器是異步的,但OS驅動程序有時會不必要地阻塞。 - Jordan Rieger


如上所述,由於硬盤驅動器壞導致系統凍結的問題主要是由於驅動器長時間嘗試從壞扇區恢復不可讀數據。企業驅動器的賣點之一是故障扇區的讀取超時非常短。使用企業驅動器可以在一定程度上緩解您的問題,但不會解決它們。

最後的答案是保持適當的備份,以便不需要恢復。更改恢復軟件不會產生任何影響,因為這是固件超時問題。


3
2017-08-11 15:03





為什麼損壞的硬盤會凍結整個系統?

他們沒有(一般)。它實際上取決於特定的文件系統如何處理磁盤故障。

考慮ZFS,它是從頭開始設計的,以處理相當多的容錯。這是一個 演示視頻 (和 一個有更多解釋)他們在鐵砧上放置行駛驅動器,用大錘搖擺並鑽另一個驅動器。 ZFS一直在運行。


2
2017-08-11 17:46



實際上,存在ZFS不能很好處理的磁盤故障。例如,在I / O請求超時之前,在冗餘或非冗餘設置中超長讀取。 (您可以輕鬆地設置ZFS,使其沒有冗餘。)這很容易導致驅動器在ZFS中被拋出陣列,如果這使您低於冗餘閾值,則會導致整個陣列變得不可用如果使用failmode = wait設置,則可以顯示類似的結果。全面的全磁盤故障是 簡單 任何存儲子系統的情況;它的 邊緣 驅動器造成問題。 - α CVn
在你不這麼認為之前,我實際上是自己運行ZFS(幾乎完全)。這是一個很棒的文件系統,還有一個很棒的捲管理器, 如果 你很小心,知道自己在做什麼。但是,它專為企業級系統(高端工作站和服務器)而設計,管理員可以知道他們在做什麼。它的設計不能很好地處理商用硬件中出現的某些故障模式,包括RAM問題和從I / O請求返回時間過長的驅動器,並且它不是為了方便家庭用戶使用而設計的。家庭用戶用例。 - α CVn
除視頻外,ZFS不會繼續運行。斷開驅動器後,它再次開始運行。 - Christoffer Hammarström


我認為你遇到的問題是操作系統的低級部分在放棄之前多次嘗試讀取壞塊。如果在引導或其他獨立操作期間需要它,則該例程在低級別實現,因此難以使其重入。操作系統將在正常操作期間連續尋呼,並且難以優先考慮競爭請求,因為低級系統將不知道擁有尋呼請求的進程的優先級。


-2
2017-08-10 13:24



'低級系統' 不 知道請求頁面的進程的優先級;此類信息保存在 頁表雖然實現取決於系統如何處理優先級。這不是問題的正確答案 - 這是硬件問題,而不是操作系統問題。 - Chris Cirefice
我認為問題的正確答案是拒絕使用故障驅動器。然而,這不能滿足可理解地希望盡可能多地恢復數據的用戶。 - jrrk