ECC Error Correction
๊ฐ์
ECC(Error Correction Code)๋ ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ ์์คํ ์์ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์ค๋ฅ ์ ์ ๊ธฐ์ ์ด๋ค. DRAM ์ ์ ์ ์ฅ๋ ๋นํธ๊ฐ ์ฐ์ฃผ์ ์ ์(cosmic ray), ์ํ ์ ์, ์ ๊ธฐ์ ๊ฐ์ญ ๋ฑ์ ์ํด ์๋์น ์๊ฒ ๋ค์งํ๋ soft error๋ฟ ์๋๋ผ, ์ ์ดํ๋ ์ ์ด ๋ถ๋์ฒ๋ผ ๋ฐ๋ณต์ ์ผ๋ก ์ฌํ๋๋ hard error๋ก๋ถํฐ๋ ์์คํ ์ ๋ณดํธํ๋ค.
Google์ ๋๊ท๋ชจ ์๋ฒ ์ฐ๊ตฌ(2009)์ ๋ฐ๋ฅด๋ฉด, DRAM์ ์ค์ ์ค๋ฅ์จ์ ๊ธฐ์กด ์คํ์ค ์ฐ๊ตฌ๋ณด๋ค ์ ๋ฐฐ ๋์ผ๋ฉฐ, ์ฐ๊ฐ DIMM ๋ชจ๋์ 8% ์ด์์ด ์ค๋ฅ๋ฅผ ๊ฒฝํํ๋ค. ECC ์์ด๋ ์ด๋ฌํ ์ค๋ฅ๊ฐ ์์คํ ํฌ๋์, ๋ฐ์ดํฐ ์์ค, ์ฌ์ง์ด ๋ณด์ ์ทจ์ฝ์ ์ผ๋ก ์ด์ด์ง ์ ์๋ค.
ํต์ฌ ๊ฐ๋
Soft Error์ ์์ธ
DRAM ์ํํธ ์๋ฌ์ ์ฃผ์ ์์ธ์ ๋ค์๊ณผ ๊ฐ๋ค:
| ์์ธ | ์ค๋ช | ์ํฅ๋ |
|---|---|---|
| Cosmic Ray Neutrons | ์ฐ์ฃผ์ ์ด ๋๊ธฐ์ ์ถฉ๋ํ์ฌ ์์ฑ๋ ์ค์ฑ์ | ์ฃผ์ ์์ธ (ํด๋ฐ ๊ณ ๋์์ ์ฆ๊ฐ) |
| Alpha Particles | ์นฉ ํจํค์ง ์ฌ๋ฃ์ ๋ถ์๋ฌผ์์ ๋ฐฉ์ถ | ์๋ฉธ ์ถ์ธ (๊ณ ์๋ ํจํค์ง) |
| RowHammer | ์ธ์ ํ ๋ฐ๋ณต ์ ๊ทผ์ผ๋ก ์ธํ ์ ํ ๋์ถ | ๋ณด์ ์ทจ์ฝ์ ์ผ๋ก ์ ์ฉ ๊ฐ๋ฅ |
| ์ ๊ธฐ์ ๊ฐ์ญ | ์์คํ ๋ด๋ถ EMI/RFI | ๋ฎ์ (์ฐจํ ์ค๊ณ๋ก ์ํ) |
๊ณ ๋ 10~12km(์์ฉ ํญ๊ณต๊ธฐ ์ํญ ๊ณ ๋)์์๋ ํด์๋ฉด ๋๋น ์ค์ฑ์ ํ๋ญ์ค๊ฐ 300๋ฐฐ ๋์์ง๋ฉฐ, ์ด๋ ํญ๊ณต ๋ฐ ์ฐ์ฃผ ์์คํ ์์ ECC๊ฐ ํ์์ ์ธ ์ด์ ๋ฅผ ์ค๋ช ํ๋ค.
ECC ๊ตฌํ ๋ถ๋ฅ
1. Side-band ECC (SBECC)
์ ํต์ ์ธ ์๋ฒ ๋ฐฉ์์ผ๋ก, ECC ๋นํธ๋ฅผ ๋ณ๋์ DRAM ์นฉ์ ์ ์ฅํ๊ณ ์ถ๊ฐ ์ฑ๋(72๋นํธ ๋ฒ์ค)๋ก ์ ์กํ๋ค.
- ์๋: Memory Controller๊ฐ ์ฐ๊ธฐ ์ ECC๋ฅผ ๊ณ์ฐํ์ฌ ๋ณ๋ ์นฉ์ ์ ์ฅ, ์ฝ๊ธฐ ์ ๊ฒ์ฆ ๋ฐ ์ ์
- ๋ฒ์ค ๊ตฌ์ฑ: 64๋นํธ ๋ฐ์ดํฐ + 8๋นํธ ECC = 72๋นํธ (DDR3/4)
- ์ฅ์ : ์ค๋ฅ ์ ์ /๊ฒ์ถ ๋ฅ๋ ฅ ์ฐ์, OS์ ์ค๋ฅ ๋ณด๊ณ ๊ฐ๋ฅ
- ๋จ์ : ์ถ๊ฐ DRAM ์นฉ ํ์, ๋์ ๋น์ฉ
2. On-die ECC (ODECC)
DDR5์์๋ on-die ECC๊ฐ ์ ์ฉ๋๊ณ , LPDDR5 ๊ณ์ด์ link ECC๋ก ์ ์ก ๊ฒฝ๋ก๋ฅผ ๋ณด๊ฐํ๋ค.
- ์๋: DRAM ์นฉ ์์ฒด๊ฐ ๋ด๋ถ ์ค๋ฅ๋ฅผ ์ ์
- ํฌ๋ช ์ฑ: Memory Controller์ ์์ ํ ํฌ๋ช
- ์ฅ์ : ์ธ๋ถ ํ๋์จ์ด ๋ณ๊ฒฝ ๋ถํ์
- ๋จ์ : ์ ์ก ์ค๋ฅ ๋ฏธ์ ์ , OS์ ์ค๋ฅ ๋ณด๊ณ ์์
3. Inline/In-band ECC
๋ฌผ๋ฆฌ ์ฃผ์ ๊ณต๊ฐ์ ๋ถํ ํ์ฌ ECC๋ฅผ ๊ตฌํํ๋ ๋ฐฉ์์ผ๋ก, ์ผ๋ถ ์์คํ ์์ ์ง์๋๋ค.
- ์๋: ์ผ๋ฐ non-ECC DIMM ์ฌ์ฉ ๊ฐ๋ฅ, ์ฃผ์ ๊ณต๊ฐ ์ผ๋ถ๋ฅผ ์์ฝํ์ฌ ECC ํ ์ด๋ธ ์ ์ฅ
- ์ฅ์ : ์ถ๊ฐ ํ๋์จ์ด ๋ถํ์
- ๋จ์ : ๋ฉ๋ชจ๋ฆฌ ๋ ์ดํด์์ ์ฑ๋ฅ ์ค๋ฒํค๋๊ฐ ํฌ๊ฒ ์ฆ๊ฐํ ์ ์๋ค.
4. Link ECC
LPDDR5์์ ๋์ ๋ ๋ฐฉ์์ผ๋ก, ๋ฐ์ดํฐ ๋งํฌ ๋ ์ด์ด์ ์ค๋ฅ ์ ์ ์ ์ถ๊ฐํ๋ค.
- ์ฐ๊ธฐ ๊ฒฝ๋ก: MC๊ฐ ECC๋ฅผ ๊ณ์ฐํ์ฌ ์ ์ก, DRAM์ด ๊ฒ์ฆ
- ์ฝ๊ธฐ ๊ฒฝ๋ก: DRAM์ด ECC๋ฅผ ๊ณ์ฐํ์ฌ ์ ์ก, MC๊ฐ ๊ฒ์ฆ
- ํน์ง: On-die ECC์ ํจ๊ป ์ฌ์ฉ๋์ด ์ ์ก+์ ์ฅ ๋ชจ๋ ๋ณดํธ
SECDED Hamming Code
์ ๊ณ ํ์ค ECC ์ฝ๋์ธ SECDED(Single-Error Correction, Double-Error Detection)๋ Hamming ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค:
- ๋จ์ผ ๋นํธ ์ค๋ฅ: ์ ์ ๊ฐ๋ฅ (syndrome์ผ๋ก ์ค๋ฅ ์์น ๊ฒฐ์ ํ ๋นํธ ๋ฐ์ )
- ์ด์ค ๋นํธ ์ค๋ฅ: ๊ฒ์ถ๋ง ๊ฐ๋ฅ (UCE - Uncorrectable Error ์ ์ธ)
- ์ค๋ฒํค๋: 64๋นํธ ๋ฐ์ดํฐ๋น 8๋นํธ (12.5%)
Hsiao ์ฝ๋๋ ๊ธฐ์กด Hamming ์ฝ๋ ๋๋น ๋ ๋ฎ์ ํ๋์จ์ด ๋น์ฉ๊ณผ ์ง์ฐ ์๊ฐ์ ์ ๊ณตํ๋ค. 64๋นํธ ๋ฐ์ดํฐ์ ์ฐ์ด๋ ์ผ๋ฐ์ ์ธ SECDED ๊ตฌ์ฑ์ 7๊ฐ์ Hamming ํจ๋ฆฌํฐ ๋นํธ์ 1๊ฐ์ ์ ์ฒด ํจ๋ฆฌํฐ ๋นํธ๋ก ์ด๋ฃจ์ด์ง๋ฉฐ, Hamming ํจ๋ฆฌํฐ๋ ์ฝ๋์๋ ๋ด 1, 2, 4, 8, 16, 32, 64 ์์น์ ๋ฐฐ์น๋๋ค.
๋น๊ต/๋ถ์
ECC ๊ธฐ๋ฅ ๋น๊ต
| ๊ธฐ๋ฅ | ๋ฅ๋ ฅ | ๊ตฌํ ์์น | DDR ์ธ๋ | ๋น์ฉ |
|---|---|---|---|---|
| Parity | 1๋นํธ ๊ฒ์ถ | MC | DDR~DDR2 | ๋ฎ์ |
| SECDED ECC | 1๋นํธ ์ ์ , 2๋นํธ ๊ฒ์ถ | MC (Side-band) | DDR3~DDR4 | ์ค๊ฐ |
| On-die ECC | ๋ด๋ถ ์ค๋ฅ ์ ์ | DRAM ์นฉ ๋ด๋ถ | DDR5+ | ์นฉ ๋ด์ฅ |
| Chipkill | ์นฉ ๋จ์ ๋ค๋นํธ ์ ์ | MC (๊ณ ๊ธ) | ์๋ฒ์ฉ | ๋์ |
| Link ECC | ์ ์ก ์ค๋ฅ ์ ์ | DRAMโMC ์๋ฐฉํฅ | LPDDR5+ | ์ค๊ฐ |
| CRC | ๋งํฌ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ถ | GDDR6/HBM | ๊ทธ๋ํฝ ๋ฉ๋ชจ๋ฆฌ | ์ค๊ฐ |
ECC vs Non-ECC ๋น๊ต
| ํญ๋ชฉ | Non-ECC | ECC |
|---|---|---|
| ๋ฐ์ดํฐ ๋ฒ์ค | 64๋นํธ | 72๋นํธ |
| DRAM ์นฉ ์ | 8๊ฐ (์ผ๋ฐ) | 9๊ฐ (์ถ๊ฐ 1๊ฐ) |
| ์ค๋ฅ ์ ์ | ์์ | 1๋นํธ ์ ์ |
| ์ค๋ฅ ๊ฒ์ถ | ์์ | 2๋นํธ ๊ฒ์ถ |
| ๊ฐ๊ฒฉ | ๊ธฐ์ค | ์ฝ 10~20% ํ๋ฆฌ๋ฏธ์ |
| ์ฑ๋ฅ | ๊ธฐ์ค | ์ฝ 2~3% ์ค๋ฒํค๋ |
| ์ ์ฉ | ๋ฐ์คํฌํฑ, ๊ฒ์ด๋ฐ | ์๋ฒ, ์ํฌ์คํ ์ด์ , ๋ฐ์ดํฐ๋ฒ ์ด์ค |
DDR ์ธ๋๋ณ ECC ๋์ ๋น๊ต
| ํญ๋ชฉ | DDR3 ECC | DDR4 ECC | DDR5 ECC |
|---|---|---|---|
| ๋ฒ์ค | 72-bit (64+8) | 72-bit (64+8) | 80-bit (2ร32 + 2ร8) |
| ECC ์์น | Side-band | Side-band | On-die + Side-band |
| ๋ฆฌํ๋ ์ | All-Bank | All-Bank | Same-Bank ์ง์ |
| ์ค๋ฅ ๋ณด๊ณ | CE/UE ๋ก๊น | CE/UE ๋ก๊น | On-die: ๋ฏธ๋ณด๊ณ |
๋์ ์๋ฆฌ
1๋จ๊ณ: ECC ์์ฑ (์ฐ๊ธฐ ๊ฒฝ๋ก)
Memory Controller๊ฐ CPU๋ก๋ถํฐ 64๋นํธ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ฉด:
- Check Matrix ๊ณฑ์ : H ร D^T = P (ํจ๋ฆฌํฐ ๋นํธ ๊ณ์ฐ)
- ECC ๋นํธ ์์ฑ: 8๋นํธ ํจ๋ฆฌํฐ(P0~P7) ์ฐ์ถ
- 72๋นํธ ์ ์ก: 64๋นํธ ๋ฐ์ดํฐ + 8๋นํธ ECC๋ฅผ DRAM์ ๊ธฐ๋ก
2๋จ๊ณ: ์ค๋ฅ ๊ฒ์ถ/์ ์ (์ฝ๊ธฐ ๊ฒฝ๋ก)
DRAM์์ 72๋นํธ๋ฅผ ์ฝ์ ํ:
- Syndrome ๊ณ์ฐ: H ร R^T = S (์ฝ์ ๋ฐ์ดํฐ์ ์๋๋กฌ ๊ณ์ฐ)
- ์๋๋กฌ ํด์:
- S = 0 โ ์ค๋ฅ ์์
- S โ 0์ด๊ณ ๋จ์ผ ๋นํธ ์ค๋ฅ ์์น์ ์ผ์น โ 1๋นํธ ์ค๋ฅ (์ ์ ๊ฐ๋ฅ)
- S โ 0์ด๊ณ ๋ค์ค ๋นํธ ์ค๋ฅ ํจํด๊ณผ ์ผ์น โ 2๋นํธ ์ค๋ฅ (๊ฒ์ถ๋ง) - ์ ์ ์คํ: ์ค๋ฅ ๋นํธ ๋ฐ์ ํ์ฌ ์๋ ๋ฐ์ดํฐ ๋ณต์
3๋จ๊ณ: ์ค๋ฅ ๋ณด๊ณ ๋ฐ ๊ด๋ฆฌ
ํ๋ ์์คํ ์์๋ ์ค๋ฅ๋ฅผ ๋ก๊น ํ๊ณ ๋ชจ๋ํฐ๋งํ๋ค:
- CE (Correctable Error): ์ ์ ๋ ์ค๋ฅ ํ์ ์นด์ดํธ
- UE (Uncorrectable Error): ์ ์ ๋ถ๊ฐ๋ฅํ ์ค๋ฅ โ ์์คํ ์๋ฆผ
- SMBIOS๋ฅผ ํตํ ๊ด๋ฆฌ: Linux/Windows์์ ์ค๋ฅ ์นด์ดํฐ ์ ๊ทผ ๊ฐ๋ฅ
- ์๋ฐฉ ๊ต์ฒด: ๋์ ์ค๋ฅ์จ์ ๋ณด์ด๋ ๋ชจ๋์ ์ฌ์ ๊ต์ฒด
๋ํ ์๋ฒ ํ๋ซํผ์ ์ฌ๊ธฐ์ Chipkill, symbol-based ECC, lockstep channel ๊ฐ์ ์์ ๋ณดํธ ๊ธฐ๋ฒ์ ๋ํด x4 DRAM ์นฉ ํ ๊ฐ๊ฐ ๊ณ ์ฅ ๋๋ ๊ฒฝ์ฐ๊น์ง ๊ฒฌ๋๋๋ก ์ค๊ณํ๊ธฐ๋ ํ๋ค. ์ด๋ฐ ๊ตฌ์ฑ์ ๋ฉ๋ชจ๋ฆฌ ์ฑ๋ ํญ๊ณผ ์ธํฐ๋ฆฌ๋น ๋ฐฉ์์ ์ ์ฝ์ ์ฃผ์ง๋ง, ๋จ์ SECDED๋ง์ผ๋ก ๋ง๊ธฐ ์ด๋ ค์ด ํจํค์ง ๋จ์ ๊ณ ์ฅ์ ์ค์ด๋ ๋ฐ ํจ๊ณผ์ ์ด๋ค.
Memory Scrubbing
์ฃผ๊ธฐ์ ์ผ๋ก ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฝ์ด ์ ์ ๋ ๋ฒ์ ์ ๋ค์ ๊ธฐ๋กํ๋ ๊ณผ์ :
- ๋์ ๋ ์ํํธ ์๋ฌ๋ฅผ ์ ๊ฑฐ
- UCE ๋ฐ์ ์ ์ ์ ์ฌ์ ์ค๋ฅ ์กฐ๊ธฐ ๋ฐ๊ฒฌ
- ์๋ฒ์์ ์ผ๋ฐ์ ์ผ๋ก ํ์ฑํ
Patrol scrub ์ฃผ๊ธฐ๋ ํ๋ซํผ ์ ์ฑ ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ ๋ฐ๋ผ ์ ์๊ฐ์์ ์์ญ ์๊ฐ ๋จ์๋ก ์ค์ ๋๋ฉฐ, scrub ํธ๋ํฝ์ด ๊ณผ๋ํ๋ฉด ๋์ญํญ ์์ค์ด ์๊ธธ ์ ์์ผ๋ฏ๋ก RAS ์ ์ฑ ๊ณผ ํจ๊ป ์กฐ์ ํ๋ค.
์ฅ๋จ์
| ์ฅ์ | ๋จ์ |
|---|---|
| 1๋นํธ ์ค๋ฅ๋ฅผ ์๋ ์ ์ ํ์ฌ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ | ์ถ๊ฐ ๋น์ฉ (DRAM ์นฉ 1๊ฐ ๋ ํ์) |
| 2๋นํธ ์ค๋ฅ ๊ฒ์ถ๋ก ์ฌ๊ฐํ ๋ฐ์ดํฐ ์์ค ๋ฐฉ์ง | ์ฝ 2~3% ์ฑ๋ฅ ์ค๋ฒํค๋ (Side-band) |
| ์๋ฒ/๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํฌ๋์ ๊ฐ๋ฅ์ฑ ๋ํญ ๊ฐ์ | ๋ฐ์คํฌํฑ ํ๋ซํผ์์ ECC ์ง์ ์ ํ (Intel) |
| SMBIOS ๊ธฐ๋ฐ ์ค๋ฅ ๋ชจ๋ํฐ๋ง ๊ฐ๋ฅ | On-die ECC๋ ์ ์ก ์ค๋ฅ ๋ฏธ์ ์ |
| Memory Scrubbing์ผ๋ก ๋์ ์ค๋ฅ ์ฌ์ ์ ๊ฑฐ | Inline ECC๋ ์ต๋ 25% ์ฑ๋ฅ ์ ํ |
| RowHammer ๊ณต๊ฒฉ ์ํ์ ๊ธฐ์ฌ | Non-ECC ๋ฉ๋ชจ๋ฆฌ์ ํผ์ฉ ๋ถ๊ฐ |
๊ด๋ จ ๊ธฐ์
- JEDEC JESD79-5: DDR5 SDRAM ์ฌ์
- JEDEC LPDDR5 ๋ฐํ: LPDDR5 ํ์ค ๊ณต๊ฐ
- Google SIGMETRICS 2009: "DRAM errors in the wild: A large-scale field study"
- Hamming (1950): ์ต์ด์ ์ค๋ฅ ์ ์ ์ฝ๋ ์ ์
- Hsiao Code: M.Y. Hsiao, 1970 - Odd-weight column SECDED
- Chipkill / symbol-based ECC: IBM ๊ณ์ด ์๋ฒ์์ ๋ฐ์ ํ ์นฉ ๋จ์ ์ค๋ฅ ์ํ ๊ธฐ๋ฒ
- EDAC Linux Kernel Module: ๋ฆฌ๋ ์ค์์ ECC ์ค๋ฅ ๋ชจ๋ํฐ๋ง ์ง์
ํต์ฌ ์ ๋ฆฌ
ECC๋ DRAM ์์คํ ์์ ์ฐ์ฃผ์ ์ ์ ๋ฑ์ผ๋ก ์ธํ ์ํํธ ์๋ฌ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธํ๋ ํ์ ๊ธฐ์ ์ด๋ค. ์ ๊ณ ํ์ค์ธ SECDED Hamming ์ฝ๋๋ 64๋นํธ ๋ฐ์ดํฐ์ 8๋นํธ ECC๋ฅผ ์ถ๊ฐํ์ฌ 1๋นํธ ์ค๋ฅ ์ ์ ๊ณผ 2๋นํธ ์ค๋ฅ ๊ฒ์ถ์ ์ํํ๋ค. DDR5๋ on-die ECC๋ก ์นฉ ๋ด๋ถ ์ ์ฅ ์ค๋ฅ๋ฅผ ์ค์ด๊ณ , LPDDR5๋ link ECC๋ก ์ ์ก ๊ฒฝ๋ก์ ๋ฌด๊ฒฐ์ฑ์ ๋ณด๊ฐํ๋ค. ์๋ฒ ํ๊ฒฝ์์๋ Side-band ECC๊ฐ ์ฌ์ ํ ์ฃผ๋ฅ์ด๋ฉฐ, Google ์ฐ๊ตฌ๋ ์ฐ๊ฐ DIMM์ 8% ์ด์์ด ์ค๋ฅ๋ฅผ ๊ฒฝํํ๋ค๊ณ ๋ณด๊ณ ํ์๋ค. ECC์ ์ค๋ฒํค๋(์ฝ 2~3%)๋ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๊ฐ์น์ ๋นํด ๋ฏธ๋ฏธํ๋ฉฐ, ํนํ ๊ธ์ต, ๊ณผํ, ์๋ฃ ๋ถ์ผ์์๋ ์ ํ์ด ์๋ ํ์ ์ฌํญ์ด๋ค.