チップキルとアドバンストECC ─ 多重ビット故障の訂正
DRAMチップが1個丸ごと壊れてもサーバーが止まらない理由を、SECDEDの限界とシンボル符号の数理から解き明かし、大規模メモリの信頼性設計の勘所が掴めます。
- 1.SECDED(72,64)は1ビット訂正どまりで、x4/x8チップの全損が生む多重ビット故障は訂正できずシステム停止を招く。
- 2.チップキル/SDDCはReed-Solomonなどのシンボル単位符号で「1チップ=1シンボル」を訂正対象にし、チップ全損を1シンボル誤りに押し込めて救う。
- 3.鍵はビットインターリーブで1チップの出力を別シンボルへ散らすか、x4を束ねてシンボル幅を合わせる構成で、冗長チップ追加とアクセス幅拡大のオーバヘッドと引き換えになる。
なぜSECDEDではチップ全損を救えないのか
サーバーのECC DRAMは64bitデータに8bit検査を足した(72,64)のSECDEDが標準で、64bitワードあたり1ビット訂正・2ビット検出を保証します。ところが現実のDRAMは1チップが複数のデータ線(DQ)を駆動します。よくある x4チップは4本、x8チップは8本のビットを1ワードへ同時に供給します。
ここで1個のチップがクロック故障やワード線断線で丸ごと死ぬと、そのチップが担当する4本(x4)や8本(x8)のビットが同時に化けます。SECDEDが保証するのは2ビット検出・1ビット訂正までですから、4ビットや8ビットがまとまって誤る故障モードは検出すらできず、サイレントな破損か誤訂正に直結します。
x4チップが全損したときのワード内の誤り
DQ0 DQ1 DQ2 DQ3 ... (この1チップ由来の4ビットが同時に反転しうる)
-> ワード内 最大4ビット誤り
SECDED(72,64)の能力 = 1訂正/2検出 -> 訂正も検出も保証外
チップ単位の故障はメモリ障害の中で無視できない割合を占めます。容量が増えチップ数が増えるほど「どれか1個が壊れる」確率は上がるため、大規模サーバーではチップ1個の死をワード単位で吸収する符号が要ります。これがチップキル(Chipkill) あるいは SDDC(Single Device Data Correction) です。
SECDEDは「ランダムに散らばった1ビット誤り」を前提にした距離設計です。チップ故障は「特定の数ビットがまとまって誤る」局所集中型で、性質が異なります。後者を扱うには、誤りをビット単位ではなく数ビットの塊(シンボル)単位で捉え直す発想の転換が必要になります。
シンボルベース符号 ─ 1チップを1シンボルに対応させる
チップキルの数理的な核心は、誤り訂正の単位を1ビットから シンボル(数ビットの塊) へ引き上げる点にあります。代表が Reed-Solomon(RS)符号 で、これは2進体GF(2)ではなく 拡大体GF(2^m) 上で定義されます。
GF(2^m)の1要素はmビットを1つの数として扱います。たとえばm=4ならGF(16)の各要素が4ビット=1シンボルです。RS符号は「シンボル単位の最小距離」で誤り訂正能力が決まり、最小距離 d のとき floor((d-1)/2) シンボルまで訂正できます。ここがビット符号との決定的な違いで、1シンボルが何ビットであろうと、そのシンボル内で**何ビット化けようと「1シンボル誤り」**として一括で訂正します。
ビット符号(ハミング系)とシンボル符号(RS)の訂正単位
ハミング/SECDED : 訂正の単位はビット -> 連続4ビット誤り=4誤り扱い -> 手に負えない
Reed-Solomon : 訂正の単位はシンボル -> 連続4ビット誤りが1シンボル内なら=1シンボル誤り
ここで 「1チップの出力幅 = 1シンボル幅」 になるようデータを配置すれば、チップ全損はちょうど1シンボル誤りに収まります。x4チップなら4ビットシンボル(GF(16))、x8チップなら8ビットシンボル(GF(256))を選ぶのが素直な対応です。RS符号で1シンボル訂正できる構成にしておけば、どのチップが死んでも、その1チップぶんを丸ごと再構成できます。
GF(2^m)上の演算は加算がXOR、乗算が多項式の積を既約多項式で割った剰余で、mビットの塊が1つの「数」として閉じた四則演算を持ちます。誤り位置多項式とシンドロームの連立を解く復号は、このシンボル単位の代数で完結するため、シンボル内のビットがどう化けても訂正手続きは同一です。「塊の中身を問わず塊ごと直す」がシンボル符号の本質です。
ビットインターリーブとデータ幅 ─ 二つの実装路線
RS符号を使うとして、実装には「1チップを1シンボルへどう対応させるか」で大きく二つの路線があります。
第一は チャネル束ね(幅拡大)方式です。1回のメモリアクセスでより多くのチップを読み、各チップの出力をそのまま別シンボルに割り当てます。x4チップを多数並べ、各x4を1つの4ビットシンボルとして扱えば、RSの1シンボル訂正がそのままチップキルになります。IBMの初期チップキルはアクセス幅を128bit級へ広げ、冗長チップを足してこの対応を作りました。
第二は ビットインターリーブ方式です。1チップが出す数ビットを、あえて別々の符号語へ散らして配置します。こうすると、たとえ1チップが全損しても、各符号語から見れば「1ビットずつ」しか誤りが来ません。
ビットインターリーブの考え方 (x4チップを4つの独立符号で守る例)
チップAの DQ0 -> 符号語0 へ
チップAの DQ1 -> 符号語1 へ
チップAの DQ2 -> 符号語2 へ
チップAの DQ3 -> 符号語3 へ
=> チップA全損でも 各符号語の誤りは1ビット -> SECDED級でも各々訂正可能
インターリーブの利点は、安価な1ビット訂正符号を並列に使うだけでチップ全損を吸収できる点です。各符号語が受け持つチップ由来の誤りを1ビットに抑えるため、RSのような重い拡大体演算を必須にしません。一方で、シンボル方式は1つの符号でまとめて扱えるため検査効率(冗長率)で有利になりやすく、両者は設計上のトレードオフを成します。実機ではメモリコントローラのスケジューリングと密に結合してこの配置・復号を実装します。
シンボル方式の前提は「1チップ出力がちょうど1シンボルに収まる」ことです。x8チップを4ビットシンボルの符号で守ろうとすると、1チップの故障が2シンボルにまたがり、1シンボル訂正の符号では救えません。x8デバイスをチップキルするには8ビットシンボル(GF(256))符号にするか、2シンボル訂正能力(DDDC級)を持たせる必要があります。デバイス幅と符号のシンボル幅の整合は、構成設計で最初に確認すべき点です。
オーバヘッドと実装 ─ 冗長チップ・幅・復号コスト
チップキルはタダではありません。コストは主に三つに表れます。
第一に 冗長チップ(容量オーバヘッド) です。SECDEDの(72,64)は検査が12.5%増で済みますが、シンボル訂正には1チップぶん以上の冗長シンボルが要ります。RSで1シンボル訂正するには冗長シンボルが最低2つ必要(最小距離 d が 3 以上、2シンボル訂正なら4つ)で、データチップ数に対する冗長チップの比率がオーバヘッドを決めます。
第二に アクセス幅の拡大です。1ワードに多くのチップを束ねるシンボル方式では、最小アクセス単位(バーストで読む量)が大きくなりがちです。これは細かいランダムアクセスの効率を下げ、メモリ階層の実効帯域や電力に影響します。近年のDDR5は1モジュールを2つの独立サブチャネル(各40bit、うち8bitがECC)に分割し、より狭い幅で各サブチャネル内ECCを成立させる方向で、この幅の問題を緩和しています。
第三に 復号の計算コストです。RS復号はシンドローム計算・誤り位置多項式の導出(Berlekamp-Massey法など)・誤り評価(Chien探索とForney法)から成り、ビット符号より重い拡大体演算をハードで回します。ただしメモリ経路では訂正は通常時ほぼ発生せず、誤り検出は軽量に行い、訂正は誤り発生時のみ重い経路へ落とす設計でレイテンシ影響を抑えます。
| 方式 | 訂正の単位 | チップ全損(x4) | 代表的オーバヘッド | 典型用途 |
|---|---|---|---|---|
| SECDED(72,64) | ビット | 救えない | 検査8bit/64bit | 一般サーバーDRAM |
| ビットインターリーブ | ビット(分散) | 各符号1bitに分散して救う | 符号を並列化 | x4チップキル |
| RS シンボル(GF16) | 4bitシンボル | 1シンボルとして訂正 | 冗長チップ追加+幅拡大 | x4 SDDC |
| RS シンボル(GF256) | 8bitシンボル | 1シンボルとして訂正 | さらに冗長増 | x8 SDDC/DDDC |
実装上はこれらを組み合わせるのが一般的です。x4デバイスをインターリーブで散らしつつRS的なシンボル設計を併用し、さらにスペア資源への退避(劣化した行をデバイス内のスペア行へ移すPPR/post-package repair や、ランク/領域単位のスペアリング) や、誤りを2シンボルへ蓄積させないための定期的なメモリスクラビングを重ねます。こうした多層構成で、1チップ死では止まらず、検出された劣化箇所は事前に切り離す運用を実現します。
「SECDED(72,64)は1ビット訂正どまりでチップ全損は救えない」「チップキル/SDDCはシンボル単位(RS符号、GF(2^m))で1チップ=1シンボルを訂正する」「シンボル幅はデバイス幅(x4=4bit/x8=8bit)に合わせる」「ビットインターリーブは1チップの誤りを複数符号語へ1ビットずつ散らす別解」「コストは冗長チップ・アクセス幅・復号演算」の対応を押さえましょう。x8は4bitシンボルでは救えず8bitシンボルかDDDCが要る点が引っかけになりやすいところです。
まとめ
- SECDED(72,64)はランダム1ビット誤り前提の距離4設計で、x4/x8チップの全損が生む多重ビット誤りは訂正も検出も保証外になる。
- チップキル/SDDCは訂正単位をビットからシンボルへ上げ、Reed-SolomonなどGF(2^m)上の符号で「1チップ=1シンボル」を丸ごと訂正する。
- 実装は シンボル幅をデバイス幅に合わせる構成(x4=GF16・x8=GF256)と、ビットインターリーブで1チップの誤りを複数符号語へ散らす路線に大別される。
- オーバヘッドは冗長チップ・アクセス幅の拡大・RS復号の演算コストとして現れ、スペアリングやスクラビングと多層に組んで運用される。
ビットがなぜ化けるのかの素過程はECCの数理が、訂正符号が守るメモリ全体の信頼性階層はキャッシュとDRAMの章が掘り下げます。RAIDでストレージのデバイス全損をパリティ・RSで救う発想とも数理は地続きです。
CPU/メモリ/ディスク Article
チップキルとアドバンストECC ─ 多重ビット故障の訂正を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
チップキル
比較で見る軸
難易度: advanced / カテゴリ: CPU/メモリ/ディスク / タグ数: 6
導入後に効く点
チップキル/SDDCはReed-Solomonなどのシンボル単位符号で「1チップ=1シンボル」を訂正対象にし、チップ全損を1シンボル誤りに押し込めて救う。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- CPU/メモリ/ディスク
- タグ数
- 6
判断チェックリスト
- 自社の用途が「チップキル / ECC」に近いか確認する。
- 強みである「SECDED(72,64)は1ビット訂正どまりで、x4/x8チップの全損が生む多重ビット故障は訂正できずシステム停止を招く。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。