ECCメモリ(Error-correcting code memory, Error checking and correction memory、Error check and correct memory)とは、コンピュータの記憶装置の種類の1つで、データ破損を検出し修正する機能を持つメモリである。ECCメモリが持つエラー訂正機能により長期連続稼働におけるデータ化けや異常終了を防ぐことが出来る。例えば、計算に時間を要する科学技術計算あるいはCGレンダリングを行うコンピュータや、どんな状況でもデータの破損が許されない金融機関や、年中無休でWebサイトやクラウドサービスなどを提供するデータセンターのコンピュータではECCメモリのエラー訂正機能が効いてくる。対して、毎日数時間だけ起動させて対話的に使うような一般の用途では、ECCメモリが提供するような信頼性の高さはあまり意味を成さず、コスト高に繋がるだけである。但し、ITマニアの中には完璧さを求めてECCメモリを好む者も存在する。

多くの場合、ECCメモリは1ビットでエラーが生じても維持できる記憶装置である。もしビットが壊れて1ビット反転したとしても、各ワードから読み出されるデータは常に書き込まれたときのデータと同じになるよう修正される。一方、非ECCメモリは誤りを修正できない。パリティをサポートする非ECCメモリは誤りを検出できるが、訂正はできない。

当初、ECCメモリではエラー検知・訂正の処理などで非ECCメモリと比べて数%程度の性能劣化が発生するとされていたが、CPUにECC機能が統合されてからは性能劣化の問題は解決されつつある。

## 背景の問題

コンピュータシステム内部の電磁気的な干渉により、ダイナミックRAM(DRAM)の1ビットが自発的に反転することがある。
はじめはチップのパッケージに含まれる不純物から放射されるアルファ粒子が主な原因だと考えられていたが、DRAM チップの単発的なソフトエラーの多くは環境放射線、主に二次宇宙線に含まれる中性子によって1つかそれ以上のメモリセルの内容が変化するか、読み出しまたは書き込み回路が妨害されるためであることが研究で示された
。
したがって誤り率は標高とともに急速に上昇する。たとえば、標高1,500mでは海面よりも中性子束が3.5倍に増え、10〜12kmの高度(旅客機の巡航高度)では300倍にもなる
。
その結果、高度の高い場所で運用される装置には特別な信頼性対策が必要となる
。

一例として、1997年に打ち上げられた土星探査機・カッシーニは、それぞれ2.5ギガビットの市販のDRAMチップを持つ同型のフライトレコーダーを2つ搭載していた。
組み込みの誤り検出訂正機能(EDAC)のおかげで、探査機のエンジニアリングテレメトリは(訂正可能な)ワードあたり1ビットのエラーと(訂正不可能な)ワードあたり2ビットのエラーの数を報告してきた。
はじめの2年半の飛行で、探査機は1日に約280回でほぼ一定の1ビットエラーを知らせてきた。
しかし1997年11月6日、1日のエラーの数は4倍以上だった。これは GOES 9 衛星が検知した太陽フレアの影響だった
。

DRAMがどんどん高密度になり、チップ上の部品が微小化すると同時に、動作電圧が低下し続けるため、DRAMチップがそのような放射線の影響をより頻繁に受けるようになることが懸念された。低エネルギーの粒子がメモリセルの状態を変化させられるようになるからである
。
一方、メモリセルが小さくなれば標的が小さくなるわけであり、またSOIのような技術への移行により、個々のメモリセルの感受性は従来と変わりないか、むしろ低下するかもしれない。
最近の研究は、プロセスの形状により、またメモリセルのエラー発生率が上昇するという予測に根拠がなかったことにより、宇宙線によるシングル・イベント・アップセット(SEU、一時的なソフトエラー)が劇的に減少したことを示している
。

2007〜2009年の研究で、エラーの発生率が10 エラー/ビット・時(およそ1ギガバイトのメモリで1時間に1ビットのエラー)から 10 エラー/ビット・時(およそ1ギガバイトのメモリで千年に1ビットのエラー)まで7桁にわたってさまざまであることが発表された
。
グーグルの非常に多くのサーバーを対象にした大規模な研究が
SIGMETRICS/Performance’09 conference で発表された
。
実際に観測されたエラー発生率は小規模な研究よりも数桁高く、1メガビットあたり10億時間ごとに 25,000〜70,000回だった (およそ 2.5〜7 × 10 エラー/ビット・時、つまり8ギガバイトのRAMで1時間に5ビットのエラー)。
毎年8%以上の DIMM がエラーの影響を受けていた。

メモリエラーの結果はシステムによって異なる。
ECCのないシステムでは、エラーはクラッシュかデータの損失を招く。
大規模な工場では、メモリエラーはマシンのクラッシュを起こすもっとも一般的なハードウェア的原因の1つである
。
メモリエラーはまた、セキュリティの脆弱性の原因にもなる
。
観測可能な誤動作の原因になったり、計算または保存に使われるデータに影響したりしなければ、メモリエラーの影響を受けないことがある。
2010年のシミュレーション研究から、ウェブブラウザに対して、メモリエラーのわずかな一部分のみがデータの損失を引き起こすが、しかし多くのメモリエラーは断続的で相関的なので、メモリエラーの影響は独立なソフトエラーから予期されるよりも大きいことが示された
。

隣接したメモリセルへの特別に細工したアクセスによる意図しない副作用により、DRAMメモリセルどうしの分離が迂回されうるといくつかの実験は結論づけている。
したがって、近年のメモリセル密度の上昇に伴い、DRAMに格納されたデータへのアクセスがメモリセルに電荷の漏れと電気的な相互作用を引き起こし、元のメモリアクセスで指定されていない近傍の行の内容が書き換わる。
この効果はロウハンマーとして知られており、コンピュータセキュリティ上いくつかの特権昇格攻撃に使われている
。

例として、1ビットエラーは、エラーチェックのないシステムでは無視されるだろう。パリティチェックのあるマシンは停止するだろうし、またはECCによって自動的に訂正されるかもしれない。
ASCII形式で数字を保持している表計算ソフトが読み込まれているとしよう。"8"の文字(2進数で 0011 1000)が格納されたバイトの最下位ビットが、チップの故障で1に固定されてしまうか、環境放射線や宇宙線によって1に変化してしまうと、表計算ソフトとその保存データが変化する。結果として"8"はこっそりと"9"(2進数で 0011 1001)になってしまう。

## 解決策

望ましくないビット反転に対処するため、いくつかのアプローチが開発されている。障害許容性プログラミング(immunity-aware programming)、パリティつきRAM、ECCメモリなどである。

余分なビットを持つメモリとこれらのビットを使うメモリコントローラを持つDRAMモジュールを使うことで、この問題を緩和することができる。
これらの余分なビットにはパリティまたは誤り訂正符号(ECC)を記録する。
パリティは1ビット(実際上は奇数ビット)のエラーを検出できる。
最も一般的な誤り訂正符号はハミング符号(ハミングコード)で、1ビットのエラーを訂正でき、(普通の構成では余分なパリティビットを使って)2ビットのエラーを検出できる1ビットエラー訂正2ビットエラー検出(SECDED、single-error correction and double-error detection)である。
Chipkill ECCはより効果的なバージョンで、メモリチップ全体のデータ損失を含む複数ビットの訂正ができる。

## 実装

なぜCDC 6600からパリティをはずしたのかと問われたシーモア・クレイが「パリティは農夫のためのものだ」と答えたのは有名である(→w:en:Doctrine of parity)
。
次のCDC 7600にはパリティを組み込んだため、専門家から「多くの農夫がコンピュータを買うだろう」と皮肉られた(→w:en:Parity bit#History)。
初代IBM PCと、その後1990年代初期までのPCはパリティチェックを使っていた
。
その後のPCのほとんどはパリティを使っていない。
AMDのほとんどすべての64ビット製品を含む現在のマイクロプロセッサ用メモリコントローラの多くはECCメモリをサポートしているが、多くのマザーボード、特にローエンドのチップセットを使っているものはECCメモリをサポートしていない。

ECC対応のメモリコントローラは、64ビットワード(バス転送幅)につき1ビットのエラーを訂正でき、2ビットのエラーを検出できる(訂正はできない)。
ある種のコンピュータBIOSは、あるバージョンのLinux、macOS、Microsoft WindowsといったOSとの組み合わせにより、大きな故障に至る前に不具合を起こしたメモリモジュールの特定に役立てるため、検出・訂正したメモリエラーを計数することができる。

DRAMチップには誤り訂正回路を内蔵するものがあり、ECCメモリコントローラを持たないシステムでもECCメモリの恩恵の多くを得ることができる
。
システムによっては、EOSメモリモジュールを使うことで同じ効果を達成できる。

誤り検出訂正(EDAC、Error detection and correction)は、発生が予期されるエラーの種類によって異なる。
暗黙的に、メモリワード中の各ビットの故障は独立であり、2つのエラーは同時に起こらないだろうと仮定されている。メモリチップが1ビット幅だった1980年代前半にはそれは事実だった。後年、技術開発によりチップ内のビット数は増大した。この弱点はさまざまな技法によって対処されている。IBMのChipkill、サン・マイクロシステムズのExtended ECC、ヒューレット・パッカードのChipspare、インテルのSingle Device Data Correction(SDDC)などである
。

誤り訂正符号によりDRAMのソフトエラーに対する保護を強化することができる。ECCメモリやEDAC保護メモリとして知られる誤り訂正メモリは、特に高い耐障害性が求められる用途、例えばサーバや多くの放射線にさらされる宇宙機などに特に適している。周期的にすべてのアドレスを読み、ソフトエラーの除去が必要ならば訂正したデータを書き戻す「メモリ磨き(スクラブ、スクラビング、scrub)」をするシステムもある。

インターリーブは、潜在的に反転する可能性のある物理的に隣接した複数のビットを異なるワードに配属させることにより、単一の宇宙線による影響の広がりを許容する。アクセスとアクセスの間にどのワードでもシングル・イベント・アップセット(SEU、single event upset →ソフトエラー)がエラーの限界値を超えない限り(たとえば単独エラー)、訂正が可能で(たとえば1ビット誤り訂正符号で)、実質的に誤りのないメモリシステムを維持することができる。

誤り訂正対応メモリコントローラは伝統的にハミング符号を用いているが、いくつかは三重化(→フォールトトレランス)を用いている。後者はハミング符号による誤り訂正ハードウェアよりも高速な点が優れている。人工衛星ではRAMにハミング符号を使うにもかかわらず、しばしば三重化が使われる。

初期のECCメモリの実装では、訂正可能なエラーがマスクされてエラーが発生していないかのように振る舞い、訂正不可能なエラーのみ報告するものが多かった。新しい実装では、訂正可能なエラー(CE)と訂正不可能なエラー(UE)の両方を記録している。訂正不可能なエラーが発生する可能性を下げるために、エラー発生率の高いメモリモジュールを予防的に交換する人もいる。

多くのECCメモリシステムは、CPUとメモリの間に「外付けの」誤り検出訂正(EDAC)回路を使っている。
内蔵と外付けの両方のEDACシステムを使うECCメモリシステムは少ない。外付けEDACシステムは内蔵EDACシステムが訂正できないある種のエラーを訂正できるように設計しなければならない。特にNUMAアーキテクチャに関連するメモリコントローラ統合CPUへの移行に伴って、現在のデスクトップとサーバーのCPUはEDAC回路をCPUに統合している。

2009年現在、最も一般的な誤り訂正符号は、1ビットの誤り訂正と2ビットの誤り検出(SECDED、1ビットエラー訂正2ビットエラー検出)能力があるハミング符号とシャオ符号(Hsiao code)である。
メモリ保護のために他の誤り訂正符号も提案された。2ビットの誤り訂正と3ビットの誤り検出(DECTED)符号、1ニブル(=4ビット)の誤り訂正と2ニブルの誤り検出(SNCDND)符号、リード・ソロモン符号などである。
しかし実用的な多ビット訂正は、ふつう複数の1ビットエラー訂正2ビットエラー検出(SECDED)符号をインターリーブして実装されている
。

初期の研究では、ECC回路の面積と遅延の縮小を目指していた。
ハミングはある特定の検査行列により1ビットエラー訂正2ビットエラー検出(SECDED)符号が可能なことを最初に示した。
シャオは奇数のウェイトを列に持つ別の行列が1ビットエラー訂正2ビットエラー検出能力を持ち、ハミング符号よりもハードウェアを小型で高速にできることを示した。
さらに新しい研究は、面積や遅延だけでなく消費電力も減少させようとしている
。

ECCメモリは主にDRAMであるが、キャッシュメモリ(→#キャッシュ)やSRAMにもECCメモリがある
。

## キャッシュ

インテル Itanium、Xeon、AMD Athlon、Opteron、DEC Alpha 21264 など多くのプロセッサはチップ上のキャッシュメモリで誤り訂正符号を使っている
。

2006年現在、EDC/ECC と ECC/ECC の2つが商用マイクロプロセッサの最も一般的なキャッシュエラー保護技術となっている。
EDC/ECC は誤り検出符号(EDC)をレベル1キャッシュに用いる。エラーが検出された場合、ECCで保護されたレベル2キャッシュからデータを復元する。
ECC/ECC は ECC で保護されたレベル1キャッシュと ECC で保護されたレベル2キャッシュを用いる
。
EDC/ECC を採用する CPU はすべてのストア命令でレベル2キャッシュへライトスルーする。レベル1データキャッシュからの読み出し中にエラーを検出すると、その部分のデータはレベル2キャッシュから復元できる。

## レジスタード・メモリ

レジスタード・メモリはECCメモリと同一ではない。両者の機能と目的は異なる。レジスタード・メモリはバッファ回路を持たないマザーボードでは動作しないし、通常は逆も然りである。
サーバに使われるメモリは、多くのメモリモジュールが電気的に問題なく使えるようレジスタードであり、かつデータ完全性のためにECCであるのが普通である。
一方、デスクトップパソコンに使われるメモリは、経済性の為に一般的にはレジスタードでもECCでもない。
しかしレジスタードでないECCメモリも存在し、デスクトップパソコン用のマザーボードの中にはCPUがECCをサポートする場合において、ECCメモリ及びECC機能をサポートするものがある
。

## 利点と欠点

最終的には異常時のデータ損失に対する保護と高いコストはトレードオフの関係にある。

ECCは検出されないデータの破損から保護し、そのようなデータの破損が受け入れられない例えば科学技術計算や金融情報処理、ファイルサーバのようなコンピュータで使われる。
ECCはまた、特にマルチユーザーのサーバや高可用性システムでは許容できないクラッシュの回数を減らす。
重大でない用途のマザーボードとプロセッサの多くは、価格を抑えるためECCをサポートしない設計になっている。
いくつかのECC対応ボードとプロセッサはレジスタードでない(バッファードでない)ECCメモリをサポートするが、非ECCメモリでも動作する。システムのファームウェアはECCメモリが取り付けられた場合にECC機能を有効化する。

ふつうECCメモリは非ECCメモリよりも高価である。ECCメモリモジュールの製造には追加の回路が必要であり、ECCメモリや関連機器の生産量が少ないためである。
ECC対応のマザーボード、チップセット、プロセッサもまた高価であろう。

しかし、AMDがコンシューマ向けに販売しているAM4ソケット向けプロセッサのミドル~ハイレンジクラスの物ではECC機能が実装されており、ファームウェアで無効とされていないマザーボードが多く通常価格帯で出回っている。(ASUS、GIGABYTE、ASRock等の大手の過半数が機能を凍結していない、例外的にMSIはほぼ全ての製品で無効化している。)

アプリケーションや実装にもよるが、ECCメモリコントローラが誤りを検出するために余分な時間を要するので、いくつかのシステムでECCはメモリ性能が2〜3%下回る
。
しかし、CPUへのECCの統合が試みられた新しいシステムでは、メモリアクセスの遅延は発生しなくなっている
。