DDR4メモリ容量16GBでは不便を感じるようになり32GBのメモリを購入しました。
32GBメモリに交換してPCを起動したところ、やたらブラウザが異常終了する、日々使っているアプリも時折異常終了するようになりました。
BIOSをいじりメモリ動作クロック数を下げたりタイミング(CLなど)を変えることで改善されたのですが、やはりブラウザの異常終了が発生したので販売店で交換してもらうことになりました。
良い機会と考え、PCを使いながらDRAMメモリのビット化けを発見する方法を考えてみました(注意、ビット化けを防ぐ方法ではありません)。
使用OS Linux
0.準備
・PC本体を開けメモリスロットにきちんとメモリが刺さっているか確認する(コネクターが硬いので浮いてたりする)。
・BIOS(UEFI)のメニュー画面を表示して、メモリ周波数やタイミングが自動設定になっていることを確認する。
1.MemTest86+を使う(OSを起動できないのでPCが使えない)
BIOS(UEFI)->GRUB2から起動してメモリ全体を検査できます。
最近はHDD(SSD)には標準ではインストールされないようです。Linuxをインストールする際に使用したLiveUSBには入っているはずです。もしLiveUSBが見当たらないようなら https://www.memtest.org/ からisoファイルがダウンロードできます。
(UbuntuのLiveUSBを起動。一番下の"Test memory"がMemTest86+。Enterキーを押下すれば下記の画面に変わります)
(3秒ほどすると自動的にメモリチェックが開始しされ、永遠にチェックします。好きなタイミングでPCの電源を切って終了させてください)
私の環境(DDR4-2666 32GB)では1パスに2時間ほどかかりました。長時間実行するほどビット化けを発見してくれるのですが何日もPCが使えなくなるのは困ります、一晩(2〜4パス)くらい実行するのが妥協点のようです。
(実際にエラーが出たところです)
この調査方法のデメリットはなんといっても、Linux(OS)を起動することができないので長時間PCが使えなくなることです。それでもメモリ全体を調査できるので実行しておきたい調査方法です。
2.tmpfsを使いsha256sumで調べる(Linux上なのでPCが使える)
tmpfsはRAMディスクを作るファイルシステムです。sha256sumはファイルの整合性を調べるコマンドです。この2つを使うことでメモリのビット化けを発見できます。
tmpfsは使用した分しかメモリを消費しません。メモリの空きが多い場合は多くのファイルを作りメモリが逼迫すればファイルを消せば効率的にビット化けの検査ができます。
私はPCを使わないときは電源を切らずにスリープモードにしています。sha256sumを使えばスリープの最中に起きたビット化けも発見できます。
#RAMディスクの作成
sudo mkdir /tmp/test_ramdisk
sudo chmod 777 /tmp/test_ramdisk
sudo mount -t tmpfs tmpfs /tmp/test_ramdisk
#ディレクトリを移動
cd /tmp/test_ramdisk
#(ddコマンド、sha256sumコマンドともに少々時間(30秒くらい)がかかります。その間は何も表示されません)
#RAMディスクに2GBのファイルを2つ作る(中身はランダム)
dd if=/dev/urandom of=random1.bin bs=1M count=2048
dd if=/dev/urandom of=random2.bin bs=1M count=2048
#各ファイルのハッシュ値を計算してSHA256SUMSファイルに書き込む
sha256sum random1.bin random2.bin > SHA256SUMS
#(cat SHA256SUMS でファイル内を見れば、1行ごとにハッシュ値とファイルが並んでいるのがわかります)
#検証
sha256sum -c SHA256SUMS
> #表示される検証結果(OKは正常 / FAILEDは異常)
> random1.bin: OK
> random2.bin: OK
#RAMディスクに2GBのファイルを追加する場合(中身はランダム)
dd if=/dev/urandom of=random3.bin bs=1M count=2048
#ファイルのハッシュ値を計算してSHA256SUMSファイル書き込む
#注意、 > ではなく >>
#>は上書き。>>は追加(>>でSHA256SUMSに書き込んだ場合、3行目が追加される)
sha256sum random3.bin >> SHA256SUMS
#検証は同じコマンド&オプションでOK
sha256sum -c SHA256SUMS
> #表示される検証結果(OKは正常 / FAILEDは異常)
> random1.bin: OK
> random2.bin: OK
> random3.bin: OK
#ファイルを消す場合
rm random1.bin
#(ファイルを消せば、今まで確保していたメモリ領域が解放され、そのメモリ容量を他で使うことができます)
#検証
sha256sum -c SHA256SUMS
> #表示される検証結果(OKは正常 / FAILEDは異常)
> sha256sum: random1.bin: No such file or directory
> random1.bin: FAILED open or read #random1.binは消したので異常
> random2.bin: OK
> random3.bin: OK
> sha256sum: WARNING: 1 listed file could not be read
#(SHA256SUMSファイルはテキスト形式です。
# テキストエディタで開き、消したファイルの行を削除すればエラーは出ない)
メモリの部分的な調査になりますが、大量のデータをコピーすると極まれに読み込めなくなるファイルができるなどの症状がある場合は試してみる価値があります。
3.VirtualBox上でMemTest86+を実行
物理PCでMemTest86+を実行してしまうと、その間PCが使えなくなってしまいます。VirtualBoxなどの仮想PCを使えば部分的とはいえPCを使いながらビット化けの検査ができます。
懸念点
VirtualBox上でMemTest86+を実行してビット化けの検査ができるのだろうか?そう感じるはずです。調べてみとVirtualBoxの仮想PCに割り当てたメモリが物理メモリから消費され、MemTest86+に表示される転送速度も物理PCのと大差ないことから物理メモリをそのまま(ソフトウェアで圧縮やECCチェックなどせずに)使用していると考えられます。仮想PCに割り当てた物理メモリの範囲でしかビット化け検査はできませんがそれでも検査できないよりは有意義でしょう。
A.Swapメモリについて
メモリ不足が発生した際にHDD(SSD)をメモリの一部として使う便利な機能ですが、今回の検査には向きません。
注意!
Swapメモリを使っている場合はメモリ容量いっぱいに達してなくてもスワップが発生します。今回の検査はメモリを網羅的にアクセスするのでスワップアウト・インが頻発してHDD(SSD)を傷める可能性があります。
Swapメモリを使っている場合はスワップが発生しない(頻発しない)メモリ容量で検査をしてください。
私はSwapメモリを使っていないのでメモリ容量いっぱいまでメモリを使用するとキャッシュの破棄と読み込みを繰り返すためなのかHDDが動きっぱなしになってOSがハングします。ただメモリ上限を気にしていれば問題はありません。
B.感想
ビット化けが起こるDDR4メモリで上記の検査をしたところ、すべての検査でビット化けを何度か検知しました。その高い発生率でもOSがハングすることはありませんでした。メモリのビット化けが頻繁に起こっていてもOSは普通に使えることに驚きました。
考えてみると、メモリを大量に使う箇所は画像・動画データ、音楽・音声データだったりします。確率的にはこれらのデータがビット化けする可能性が高く、これらのデータがビット化けしたところで、画像1ピクセルの色が変わる程度なのでユーザが気づくことはほぼありません。
まとめ
DRAMメモリのビット化けが起こっていても思った以上に気づきにくいです。極まれにブラウザが落ちる。HDD(SSD)のファイルが壊れたことがある。などの人はメモリのビット化けを疑ってみることをおすすめします。
物理PC上でMemTest86+を実行してしまうと長時間PCが使えなくなりますが、VirtualBox上ならPC作業をしながらMemTest86+でビット化けの検査ができます。sha256sumを使うことでPCをスリープで休まさせている間のビット化けの調査もできます。
注意点として、Swapメモリを使っている場合はスワップが発生しない(頻発しない)メモリ容量で検査をしてください。