메모리 ECC, 뒤집힌 비트를 스스로 고치는 원리
택배 송장에 주소를 적다가 동 이름 한 글자를 잘못 썼다고 해 보겠습니다. 그래도 택배는 대개 제대로 도착하죠. 우편번호와 도로명, 건물 번호가 서로를 받쳐 주기 때문에, 어긋난 글자 하나가 어디인지 짐작하고 바로잡을 수 있는 것입니다.
메모리 ECC는 이 원리를 비트에 적용한 기술입니다. 데이터에 약간의 여분 정보를 붙여 저장해 두면, 나중에 비트 하나가 뒤집혀도 어느 비트가 틀렸는지 계산해 스스로 고칠 수 있죠. 이 글에서는 패리티와 해밍 코드의 계산부터 D램과 낸드에 쓰이는 ECC 방식까지 차례로 살펴봅니다.
메모리 ECC가 필요한 이유
메모리 셀은 아주 작은 전하로 0과 1을 구분합니다. 우주에서 온 중성자나 패키지 재료에서 나온 알파 입자가 셀을 지나가면 전하가 흐트러져 비트가 뒤집히는 소프트 에러(Soft Error)가 생기고, 전하를 오래 붙잡지 못하는 약한 셀이나 이웃 셀의 간섭 때문에 오류가 나기도 하죠.
비트 하나가 틀릴 확률은 매우 낮지만, 서버 한 대에 수백 GB, 데이터센터 전체로는 엄청난 수의 비트가 쉬지 않고 동작합니다. 그래서 드문 오류도 규모가 커지면 매일 일어나는 일이 되고, 금융 계산이나 과학 연산처럼 결과가 조용히 틀리면 안 되는 시스템에는 오류를 고치는 장치가 필수가 되죠.
메모리 ECC에서 ECC는 오류 정정 부호(ECC, Error Correcting Code)를 뜻합니다. 데이터 비트에 검사 비트(Check Bit)를 덧붙여 저장하고, 읽을 때 다시 계산해 비교하는 방식이죠.
패리티, 오류를 알아채는 가장 단순한 방법
가장 단순한 검사 비트는 패리티 비트(Parity Bit)입니다. 데이터 속 1의 개수가 짝수가 되도록 비트 하나를 덧붙이는 방식이죠. 예를 들어 1011에는 1이 세 개이므로 패리티 비트 1을 붙여 10111로 저장합니다.
나중에 읽었을 때 1의 개수가 홀수라면 어딘가 비트 하나가 뒤집힌 것입니다. 하지만 패리티는 오류가 있다는 사실만 알려 줄 뿐 어느 비트인지는 모르고, 두 비트가 동시에 뒤집히면 짝수로 돌아와 오류를 놓치죠.
해밍 코드, 오류의 위치까지 찾아내는 원리
해밍 코드(Hamming Code)는 패리티 비트 여러 개가 데이터의 서로 다른 부분을 겹쳐서 감시하게 만든 부호입니다. 어떤 검사가 실패했는지의 조합이 곧 틀린 비트의 위치를 가리키도록 설계했죠.
가장 작은 예인 (7,4) 해밍 코드는 데이터 4비트에 검사 비트 3개를 붙여 7비트로 저장합니다. 위치 번호가 1, 2, 4처럼 2의 거듭제곱인 자리에 검사 비트를 두고, 나머지 자리에 데이터를 넣죠.
(7,4) 해밍 코드 계산 예시데이터 1011을 위치 3, 5, 6, 7에 넣는다 (d1=1, d2=0, d3=1, d4=1)
p1(위치 1) = 위치 3, 5, 7의 패리티 = 1 ⊕ 0 ⊕ 1 = 0
p2(위치 2) = 위치 3, 6, 7의 패리티 = 1 ⊕ 1 ⊕ 1 = 1
p4(위치 4) = 위치 5, 6, 7의 패리티 = 0 ⊕ 1 ⊕ 1 = 0
저장되는 부호: 0110011
위치 5의 비트가 뒤집혀 0110111로 읽혔다면
검사 1(위치 1, 3, 5, 7): 0 ⊕ 1 ⊕ 1 ⊕ 1 = 1 (실패)
검사 2(위치 2, 3, 6, 7): 1 ⊕ 1 ⊕ 1 ⊕ 1 = 0 (통과)
검사 4(위치 4, 5, 6, 7): 0 ⊕ 1 ⊕ 1 ⊕ 1 = 1 (실패)
실패한 검사 번호의 합 4 + 1 = 5 → 위치 5를 뒤집어 0110011로 복구
모든 검사가 통과하면 오류가 없는 것이고, 실패한 검사 번호를 더하면 틀린 위치가 나옵니다. 이 합을 신드롬(Syndrome)이라고 부르며, 송장의 우편번호와 도로명이 서로 어긋나는 지점을 짚어 내는 것과 같은 역할을 하죠.
SEC-DED와 서버 메모리의 72비트 구조
해밍 코드만으로는 두 비트가 동시에 틀렸을 때 엉뚱한 위치를 고쳐 버릴 수 있습니다. 그래서 실제 메모리에는 전체 패리티 비트 하나를 더해, 1비트 오류는 고치고 2비트 오류는 고치지 못해도 알아채는 SEC-DED(Single Error Correction, Double Error Detection) 방식을 많이 씁니다.
데이터 64비트를 해밍 코드로 감싸려면 검사 비트 7개가 필요하고, 여기에 전체 패리티 1개를 더하면 8개가 됩니다. 이것이 서버용 D램 모듈에서 오래 쓰인 (72,64) 구조죠. DDR4까지의 ECC 모듈은 데이터 64비트에 검사 8비트를 더한 72비트 폭으로 동작했고, DDR5 모듈은 채널을 둘로 나눠 데이터 32비트에 검사 8비트를 더한 40비트 서브채널 두 개로 구성합니다.
이 방식에서는 검사 비트를 별도의 D램 칩에 저장하고, CPU 쪽 메모리 컨트롤러가 부호를 만들고 검사합니다. 데이터 옆의 별도 통로로 검사 비트가 오간다는 뜻에서 사이드밴드 ECC(Side-band ECC)라고 부르죠.
칩 하나가 통째로 고장 날 때, 칩킬
SEC-DED는 흩어진 비트 하나를 고치는 데 강합니다. 그런데 D램 칩 하나가 통째로 고장 나면 그 칩이 맡은 여러 비트가 한꺼번에 틀리므로, 1비트 정정으로는 감당하지 못하죠.
이를 위해 서버에서는 칩킬(Chipkill) 계열의 기술을 씁니다. 한 칩에서 나오는 4비트나 8비트를 하나의 심볼(Symbol)로 묶고, 리드-솔로몬 같은 심볼 단위 부호로 감싸 심볼 하나가 통째로 틀려도 복구하는 방식이죠. 회사마다 부르는 이름은 다르지만 칩 하나의 고장을 견디게 한다는 목표는 같습니다.
D램 안팎에서 동작하는 여러 겹의 ECC
최근의 메모리 시스템에는 ECC가 한 곳이 아니라 여러 위치에 겹쳐 있습니다. 어디에서 동작하는지, 무엇을 보호하는지가 서로 다르기 때문에 구분해 두는 것이 중요하죠.
DDR5의 온다이 ECC
DDR5부터는 D램 칩 내부에 온다이 ECC(On-die ECC)가 들어갔습니다. 셀이 작아지면서 늘어난 약한 셀의 오류를 칩 안에서 먼저 고치는 장치로, 메모리 컨트롤러는 이 정정이 일어났는지 알 수 없죠.
그래서 DDR5는 온다이 ECC가 있으니 ECC 메모리와 같다는 생각은 오해입니다. 온다이 ECC는 칩 안에 저장된 데이터만 보호하고 칩과 컨트롤러 사이를 오가는 동안의 오류는 다루지 않으므로, 서버에는 여전히 사이드밴드 ECC 모듈이 쓰입니다.
링크 ECC와 인밴드 ECC
모바일용 LPDDR5에는 데이터가 칩과 컨트롤러 사이를 이동하는 구간을 보호하는 링크 ECC(Link ECC)가 있습니다. 저장된 데이터가 아니라 전송 경로의 오류를 잡는 장치죠.
별도의 ECC 칩이 없는 시스템에서는 일반 메모리 공간의 일부에 검사 비트를 함께 저장하는 인밴드 ECC(In-band ECC)를 쓰기도 합니다. 추가 칩 없이 보호를 얻는 대신, 쓸 수 있는 용량이 줄고 검사 비트를 따로 읽어야 해서 성능 손해가 생길 수 있죠.
스크러빙, 오류가 쌓이기 전에 청소하기
SEC-DED는 1비트까지만 고칠 수 있으므로, 고치지 않은 1비트 오류가 같은 데이터에 하나 더 생기면 복구할 수 없게 됩니다. 그래서 시스템이 쉬는 동안 메모리 전체를 주기적으로 읽어 고친 값을 다시 써 넣는 스크러빙(Scrubbing)을 함께 씁니다.
낸드 플래시의 ECC, BCH에서 LDPC로
낸드 플래시는 D램보다 오류가 훨씬 흔합니다. 쓰고 지우기를 반복할수록 절연막이 닳고, 오래 두면 전하가 빠져나가며, 셀 하나에 3비트(TLC)나 4비트(QLC)를 저장하면 상태 사이의 간격이 좁아지기 때문이죠. 그래서 낸드에서는 오류가 있는 것을 전제로 강한 ECC를 붙입니다.
초기에는 정해진 개수의 비트 오류를 대수적으로 고치는 BCH 부호가 널리 쓰였습니다. BCH는 각 비트를 0 또는 1로만 읽은 경판정(Hard Decision) 정보로 동작하죠.
오류가 더 늘어난 세대에는 LDPC(Low-Density Parity-Check) 부호가 주로 쓰입니다. 같은 셀을 기준 전압을 조금씩 바꿔 여러 번 읽으면 각 비트가 얼마나 확실한지에 대한 연판정(Soft Decision) 정보를 얻을 수 있고, LDPC는 이 정보를 반복 계산에 활용해 더 많은 오류를 고치죠. 다만 여러 번 읽는 만큼 시간이 들기 때문에, 보통은 빠른 경판정 복호를 먼저 시도하고 실패할 때만 연판정으로 넘어갑니다.
메모리 ECC 방식 비교 표
| 구분 | 동작 위치 | 보호 대상 | 정정 능력과 특징 |
|---|---|---|---|
| 패리티 | 메모리 컨트롤러 등 | 저장·전송 데이터 | 1비트 오류 검출만 가능, 정정 불가 |
| SEC-DED (72,64) | 메모리 컨트롤러 | 모듈에 저장된 데이터와 전송 구간 | 1비트 정정, 2비트 검출 |
| 칩킬 계열 | 메모리 컨트롤러 | 칩 하나의 통째 고장 | 심볼 단위 정정, 서버용 |
| 온다이 ECC | D램 칩 내부 | 칩 안에 저장된 데이터 | 칩 내부 단일 비트 정정, 컨트롤러에 보이지 않음 |
| 링크 ECC | 컨트롤러와 D램 사이 | 전송 경로 | 전송 중 오류 정정, LPDDR5에 적용 |
| BCH / LDPC | SSD 컨트롤러 | 낸드에 저장된 데이터 | 다수 비트 정정, LDPC는 연판정으로 정정 능력 확대 |
핵심 정리
메모리 ECC는 데이터에 검사 비트를 붙여, 읽을 때 다시 계산한 결과로 오류의 존재와 위치를 찾아내는 기술입니다. 패리티는 오류를 알아채기만 하고, 해밍 코드는 위치까지 찾아 고치며, SEC-DED와 칩킬은 서버 환경에 맞게 이를 확장한 것이죠. 낸드에서는 오류가 훨씬 많아 BCH와 LDPC 같은 강한 부호가 쓰입니다.
택배 송장의 오타를 우편번호가 바로잡아 주듯, 여분의 정보가 서로를 받쳐 줄 때 오류는 고칠 수 있는 대상이 됩니다. ECC 사양을 볼 때는 그 ECC가 어디에서 동작하고 무엇을 보호하는지부터 확인하면, 온다이 ECC와 서버용 ECC를 헷갈리는 일이 줄어듭니다.
면접 대비 질문
면접 대비 질문DDR5에는 온다이 ECC가 기본으로 들어가는데, 서버에서 여전히 ECC 모듈(RDIMM)을 쓰는 이유는 무엇입니까?
[답변 포인트] 온다이 ECC는 D램 칩 안에 저장된 데이터의 단일 비트 오류를 칩 내부에서 고치는 장치로, 미세화로 늘어난 약한 셀에 대응하기 위한 것이라고 설명합니다. 칩과 메모리 컨트롤러 사이 전송 구간의 오류는 다루지 않고, 정정 결과를 시스템에 알려 주지 않아 오류 추세를 관리하기 어렵다는 한계를 짚습니다. 서버는 컨트롤러가 직접 부호를 만들고 검사하는 사이드밴드 ECC로 전송 구간까지 보호하고, 칩킬 같은 심볼 단위 정정과 스크러빙으로 칩 고장과 오류 누적에 대비한다는 점까지 연결하면 좋습니다.









