サーバやワークステーションのメインメモリに使われるDRAMは、宇宙から地上にやってくるアルファ線や中性子線によりビット反転してしまう危険性を持っています。この現象は、メモリが壊れてしまっているわけではないのでソフトエラーと呼ばれており、避けることができません。また、DRAMセルが壊れてしまったり、セルに蓄えられている"0"、"1"の情報を読み取るセンスアンプという回路が壊れてしまうような場合にも、ビットが反転してしまいます。大切なデータが反転してしまっては困りますので、サーバやワークステーションでは、例えばビットエラーを自動で修正したり、修正不能な場合でもビットエラーが起こったことを、検出することができるECCメモリが使われています。

LinuxにはEDACというドライバがあり、それを用いることでメインメモリやPCIバスのビットエラーを検出することが出来ます。

具体的には、Memory Controller Hub(一般にノースブリッジと呼ばれるマザーボード上のチップ)をPCIデバイスとして扱うことで、そこから Correctable Error 、 Uncorrectable Error といったエラー情報を読み出し、ログに残したりカーネルパニックを起こしたりするといった動作をします。

EDACはチップセットの機能を利用するので、チップセット毎に対応するドライバを用意しなければなりません。 ところがIntel社のX38チップセット用のEDACドライバは用意されていませんでしたので、今回それを作成しました。こちらが、そのコードになります。


このコードをEDACを管理しているbluesmokeプロジェクトのメーリングリストにそのモジュールを投稿したところ、Linuxカーネルの2.6.28-rc3にマージされました(ChangeLog、X38 という文字列で検索)。


当社で扱っているサーバでも、X38を利用しているものがあります。実際にこのサーバとECCのチェックのためにデータピンを削ったメモリを使用し、動作を確認しています。

Image

カーネルログにEDACのエラーログが出力される
EDAC MC0: CE page 0x0, offset 0x0, grain 536870912, syndrome 0xc1, row 0, channel 0, label "": x38 CE
EDAC DEBUG: MC0: x38_check()
EDAC MC0: CE page 0x0, offset 0x0, grain 536870912, syndrome 0xc1, row 0, channel 0, label "": x38 CE
EDAC DEBUG: MC0: x38_check()
EDAC MC0: CE page 0x0, offset 0x0, grain 536870912, syndrome 0xc1, row 0, channel 0, label "": x38 CE
EDAC DEBUG: MC0: x38_check()
EDAC MC0: CE page 0x0, offset 0x0, grain 536870912, syndrome 0xc1, row 0, channel 0, label "": x38 CE
EDAC DEBUG: MC0: x38_check()
EDAC MC0: CE page 0x0, offset 0x0, grain 536870912, syndrome 0xc1, row 0, channel 0, label "": x38 CE

まだrcの段階なので正式リリースではありませんが、2.6.28のリリースには含まれる予定です。チップセットとしてX38を搭載し、ECC対応のメモリを搭載したマシンを利用している場合は、このモジュールを利用することでメモリエラーを検出することが可能になります。是非お使い下さい。