メモリキャッシュがディスクとの同期を失っています

メモリキャッシュがディスクとの同期を失っています

(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

やり直したところ、まだ期待していた値ではありませんが、一貫性が保たれているようです。確かに、メモリキャッシュの内容がディスク上の内容と異なっていたこれが大きな問題です。

ダウンロードを修正するために、ソース マシンでトレントを作成し、ターゲット マシンで開きました。約 3.0 GB のうち 5 つの 1 MB チャンクが整合性チェックに失敗しました。トレントを使用してこれらのファイル チャンクを修正し、ファイルの整合性が正常であることを確認しました。

ここで問題となるのは、データがどこで同期しなくなったかを判断することです。

  1. 私はメモリをテストしましたメモリテスト86+ビットフェードテスト以外はすべて正常です。メモリモジュールに障害があるのではないかと予想していましたが、何もありませんでした。すべて正常です。
  2. ファイルシステムは、LVM2 上の 3 ディスク RAID5 アレイ上の Ext4 です。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 つありました。

答え1

ファイルの md5sum が変更された場合、可能性の高い順にいくつかの説明が考えられます。

  • ファイルに書き込みが行われました。
  • RAM に欠陥があります (またはマザーボードの別のコンポーネントに欠陥がありますが、RAM は最も故障しやすいコンポーネントです)。
  • ストレージに欠陥があります。(ストレージに欠陥があると、データが破損するのではなく、ファイルが読み取れなくなることが多いため、その可能性は低いです。)
  • カーネルのバグ。おそらくファイルシステム コード内にあります。(ext4 ではほとんど起こりません。)

「ディスクとキャッシュの不一致」は原因ではなく症状であることに注意してください。これは観察された症状ではありません。観察されたのは、時刻 T のメモリと時刻 T' のメモリの違いです。

ファイルが変更されていないことが確実な場合は、RAM の欠陥が原因である可能性が最も高いです。残念ながら、メモリ テストでは常に RAM の欠陥が検出されるとは限りません。ファイルの 2 つの異なるコピーを取得できる場合は、それらを比較します ( cmp -l file1 file2)。違いが揃っている場合 (たとえば、違いは常に 16 バイト シーケンスの 42 番目のビットにあります)、またはずれたブロックで構成されている場合 (ポインタ変数に破損が発生している兆候)、すべての兆候は RAM の欠陥を示しています。

関連情報