ECCメモリ(Error Check and Correct Memory)

サーバ製品にはECCというエラー訂正機能をもったメモリが利用されています。ここではそのECCメモリの仕組みと、メモリエラーの検出方法、ソフトエラーとは何か、スクラビングの仕組みなどについて簡単に解説します。

DDR2の2GB,ECC対応メモリ。2GBの容量(1Gbit×16)に対して1Gbitのメモリチップが18個(片面9個)取り付けられている。

ECCメモリとは

メモリは故障してしまった場合あるいは正常な製品であっても宇宙線の影響で、メモリ素子のビットが反転が生じそれによってメモリ上に記録されているデータが壊れてしまうことがあります。ECCメモリとはこの素子のビットの反転を検出して、可能であれば正しいビットに修正してくれる機能をもったメモリです。

一般的なECCメモリでは1ビット反転しただけの場合は正しいにビットに修正できます。2ビットが反転してしまうと正しいビットに修正することはできませんが、ビットの反転が発生したことは検知できます。

はじめにメモリにデータを記録するときにあとで検証するために利用する符号(検査ビット)を計算して、それを実データ(情報ビット)と一緒にメモリ上に保存しておきます(ハミング符号)。その後、読み出すときにその検査ビットを利用してデータが正しく読み出せているかを検証する仕組みです。つまりECCメモリでは検査ビットを保存しておく分だけ実際に表記されている容量よりも多くのメモリを搭載していることになります。検査ビットの長さは情報ビットの長さによって決まります。例えば情報ビット64bit単位でエラーの修正検出する場合必要な検査ビットの長さは7ビットになります。

alt

実際のデータ(情報ビット)に誤り検出用の検査ビットを付加して作成したハミング符号をメモリ上に保存しておく。

<alt

ECCメモリはメモリ上のデータが読み出される際に、検査ビットを利用してデータに誤りがないかを検証する。1bitの誤りであれば訂正して正しいデータにすることが可能。2bitが誤っていた場合、訂正はできないが誤りがあることを検出することはできる

ECCエラーのロギング

ECCメモリのエラーの修正/検出の機能はハードウェアだけで完結している仕組みですので、メインボード側がECCに対応していればメモリを取り付けておくだけで、OS側のドライバなどとは必要有りません。ただし、メモリのエラーの発生して、それがどのようなエラーだったのか(修正可能な1bitエラーなのか不可能な2bitエラーなのか)を知るためにはそのための仕組み(専用のソフトウェアなど)が必要です。

Linuxの場合、カーネルモジュールであるEDACモジュールや、mcelogツールなのでメモリエラーのログを取得できます。また最近のサーバではBMCと呼ばれる専用チップを搭載してハードウェア的な仕組みでシステムのイベントログを取得できるものもあり、その中でECCのエラーログも取得してくれるものもあるようです。

ECCメモリの動作状況をモニタリングしておくことは、メモリの物理的な故障をいち早く推測したり、2ビット以上のエラーが発生した際に、システムに対して適切な処理を取らせるためにも重要です。たとえば、特定のメモリアドレス上で継続的にエラーが発生している場合、物理的な故障が発生している可能性が考えられます。また、メモリ上で修正不可能なエラーが発生した場合、そのまま稼働しているとシステムが不安定になる可能性もあるのでシャットダウンなどの処置が必要となります。

ソフトエラー

さきほども述べたとおり、メモリのビットの反転は物理的にメモリが故障してしまっている場合以外にも、宇宙線(α線や中性子線)などがメモリに衝突した際に発生することもあります。これがソフトエラーと呼ばれるエラーです。このソフトエラーはメモリの品質の向上により以前よりも発生しにくくなっているようですが、半導体の集積度が上がると発生しやすくなってしまう関係上、メモリの大容量化のトレンドのなかでどうしてもある程度は発生してしまうようです。

ソフトエラーは一般的な環境下では単純な確率的現象と考えられていてメモリ上のどこの素子で発生するかはランダムです。必ずしもシステムにとってクリティカルなメモリ領域で発生するわけではなく、システムから利用されていない領域に発生した場合さほど問題にならないと考えられます。またシステムが稼働している時間が短ければ発生する可能性も低くなります。

ソフトエラーはメモリの物理的故障に起因するものではありせんのでソフトエラーが発生してもシステムの再起動をすれば元に戻ります。

したがって、システムに対してソフトエラーがクリティカルな影響を与える可能性は単純な発生確率よりも低く、短時間の稼働でそれが発生する可能性はもっと低くなります。また、いざとなったら再起動すればいいわけですから、毎日電源をON/OFFする家庭用のパソコンなどではあまり問題としなくてもいいとも考えられます。

しかし、メモリ上にクリティカルな領域が広く存在し、長時間稼働し続ける必要があり、おいそれとシステムの再起動ができないサーバなどではその発生は無視できないものとなります。

ECCメモリを利用すれば、ソフトエラーによる1ビットの反転が発生しても、それを修正してそのままシステムを稼働しつづけることができます。たとえ2ビットのエラーが発生した場合でもそれを検知して速やかにシステムに対し適切な処理(例えばシャットダウン)を取ることができれば被害は最小限に抑えられると考えられます。

alt

太陽や周囲の環境由来の宇宙線によってもビットの反転は引き起こされる。ECCメモリはビットの反転した瞬間にそのエラーを検出訂正してくれるわけではないので、長時間その反転した箇所にアクセスが無い場合、更にもう1bit反転して訂正が不可能になってしまう可能性がある。

メモリスクラビング

ECCメモリを利用すれば1ビットのエラーの発生は問題ないと考えられますが、あくまでそのエラーを検知して修正してくれるのは、そのエラーの発生した箇所のデータが参照されたときです。例えば、宇宙線がメモリに衝突してビットを反転させてしまったとしてその瞬間にそのエラーを検知してくれるわけではありません。つぎにその反転されたビットがOSによって参照されるまでそのビットは反転された状態のままです。そして運悪く、そのビットがOSによってに参照される前にその箇所の(近傍の)ビットに宇宙線が衝突してもう1ビット反転してしまったら、2ビット反転した状態になりもうエラーの修正はできなくなってしまいます。

このような事態を防ぐためにメモリスクラビングと呼ばれる機能が最近のサーバにはついています。メモリスクラビングとは直訳すればメモリを磨くといった意味ですが、OS側のメモリ参照要求とは関係なしに定期的にメモリ全体を読み出して、エラーが発生していないかを確認する機能です。エラーが確認された場合、1ビットの反転で修正が可能であればメモリ上のビットを反転させてエラーの発生している状態を解消します。また。2ビットのエラーだった場合はシステムに通知して適切な処理を取ってもらいます。この機能によってエラーが発生した状態のままメモリが長時間放置されてしまうことを防ぎます。

大容量メモリを搭載しているシステムではデータベースのキャッシュなどとして確保された領域が長時間アクセスも解放もされずに放置されてしまうようなケースが考えられます。OSや各アプリケーションで利用されるメモリ上のキャッシュはサーバの電源喪失によってその内容が失われたりすることに対してはハードウェア的あるいはソフトウェア的な対策が取られていることが多いですが、その内容が変化してしまうことに対してはあまり対策は取られていないと思われ、このような仕組みによってキャッシュ上のデータの一貫性を確保することは大切でであると考えられます。

このスクラビングにはメモリの帯域を利用するのでシステムに負荷がかかります。基本的にはシステムが低負荷でメモリをあまり利用していないときを狙って実行するようになっているようです。また余分なメモリの読み込みが実行されることになるので、その分電力を消費します。その関係かデフォルトではこの機能は無効になっている場合が多いようです。BIOS等の設定を有効にする必要があるかもしれません。

alt

定期的メモリスクラビングを実行することにより、メモリが1bitエラーの状態で長時間放置されないようにする。メモリスクラビングには定期的に実行する(パトロールスクラブ)モードの他に、メモリ読み出し時に通常のエラー検出訂正動作に加えて、正しい値をメモリに書き戻す動作をする(デマンドスクラブ)モードもある。

まとめ

ECCメモリは(メインボード側対応していれば)取り付けて置くだけで、メモリエラー対策とは有効です。しかしながら、より信頼性をなどを高めるためには、エラーログをモニタリングしたりメモリスクラビングといった機能と組み合わせることが大切と考えられます。

ADAPTEC MaxIQ SSD キャッシュパフォーマンスキット

近年注目を浴びている高速ドライブであるSSDと従来のHDDとの組み合わせでHDDアレイ全体のパフォーマンス向上を実現するADAPTEC MaxIQ SSDキャッシュパフォーマンスキットの評価テストを行ってみました。

今回はX7DBi+Xeon E5440の構成で、HDD無しの場合とHDDを8台搭載した場合の処理速度と消費電流を計測しました。

今回は、Supermicro X7SBiとIntel Xeon L3360(2.83GHz, Quad)の構成での処理速度と消費電流を計測しました。

前回の記事では、Supermicro X7DVLiとIntel Xeon L5420(2.5GHz Quad Core)のデュアルプロセッサ構成でのベンチマークと消費電力をしました。 今回はそれと同一のマシンに、3ware 9690SA-4Iを追加し、HDDを2台から4台に追加した状態での消費電流を計測しました。

Supermicro X7DVLiに、Intel Xeon L5420(2.5GHz Quad Core)を二つ乗せたマシンでLinuxカーネルのコンパイルを行い、消費電力と性能を調べてみました。