Jul*_*ano 7 memory linux cache
(Ubuntu Linux 服务器,64 位)我正在对刚刚下载的文件(~3.0 GB)进行故障排除,但是当我发现一些非常不寻常的东西时,它没有通过完整性测试。
首先这是下载后文件的MD5,与预期值不匹配:
~% md5sum media.iso
5d74facb904cc1765a468354908a8f34 media.iso
Run Code Online (Sandbox Code Playgroud)
一段时间过去了,在此期间应该没有任何更改文件,但是当我再次检查文件时:
~% md5sum media.iso
a5b97c5016afb39bd67ccfc3fa6ca59e media.iso
Run Code Online (Sandbox Code Playgroud)
这真是出乎意料。由于我有很多 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
Run Code Online (Sandbox Code Playgroud)
我重做了它,现在它似乎保持一致,尽管这仍然不是我期望的值。当然,内存缓存中的内容与磁盘上的内容不同。这是大问题。
为了修复下载,我在源机器上创建了一个 torrent 并在目标机器上打开它。大约 3.0GB 中的五个 1MB 块未通过完整性检查。我使用 torrent 来修复这些文件块以及文件完整性如何。
现在的问题是确定数据在何处不同步。
关于我还可以检查什么的任何想法,或者缺陷/错误到底可能在哪里?
它是 Ubuntu 10.10 64 位、Core i7 930、6 GB 非 ECC RAM。
更新:我确认文件已正确写入磁盘,从磁盘读取页面后,在内存中的页面正在更改。我做了更多的 memtest(我让它在一夜之间做一点淡化测试),但仍然没有。所有内存模块看起来都不错。
还有一些测试:
~% 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
Run Code Online (Sandbox Code Playgroud)
(direcat是一种cat读取方式O_DIRECT,即绕过页面缓存)
有一个明确的模式:它总是发生在 16 字节对齐中的第二个字节。在那个字节中,几乎总是第 4 位 (LSB) 翻转为 1,但有一个实例中第 2 位翻转为 0。
如果文件的 md5sum 更改,则有几种可能的解释,按可能性排序:
请注意,“磁盘和缓存之间的不一致”是一种症状,而不是原因。这甚至不是您观察到的症状:您观察到的是 T 时刻的记忆和 T' 时刻的记忆之间的差异。
如果您确定文件没有被修改,那么最有可能的解释是 RAM 有缺陷。不幸的是,内存测试并不总能检测到坏的 RAM。如果您可以获得文件的两个不同副本,请比较它们 ( cmp -l file1 file2);如果差异是对齐的(例如差异总是在 16 字节序列的第 42 位)或由移位块组成(指针变量发生损坏的标志),则所有标志都指向有缺陷的 RAM。