모든 이야기

NAND 쓰기 중 전원 차단이 새 page 밖까지 영향을 주는 이유

NAND에 새 데이터를 쓰다가 전원이 끊겼다. 새 page가 미완성인 것은 이해할 수 있는데, 예전에 쓰기를 끝낸 page도 읽히지 않을 수 있다. 서로 다른 page 번호가 언제나 서로 다른 물리적 셀을 뜻하지는 않기 때문이다. 다중 비트 NAND에서는 한 셀의 threshold voltage가 여러 page의 비트를 함께 표현한다.

NAND Power-Fail Corruption을 살펴볼 때 중요한 질문은 “지금 어느 주소에 쓰고 있었나” 다음에 있다. 이번 쓰기가 이미 저장된 비트를 담은 같은 셀의 상태를 다시 이동시키고 있었는가를 보아야 한다.

완료한 비트를 나중 쓰기가 다시 건드리는 구조

두 비트 MLC의 일부 programming 방식은 lower page를 먼저 쓰고 upper page를 뒤에 쓴다. 첫 단계에서는 두 상태로 나누었던 셀을 다음 단계에서 네 최종 상태로 세분한다. upper page는 별도 셀에 한 비트를 추가하는 작업이 아니라, 기존 lower bit를 보존하면서 같은 셀을 최종 threshold로 이동시키는 작업이다.

Micron의 How Micron SSDs Handle Unexpected Power Loss, 2쪽 Figure 2 설명은 upper-page programming 중 전원 차단이 미완성 upper page뿐 아니라 과거에 기록한 lower-page data도 손상할 수 있다고 설명한다. 이 자료가 다루는 MLC 방식의 사례이며, 모든 최신 TLC·QLC의 내부 순서가 동일하다는 주장은 아니다.

완료한 lower-page command의 성공은 당시 단계가 성공했다는 정보다. 이후 같은 셀을 바꾸는 작업까지 언제나 안전하게 끝난다는 보증은 별도로 필요하다.

중간 전압은 유효한 최종 상태와 다르다

다음은 원리만 보여 주는 가상 decoder다. lower-only 단계의 판정 기준은 0.6V이고, 셀을 1.2V까지 program해 lower bit 0을 저장했다고 하자. 다음 upper-page 단계는 이 셀을 2.4V의 최종 상태로 이동시키며 lower bit 0을 유지하도록 설계된다. 최종 단계에서 lower bit를 구분하는 경계는 1.8V라고 가정한다.

정상 완료하면 2.4V는 1.8V보다 높아 원래 lower bit 0이 유지된다. 그러나 상승 도중 1.5V에서 멈추고 이 셀을 최종 상태로 해석하면 경계 아래이므로 lower bit 1로 읽힌다. 새 비트의 미완성과 기존 비트의 오해석이 함께 생길 수 있다.

이 전압과 경계는 실제 NAND의 state table이 아니다. 첫 단계와 최종 단계의 상태 해석이 다르고, 전원 차단 후 남은 중간 분포를 정상 완료 분포로 취급하면 위험하다는 점을 분리한 예다. 실제 recovery는 programming 단계와 저장한 metadata를 이용할 수도 있다. 미완성 상태가 언제나 영구 복구 불능이라는 뜻도 아니다.

ECC가 남겨 놓은 여유에도 한계가 있다

ECC는 읽은 비트의 오류가 지원 범위 안에 있을 때 원래 데이터를 복원한다. 하지만 쓰기 중단이 넓은 셀 집합의 분포를 흔들면 일반적인 작은 random error와 다른 형태의 손상이 생길 수 있다. 현재 page만 다시 쓰면 충분하다고 가정할 근거가 없다.

복구할 때는 새 page의 유효성, 함께 상태를 공유한 page의 내용, 논리 주소가 어느 복사본을 가리키는지를 함께 확인해야 한다. 올바른 payload가 다른 위치에 남아 있어도 mapping을 잃으면 host가 그 데이터를 찾지 못한다. 반대로 mapping이 살아 있어도 대상 셀이 미완성이면 주소표만으로 값은 복원되지 않는다.

물리 program 성공 상태와 파일·데이터베이스의 transaction 원자성도 서로 다른 층의 계약이다. 여러 page를 바꾸는 업데이트라면 어느 버전을 선택할지 결정할 기록과 순서가 필요하다. 하나의 NAND status bit로 전체 transaction을 설명할 수 없다.

보호가 지켜 주는 범위를 확인하기

전원이 사라지기 전에 작업을 마칠 에너지를 남겨 두거나, 안전한 복사본과 단계 정보를 보존하면 손실 범위를 줄일 수 있다. 다만 보호 대상이 이미 media에 있던 data인지, volatile buffer에 남은 새 data까지인지에 따라 필요한 작업이 다르다. 부품 이름에 보호 기능이 있다는 사실만으로 두 범위를 같게 볼 수 없다.

검증도 upper-page write를 중단한 뒤 새 주소만 읽는 것으로 끝내기 어렵다. 쓰기 전에 저장한 lower-page pattern을 따로 보관하고, 재시작 후 기존 page와 주소 관계까지 비교해야 같은 셀을 공유하는 영향을 볼 수 있다.

NAND 쓰기 중 전원 차단의 경계는 command 주소보다 넓을 수 있다. 이미 끝낸 쓰기도 다음 단계에서 같은 물리 상태를 다시 이동시킨다면 보호 대상에 들어간다. 어느 page가 완료했는지와 어느 셀이 아직 변하고 있는지를 함께 확인하는 것이 과거 데이터까지 영향을 받는 이유를 이해하는 출발점이다.

NAND 쓰기 중 전원 차단이 새 page 밖까지 영향을 주는 이유 · ariser