CS Insights

SSD NAND 플래시 메모리의 구동 원리와 FTL(Flash Translation Layer) 알고리즘 논리

SSD NAND 플래시 메모리의 구동 원리와 FTL(Flash Translation Layer) 알고리즘 논리
최근 실무에서 이 기술을 프로젝트에 적용해 보면서 정말 많은 시행착오를 겪었습니다. 답답한 마음에 제가 직접 정리해 본 핵심 내용입니다. 우리가 흔히 사용하는 SSD(Solid State Drive)의 내부 구조는 전통적인 기계식 자기 디스크(HDD)와는 컴퓨터 구조론적으로 완전히 판이한 세계입니다. HDD가 원판을 회전시키고 자기 헤드를 통해 섹터 단위로 데이터를 무작위로 덮어쓰기(Overwrite) 할 수 있는 반면, SSD의 핵심 부품인 NAND 플래시 메모리는 물리적인 덮어쓰기가 불가능하다는 치명적인 기계적 결함을 안고 있습니다. 플래시 메모리의 셀에 데이터를 쓰기 위해서는 반드시 그 셀이 비어있는 상태여야만 하며, 이미 데이터가 채워진 상태라면 반드시 지우기(Erase) 동작을 선행해야 합니다. 그러나 읽기와 쓰기는 작은 페이지(Page) 단위로 이루어지지만, 지우기 연산은 훨씬 거대한 블록(Block) 단위로만 수행될 수 있다는 점이 엔지니어들을 절망에 빠뜨렸습니다. 4KB를 수정하기 위해 수 MB에 달하는 전체 블록을 지우고 다시 써야 한다면 성능은 바닥을 칠 것이기 때문입니다. 이 심각한 인터페이스 불일치를 해소하고 운영체제가 SSD를 마치 평범한 HDD처럼 다룰 수 있게 해주는 마법이 바로 컨트롤러 내장 소프트웨어인 FTL(Flash Translation Layer)입니다. 운영체제가 논리적 블록 주소(LBA)인 100번에 데이터를 기록하라는 I/O 인터럽트를 보내면, FTL은 실제 물리적 100번지에 기록하는 것이 아니라 현재 비어있는 임의의 물리적 페이지(PBA)에 데이터를 순차적으로 기록한 뒤, 자체적인 매핑 테이블 인덱스를 수정하여 LBA 100번이 새로운 PBA를 가리키도록 연결선만 바꿔치기합니다. 이 과정 덕분에 기존 데이터가 저장된 블록을 즉시 지우지 않아도 되며 폭발적인 랜덤 쓰기 성능을 발휘할 수 있습니다. 대신 과거의 LBA 100번지에 남아있던 구 데이터는 접근할 수 없는 가비지(Garbage) 데이터로 전락하게 됩니다. 마치 LSM-Tree 데이터베이스의 동작 원리처럼, 이 방식은 유휴 상태일 때 가비지가 가득 찬 블록들을 찾아내어 살아있는 희소한 데이터만을 새로운 블록으로 이주(Migration)시키고, 구 블록들을 통째로 지워버려 다시 사용할 수 있는 빈 공간으로 만드는 가비지 컬렉션(Garbage Collection) 프로세스를 필연적으로 요구합니다. 가비지 컬렉션이 발동하는 순간 컨트롤러 내부 매핑 캐시와 I/O 큐는 극심한 병목 현상을 겪게 되며 이는 사용자가 느끼는 알 수 없는 프리징이나 성능 저하의 주범이 됩니다. 이를 완화하기 위해 운영체제는 지워진 파일의 주소를 컨트롤러에 미리 귀띔해 주는 TRIM 명령어를 보내어 FTL 알고리즘이 가비지 컬렉션을 아주 여유롭게 수행할 수 있도록 통제하며, 컨트롤러 자체 펌웨어에는 제조사별로 웨어 레벨링(Wear Leveling)이라는 독자적인 수명 평준화 알고리즘을 탑재하여 특정 낸드 셀만 가혹하게 마모되어 드라이브가 조기 사망하는 사태를 철저히 방어하고 있습니다.