内存缓存与磁盘失去同步

内存缓存与磁盘失去同步

(Ubuntu Linux 服务器,64 位)我正在对刚刚下载的文件(~3.0 GB)的问题进行故障排除,但它未通过完整性测试,这时我发现了一些非常不寻常的事情。

首先这是下载后文件的MD5,与预期值不匹配:

~% md5sum media.iso 
5d74facb904cc1765a468354908a8f34  media.iso

一段时间过去了,在此期间文件应该没有任何改变,但是当我再次检查文件时:

~% md5sum media.iso
a5b97c5016afb39bd67ccfc3fa6ca59e  media.iso

这真是出乎意料。由于我有很多 RAM,我怀疑这是缓存的影响,并且出了问题。我决定用磁盘上的整个文件重试,令我惊讶的是:

~% sudo sysctl -w vm.drop_caches=3    # This linux command invalidates
vm.drop_caches = 3                    # everything in the memory cache.
~% md5sum media.iso
2992aa6270f6e1de9154730ed3beedc1  media.iso

我重做了它,现在它似乎保持一致,尽管这仍然不是我期望的值。当然,内存缓存中的内容与磁盘上的内容不同。这是个大问题。

为了修复下载问题,我在源机器上创建了一个 torrent,并在目标机器上打开了它。约 3.0GB 的文件中有 5 个 1MB 的块未通过完整性检查。我使用 torrent 修复了这些文件块,文件完整性检查结果正常。

现在的问题是确定数据在哪里不同步。

  1. 我测试了内存memtest86+,除了位衰减测试之外。我原本以为会看到一些故障的内存模块,但什么也没有。一切都正常。
  2. 文件系统是 Ext4,基于 LVM2,基于 3 磁盘 RAID5 阵列。Ext4 被认为是稳定的,如果磁盘之间的数据不一致,mdadm 会发出警告。但日志中没有任何内容。SMART 错误日志很干净,磁盘是新的(“通电时间”少于 30 天)。
  3. 我正在寻找有关当前内核(2.6.35)中任何数据丢失错误的信息,但据我所见,似乎没有任何东西。

还有什么想法我还可以检查吗,或者缺陷/错误可能到底在哪里?

它是 Ubuntu 10.10 64 位、Core i7 930、6 GB 非 ECC RAM。


更新:我确认文件已正确写入磁盘,页面在从磁盘读取后(在内存中)被更改。我做了更多内存测试(我让它整夜进行位衰减测试),但仍然没有结果。所有内存模块似乎都正常。

更多测试:

~% md5sum media.iso 
cc8bcf1ce67ff7704eadc2222650c087  media.iso
~% cp media.iso tmp1
~% md5sum tmp1 
bde6c54b2d7b03404b43056b908036ed  tmp1
~% md5sum media.iso 
134f607cf4c633ef11d2576d1c635d08  media.iso    # ← THIS IS THE CORRECT VALUE
~% cmp -l media.iso tmp1
  98697009 101 121
~% udiff <(xxd -s ... media.iso) <(xxd -s ... tmp1 )
--- /proc/self/fd/11    2010-11-03 14:52:55.649433000 -0200
+++ /proc/self/fd/13    2010-11-03 14:52:55.649433000 -0200
@@ -13,7 +13,7 @@
 5e1fef1: 280f 5a87 37d2 e6d6 647d bebe f04e 64d8  (.Z.7...d}...Nd.
 5e1ff01: 19a5 2ff4 178b 1e37 afb0 e914 e03f bd62  ../....7.....?.b
 5e1ff11: 2b8d 4245 985f a9f8 a993 1f51 6d31 30e7  +.BE._.....Qm10.
-5e1ff21: 8274 0d35 ab8f 86b7 130f e1d7 20c6 3541  .t.5........ .5A
+5e1ff21: 8274 0d35 ab8f 86b7 130f e1d7 20c6 3551  .t.5........ .5Q
 5e1ff31: 387b f226 6348 fabc 1eae 67ef adda c3b6  8{.&cH....g.....
 5e1ff41: a931 bf29 690f 25f9 8922 6dcc 009f 60a5  .1.)i.%.."m...`.
 5e1ff51: 559a 9d03 92cb fb5c a75f a26e 0954 0af4  U......\._.n.T..

~% md5sum media.iso        
54d67cc4dcad49b6d1bf6619074b471c  media.iso
~% direcat media.iso|md5sum
134f607cf4c633ef11d2576d1c635d08  -
~% direcat media.iso | cmp -l media.iso -
  98697009 121 101
 231297649 146 147
 519630641 177 157
2291859249 377 357
2442055473 127 107
2907131697 171 151

(是使用 读取的direcat版本,即绕过页面缓存)catO_DIRECT

有一个明显的规律:它总是发生在 16 字节对齐中的第 2 个字节上。在该字节中,位 4 (LSB) 几乎总是翻转为 1,但有一次位 2 翻转为 0。

答案1

如果文件的 md5sum 发生变化,则有几种可能的解释,按可能性排序:

  • 该文件已写入。
  • 您的 RAM 有缺陷(或另一个主板组件,但 RAM 是迄今为止最容易出现故障的)。
  • 您的存储存在缺陷。(不太可能,因为存储缺陷通常会导致文件无法读取,而不是数据损坏。)
  • 内核错误,可能存在于文件系统代码中。(ext4 不太可能出现这种情况。)

请注意,“磁盘和缓存不一致”是一种症状,而不是原因。它甚至不是您观察到的症状:您观察到的是时间 T 的内存与时间 T' 的内存之间的差异。

如果您确定文件未被修改,则最有可能的解释是 RAM 有缺陷。遗憾的是,内存测试并不总能检测到坏的 RAM。如果您可以获得文件的两个不同副本,请比较它们 ( cmp -l file1 file2);如果差异是对齐的(例如,差异始终位于 16 字节序列的第 42 位)或由位移块组成(指针变量发生损坏的迹象),则所有迹象都表明 RAM 有缺陷。

相关内容