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

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

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

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

我在几乎每个损坏的硬盘和每台 Windows PC 上都遇到过这个问题。

我希望只有我用来复制文件的程序才会冻结(Windows 资源管理器等),但我的整个电脑却变得很不稳定,并且在从损坏的驱动器复制文件时我无法浏览网页或看电影。

故事很长。

我住在农村地区,那里电力供应存在问题(电压下降等)。我自己使用的是 UPS,我的硬盘完全没问题。但我的邻居经常寻求帮助解决他们的 PC 问题,我经常发现他们的硬盘损坏了,很可能是因为电力问题。当然,在更换损坏的硬盘后,我会建议邻居购买 UPS。

我一直想知道,为什么我的电脑在从损坏的驱动器中检索数据时会完全冻结。这是硬件问题吗?是由操作系统读取数据的方式引起的吗?这是 Windows 特有的问题吗?在 *nix 上我不会遇到这种情况吗?

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

这不是帮助请求,而更多是出于教育目的,所以我知道为什么事情会这样运作。

答案1

这是 SATA 不太理想的领域之一。问题出在存储设备互连协议层面,因此与你运行的软件无关。使用另一台文件复制器或另一个操作系统并不能神奇地让情况变得更好,除非它可能会尝试设置不同的超时值以减少问题的影响(这取决于硬件和固件,也可能不可以;见下文)。

这里有几个重点:

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

要点 1 是SAS在服务器上;SAS 有显著地比 SATA 更​​好的错误处理。第 2 点是驱动器固件限制,而第 3 点之所以成为问题,实际上只是因为第 2 点。

那么会发生什么操作系统向磁盘发出“读取扇区”命令,而特定扇区不知何故受损。因此,磁盘进入重试模式,尝试从盘片上取下数据,一次又一次尝试读取,直到获得足够好的数据,磁盘自身的纠错(前向纠错) 能够纠正剩余的错误。如果您运气不好,这可能永远不会发生,但驱动器将继续尝试相当长一段时间,然后才决定这次读取不会成功。

由于操作系统正在等待读取,这至少会使复制过程变得缓慢,并且根据确切的操作系统架构,可能会导致操作系统变得不稳定甚至在持续时间内冻结。此时,磁盘正忙于原始读取,直到当前正在执行的命令结束(成功或失败)后才会响应进一步的读取命令,而其他软件通常不会比它所运行的操作系统表现更好。

因此,任何触发其他地方读取的行为(理想情况下,仅在损坏的驱动器上)将必须排队等待,直到损坏的驱动器成功读取相关扇区,或者确定无法读取。由于 SATA 对无响应驱动器的处理不够理想,这可能意味着不仅您正在复制的驱动器的 I/O 会延迟。这还很容易导致其他软件变得缓慢或无响应,因为该软件会等待不同的 I/O 请求完成,即使操作系统能够应付。

这里还需要注意的是,即使您没有明确访问磁盘上的任何文件,也可能发生磁盘 I/O。造成这种情况的两个主要原因是按需加载可执行代码和交换。由于有时即使系统没有内存压力也会使用交换,并且按需加载可执行代码在现代系统和现代可执行文件格式中很常见,因此在正常使用期间发生意外的磁盘读取活动是非常有可能的。

正如对该问题的评论所指出的那样意大利,一种缓解策略是使用不同的存储互连,这是一种复杂的说法“将磁盘放入 USB 外壳中”。通过抽象USB大容量存储协议,这会将有问题的 SATA 部分与系统的其余部分隔离开来,这意味着理论上,只有该特定磁盘上的 I/O 才会受到该磁盘上的 I/O 问题的影响。

顺便说一句,这就是为什么 SATA(特别是没有驱动器级 ERC 的 SATA)通常不建议用于 RAID(尤其是RAID 级别具有冗余,在标准中除了RAID 0);较长的超时时间和较差的错误处理很容易导致整个设备因单个坏扇区而脱离阵列,如果存在冗余,并且存储控制器知道这是问题所在,那么 RAID 控制器可以很好地处理这种情况。SAS 是为大型存储阵列设计的,因此预计偶尔会出现各种驱动器问题,这导致它被设计为处理单个有问题的驱动器或 I/O 请求的情况优雅地即使驱动器没有。有问题的磁盘在消费系统中并不常见,因为这些系统往往没有安装很多磁盘,而安装的磁盘实际上从来没有冗余;由于 SATA 旨在取代 PATA/IDE 而不是 SCSI(后者是 SAS 所针对的利基市场),因此它的错误处理功能和需求(或保证)很可能被认为足以满足其预期的用例。

答案2

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

最好的答案是,继续保持适当的备份,这样就不需要恢复了。更换恢复软件不会有什么不同,因为这是一个固件超时问题。

答案3

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

他们不必(一般来说)。这实际上取决于如何处理磁盘故障的特定文件系统。

以 ZFS 为例,它从一开始就被设计用来处理相当多的容错问题。下面是演示视频(和一个有更多解释),他们将正在运行的驱动器放在铁砧上,用大锤敲打并钻出另一个驱动器。与此同时,ZFS 保持运行。

答案4

我认为您遇到的问题是操作系统的低级部分在放弃之前尝试多次读取坏块。此例程是在低级实现的,以防在启动或其他独立操作期间需要它,因此很难使其可重入。操作系统将在正常运行期间不断分页,并且很难为竞争请求赋予优先级,因为低级系统不知道拥有分页请求的进程的优先级。

相关内容