データに毒を入れるポイゾニング

Scrubで読んだデータが1ビットエラーであれば、SECDEDコードで訂正してメモリに書き戻せばよいが、2ビットエラーの場合は検出はできるが訂正はできない。

この場合はハードウェアエラーとしてシステムをシャットダウンするというのも1つの手であるが、ScrubはOSやアプリケーションが使っているかどうかとは無関係に全メモリを舐めてしまうので、この2ビットエラーのデータが使われない場合にもシャットダウンしてしまうことがあり得る。しかし、使わないデータなら2ビットエラーがあっても問題なく、このような場合にシステムをダウンさせるのはムダである。

最近のサーバプロセサでは、2ビットエラーを検出すると、Poison(毒)と呼ぶ特別なデータパターンをメモリに書き込み、何事もなかったかのようにScrubを続行する。8ビットのチェックビットを持つSECDEDコードでは最大120ビットまでのデータを扱うことができるが、一般には64ビットのデータしか使っていないので、残りの56ビットに非0の値があるデータに対応するチェックビットの組み合わせは使われていないことになる。このような通常のデータでは出てこないパターンをPoisonとして使用する。

図2.19 ECC訂正不能なエラーを検出した場合はPoison(毒)データを書き込む

そして、プロセサコアがこのPoisonを持ったデータをロードして使おうとするとロードユニットでデータにPoisonが入っているかどうかを検査し、Poisonが入っていればハードウェアエラーとする。そして、それがOSの使っているメモリ領域の場合は回復できないが、アプリケーションの使用しているメモリの場合は、そのアプリケーションだけを打ち切り、OSやその他のアプリケーションの実行を続けることができる。

このようにデータポイゾニングを行うことにより、2ビットエラーによるダウンを減らし、システムの信頼度を上げることができる。