为什么损坏的硬盘驱动器会冻结整个系统?


128

为什么已知有坏块的硬盘驱动器(在HDTune和HDDScan中经过验证)会冻结整个系统?

它不是操作系统驱动器;它连接到另一个SATA端口,而我正尝试将文件从其中复制到另一个正常的驱动器。

我几乎在每台损坏的硬盘驱动器和每台Windows PC上都遇到了此问题。

我希望只会看到我用于复制文件的程序(Windows资源管理器等)冻结,但是相反,我的整个PC都变得混乱了,从损坏的驱动器复制文件时,我无法浏览网页或观看电影。

长话短说。

我居住在农村地区,那里有电问题(电力不足等)。我自己使用的是UPS,我自己的硬盘也很好。但是我的邻居经常在PC问题上寻求帮助,而且我经常发现他们的硬盘损坏,很可能是因为电力问题。当然,更换损坏的驱动器后,我建议邻居们购买一台UPS。

我一直想知道为什么我的PC在从损坏的驱动器中检索数据时会完全死机。这是硬件问题吗?这是由OS读取数据的方式引起的吗?它是特定于Windows的东西,我不会在* nix上体验到吗?

无论如何,从现在开始,我将使用某些专用软件(例如Roadkil的Unstoppable Copier)而不是Windows资源管理器,尽管我不确定在不冻结整个PC的情况下是否会以不同的方式工作。

这不是请求帮助,更多是出于教育目的,所以我知道事情为什么以这种方式起作用。


11
使用外部USB机箱应该会有所帮助,因为您不再需要将有故障的磁盘与系统SATA控制器绑定在一起(而且,在主板和有故障的磁盘之间添加额外的可牺牲硬件层总是一个好主意)。
Matteo Italia

3
它不特定于SATA,IDE驱动器也可以做到这一点。同样,仅仅因为磁盘损坏并不意味着控制器就不存在,特别是在电气故障损坏磁盘的情况下。
克里斯·H

接受的答案很棒,它包含了我要说的内容以及更多其他内容。基本上,您正在恐慌SATA控制器,这是一种非常重要的系统设备,继而会导致Windows崩溃。我确实想知道是否在BIOS中启用AHCI /“热插拔”是否可以改善这种情况。
亚瑟·凯

Answers:


170

这是SATA次优的领域之一。问题出在存储设备互连协议级别,因此与您正在运行的软件无关。使用另一台文件复印机或另一台操作系统不会神奇地使事情变得更好,只是它可能会尝试设置不同的超时值以减少问题的影响(这可能会或可能不会,具体取决于硬件和固件;请参见下文)。 )。

这里有一些要点:

  1. 使用SATA,如果驱动器停止响应,则可能会占用整个存储系统,而不仅仅是出现问题的一个驱动器。当然,它有可能捆绑整个控制器,并且由于大多数消费者系统只有一个磁盘控制器(集成在主板上的一个磁盘控制器),因此意味着所有存储空间。如果驱动器以某种非标准和/或意外的方式发生故障,则更糟,如果驱动器处于临界状态,则肯定会发生这种情况。您可能对以下硬件感兴趣:硬件SATA RAID-10阵列中的单个磁盘如何使整个阵列停止运转?服务器故障。
  2. 大多数消费者SATA驱动器具有较长的默认超时时间(以分钟为单位),并且许多消费者SATA驱动器缺乏可配置的错误恢复控制。所谓的“ NAS”驱动器通常具有可配置的ERC,而高端驱动器实际上总是如此。此类驱动器的默认超时时间也可能较短(常见值为7秒)。如果驱动器仅保留数据副本,则较长的超时时间是有利的,这在用户系统上很常见;它们在冗余配置中是不利的,或者您只是想在驱动器进一步恶化之前尽可能多地离开驱动器。
  3. 驱动器将继续尝试读取坏扇区,直到达到超时阈值或主机发出中止信号为止。由于可以通过等待读取完成来捆绑SATA总线,因此操作系统可能无法发出存储级命令中止的信号,并且在极端情况下,驱动器甚至可能无法很好地响应SATA总线复位在这种情况下。

第一点是服务器上SAS的主要卖点之一;SAS有显著比SATA更好的错误处理。第2点是驱动器固件的限制,第3点实际上仅是由于#2而成为问题。

因此,发生的情况是操作系统向磁盘发出了“读取扇区”命令,并且特定的扇区受到了某种程度的损坏。因此,磁盘进入重试模式以尝试从磁盘中取出数据,一次又一次地尝试读取,直到获得足够的数据以使磁盘自身的纠错(FEC)能够纠正剩余的错误。如果您不走运,可能永远都不会,但是驱动器将继续尝试相当长的时间,然后再决定读取不会成功。

由于操作系统正在等待读取,因此这至少会减慢复制到爬网的速度,并且取决于确切的OS体系结构,可能会导致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的小众市场),因此它的错误处理功能和要求(或保证)可能被认为足以满足其预期的使用情况。


19
感谢您实际发布一个明智的答案,以解释发生了什么。在这种问题中,我通常会看到一些模糊的答案,例如“因为系统正在等待驱动器”或“因为它是按照这种方式设计的”。
Mehrdad 2015年

4
@kasperd:差不多。尽管它的一部分也是Windows的“故障”,但使用多个控制器也很容易发生。IMO认为这个答案有些含糊,因为企业SAS控制器也不能幸免。它实际上可以归结为某些阻塞的I / O请求。某些硬盘驱动器操作要求确保操作X必须在操作Y之前完成,并且如果X从未完成,则Y将永远无法开始-以及在Y卡住之后的任何事情,无论驱动器,控制器,驱动器或操作系统是否处于运行状态,故障。
2015年

2
@JustAMartin实际上,几乎所有异步-现在支持DMA的任何外设都充满了异步;内核仅调度请求并处理表明请求已完成的中断。问题在于,有时您必须等待操作完成-在此过程中,它们可能会阻塞重要的事情。正如user20574所指出的,虚拟内存就是其中之一,但是很多事情需要一些保证。内核的某些部分不是异步的,当然,某些驱动程序/设备只是很烂。
罗安2015年

2
@MichaelKjörling “由于操作系统正在等待读取,这至少会减慢复制到爬网的速度,并且取决于确切的OS体系结构,可能会导致OS在整个过程中变得生涩甚至冻结。” -从辅助(非系统)驱动器读取数据时,为什么OS会变得混乱?问题不能完全归因于SATA控制器的错误处理行为。我认为该答案可能会受益于Windows如何处理其磁盘子系统中的错误的信息。
约旦·里格

1
@MichaelKjörling足够公平。答案有很多有用的信息,但是我认为这并不能完全解释OP的特定情况。要换一个角度来看,您是否可以引用任何参考文献来备份您的观点1:“使用SATA,如果驱动器停止响应,这可能会占用整个存储系统,而不仅仅是一个有问题的驱动器当然,它有可能束缚整个控制器。” ?这似乎是一个糟糕的设计。难道不是OS磁盘子系统是元凶?即控制器是异步的,但OS驱动程序有时会不必要地阻塞。
约旦·里格

3

如上所述,由于硬盘驱动器损坏而导致的系统冻结问题主要是由于硬盘驱动器长时间尝试从坏扇区中恢复无法读取的数据。企业驱动器的卖点之一是故障扇区的读取超时非常短。使用企业级驱动器可以在某种程度上减轻您的问题,但不能解决问题。

最好的答案是保持适当的备份,以便不需要恢复。更改恢复软件不会有任何变化,因为这是固件超时问题。


2

为什么损坏的硬盘会冻结整个系统?

他们不必(通常)。磁盘故障的处理方式取决于特定的文件系统。

考虑一下ZFS,它是从头开始设计的,可以处理一定的容错能力。这是一个演示视频(还有一个更多的解释),他们将正在运行的驱动器放在砧上,用大铁锤摆动,然后钻另一个驱动器。ZFS一直在运行。


2
实际上,ZFS无法很好地解决磁盘故障。例如,在冗余或非冗余设置中,在I / O请求超时之前的读取时间非常长。(您可以以没有冗余的方式轻松地设置ZFS。)这很容易导致驱动器从ZFS中的阵列中抛出,如果这使您降至冗余阈值以下,则可能导致整个阵列失效。变得不可用。如果使用failmode = wait设置,则可以显示类似的结果。对于任何存储子系统,全盘全盘故障都是最容易发生的情况。是边缘驱动器引起了问题。
2015年

在您认为相反之前,我实际上是亲自运行ZFS(几乎全部)。如果您小心一点并且知道自己在做什么,那么它是一个很棒的文件系统和一个很棒的卷管理器。但是,它是为企业级系统(高端工作站和服务器)设计的,让管理员付费了解他们在做什么。它不能很好地处理商品硬件中出现的某些故障模式,包括RAM问题和从I / O请求返回所需的时间过长的驱动器,并且其设计也不便于家庭用户或在家庭中使用。家庭用户用例。
CVn 2015年

除视频中外,ZFS不会继续运行。断开驱动器连接后,它将再次开始运行。
ChristofferHammarström,2015年

-2

我认为您遇到的问题是操作系统的低级部分,在放弃之前,它会尝试多次读取坏块。如果在引导或其他独立操作期间需要此例程,则该例程在较低级别上实现,因此很难使其重入。在正常操作期间,操作系统将连续进行页面调度,并且很难为竞争请求赋予优先级,因为低级系统将不知道拥有寻呼请求的进程的优先级。


6
“低级系统” 确实知道请求页面的进程的优先级。尽管实现取决于系统如何处理优先级,但此类信息保存在页表中。但是,这不是该问题的正确答案-这是硬件问题,而不是操作系统问题。
克里斯·西里菲斯

1
我认为问题的正确答案是拒绝使用错误的驱动器。但是,这不能满足那些想恢复尽可能多的数据的用户的需求。
jrrk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.