我们的服务器有两块独立硬盘,没有RAID。
一个硬盘仅用于存储垃圾/临时数据,我们通常使用 LRU 算法删除临时数据。
我们在那个硬盘里有一个 10k 文件,有些文件无法读取(我们不知道为什么)。
我们已经fsck
在这个磁盘上完成了操作,第一次运行时它说它修复了一些错误,但问题仍然存在。
每当我们尝试读取这个无法读取的文件时,我们的平均负载就会升高:
cp: overwrite `/tmp/t.mp4'? y
cp: reading `mq/full/68156.3gp': Input/output error
- 是否可以找到不可读文件的列表?
- 导致此问题的原因是什么?
- 如何解决这个问题?
答案1
根据目前描述的症状,最可能的解释是您的硬盘有一些坏扇区。
您可以尝试使用救援将所有好的扇区复制到新磁盘。这样应该可以恢复所有可以恢复的文件,其余文件在读取时会给出错误的数据。
您看到高平均负载的原因是,一旦您尝试读取坏扇区,硬盘就会非常努力地读取该扇区。与此同时,尝试访问磁盘的所有其他程序都必须等待。平均负载会计算队列中的所有内容。
一旦出现 EIO 错误,负载就会迅速下降。但由于平均负载在一段时间内呈指数衰减,因此在负载消失后,该数字仍会保持较高水平一段时间。
没有报告任何问题的原因fsck
是它检查元数据的逻辑完整性。为了做到这一点,它不需要读取任何文件的实际内容。对于 的正常使用来说,读取文件的所有内容会太慢fsck
。
一旦您尝试读取文件并出现错误,您应该能够通过查看内核日志(通过运行dmesg
或查看日志文件)来验证发生了什么。
尝试读取磁盘上的每个文件是查找所有受影响文件的一种方式,但这不是最快的方式。仔细解释 ddrescue 的输出可能是识别哪些文件受到影响的最快方式。