メインメモリのScrubbing

コンピュータの中では、プロセサに使われているトランジスタよりもメインメモリに使われているトランジスタの方が圧倒的に多い。したがって、プロセサよりも、メモリが故障したり、エラーしたりという頻度の方が高く、メモリのエラーを訂正することが重要である。発生頻度の高い間欠エラーに対しては、前述のSECDEDコードを使い、1ビットエラーが見つかれば、訂正されたデータをプロセサに送ると同時に、メモリにも書き戻してやれば良いのであるが、1つ問題がある。

メインメモリは容量が大きい。例えば8GBのメインメモリを100nsごとに8バイトずつ読んだとすると、順番に読んでも100秒かかる。実際の動作では、頻繁に使われる部分もあるが、連続稼働するサーバでは何十時間もアクセスされない番地も出てくる。このような番地では、1ビットエラーが発生しても長時間アクセスされないのでエラーが訂正されず、次にアクセスされる前に、中性子ヒットなどでまたエラーが発生して、その後アクセスしたときに2ビットエラーになってしまうということが発生する。

これを防ぐのがScrubbing(Scrubは、ごしごし磨くという意味)という手法である。Scrubbingでは、メモリを順にアクセスして行き、訂正可能な1ビットエラーのデータが見つかると、それを訂正して綺麗に磨き上げたデータをメモリに書き戻す。ソフトウェア的にメモリを順に読んでいくプロセスをバックグラウンドで走らせるというやり方でも良いが、最近のサーバプロセサでは図2.18に示すようにScrubアドレスのカウンタを持ち、ハードウェアが自動的にメモリを読んでチェックするという構造を持つものもある。ただし、全メモリをまとめて連続的にアクセスしようとすると、長時間、他の処理が走らなくなってしまうので、細切れにして、処理があまりビジーでない状態にScrubを行うという方法が採られる。

図2.18 アドレスカウンタを持つScrub回路

2ビットのエラーの蓄積を防ぐという観点からは頻繁にScrubを行った方が良いが、通常のメモリアクセスを阻害するので性能的にオーバヘッドになるし、消費電力も増えるので、これらのトレードオフで全メモリアドレスを一巡する周期が決められる。

DRAMチップのソフトエラー率を100,000fitと仮定すると、18チップ搭載のDIMMを128枚搭載する大型サーバでは、DRAM全体のエラー率は230,400,000fitと見積もられる。これは毎時0.23回のエラー発生という頻度となる。仮に400時間で一巡するScrubを行うと、各ワードのScrub後の経過時間は平均的には200時間であり、46個くらいのエラーが残っているという計算になる。DIMM容量が8GBとすると、128枚のDIMMを実装するサーバでは64ビットのワードが128Gワード存在し、2ビットエラーとなる確率は46/128G×0.23=0.08×10-9/Hrということになる。つまり、100,000fitのDRAMチップを2300個使用しているのに、400時間で一巡するScrubで1ビットエラーを訂正することにより、全体としてのエラー率は0.08fitまで低減できるという訳である。このように、メモリ全体のエラー率は、DRAMのfit率の2乗に比例し、Scrubの一巡の時間に比例する。