无法读取硬盘上的某些文件

我们的服务器有两个独立的硬盘,没有RAID。

一个硬盘只是用来存储垃圾/临时数据,我们通常使用LRUalgorithm删除临时数据。

我们在这个硬盘上有一个10K的文件,有些文件是不可读的(我们不知道为什么)。

我们已经在这个磁盘上做了fsck ,第一次运行时它说修复了一些错误,但问题仍然存在。

每当我们尝试读取这个不可读的文件时,我们的负载平均值变高:

 cp: overwrite `/tmp/t.mp4'? y cp: reading `mq/full/68156.3gp': Input/output error 
  1. 有没有可能find一个不可读的文件列表?
  2. 造成这个问题的原因
  3. 如何解决这个问题?

根据目前所描述的症状,最可能的解释是您的硬盘有一些坏道。

您可以尝试使用ddrescue将所有好扇区复制到新磁盘。 这应该恢复所有的文件,可以恢复,其余的将在阅读时给不正确的数据。

您看到高负载平均值的原因是,一旦您尝试读取坏扇区,硬盘将尽力读取该扇区。 与此同时,其他所有尝试访问磁盘的服务器都必须等待。 平均负载计算队列中的所有内容。

一旦你得到EIO错误,负载将很快下降。 但是由于负荷平均值在一段时间内是指数衰减的平均值,所以在负荷消失之后,负荷值会保持一段时间。

fsck没有报告任何问题的原因是它检查元数据的逻辑完整性。 为了这样做,它不需要读取任何文件的实际内容。 读取文件的所有内容对于正常使用fsck来说太慢了。

一旦你试图读取一个文件并得到一个错误,你应该可以通过查看内核日志(通过运行dmesg或查看日志文件)来validation发生的事情。

尝试读取磁盘上的每个文件是查找所有受影响的文件的一种方法,但不是最快的。 仔细解读ddrescue的输出可能是识别哪些文件受到影响的最快方法。