웨어 레벨링과 FTL, 낸드 수명을 지키는 주소 변환의 원리
학교 사물함은 학생에게 17번처럼 번호만 알려 주고, 그 번호가 실제로 어느 칸인지는 담임 선생님의 명부가 압니다. 어떤 칸의 문이 유난히 자주 열려 헐거워지면 선생님이 명부만 고쳐서 학생 몰래 다른 칸으로 옮겨 줄 수 있죠.
SSD 안에서도 비슷한 일이 벌어집니다. 이 글의 주제인 웨어 레벨링은 낸드 플래시의 특정 칸만 먼저 닳지 않도록 쓰는 위치를 고르게 돌리는 기술이고, 이를 가능하게 하는 명부가 FTL입니다.
사물함과 다른 점이 있습니다. 사물함 속 물건은 그 자리에서 바꿔 넣으면 되지만, 낸드는 같은 자리에 덮어쓸 수 없고 지우는 단위도 쓰는 단위보다 훨씬 큽니다. 이 제약이 FTL과 가비지 컬렉션과 웨어 레벨링을 한 묶음으로 만든 출발점입니다.
낸드는 덮어쓸 수 없고 닳는다는 두 가지 제약
낸드 플래시는 페이지(Page) 단위로 읽고 쓰고, 여러 페이지가 모인 블록(Block) 단위로 지웁니다. 페이지는 일반적으로 수 KB에서 십수 KB, 블록은 수백 개 이상의 페이지로 이루어지는 경우가 많습니다.
이미 쓴 페이지에는 값을 바로 덮어쓸 수 없고, 먼저 그 페이지가 속한 블록 전체를 지워야 다시 쓸 수 있습니다. 4 KB짜리 파일 하나를 고치려고 블록 전체를 지우고 다시 쓰는 것은 너무 비효율적이므로, 다른 방법이 필요합니다.
두 번째 제약은 수명입니다. 블록을 지우고 다시 쓰는 과정, 곧 P/E 사이클을 반복하면 셀의 절연막이 조금씩 열화되어 결국 데이터를 안정적으로 붙잡지 못하게 됩니다. 이 한계 횟수는 셀이 한 번에 담는 비트 수와 공정에 따라 달라서, 비트를 많이 담을수록 대체로 줄어듭니다.
FTL이 논리 주소를 물리 주소로 바꾸는 방식
FTL(Flash Translation Layer)은 SSD 컨트롤러 안에서 호스트가 쓰는 논리 주소(LBA)를 낸드의 실제 물리 위치로 바꿔 주는 계층입니다. 호스트는 낸드가 덮어쓰기를 못 한다는 사실을 몰라도 되도록, FTL이 중간에서 이를 숨겨 줍니다.
호스트가 같은 주소에 다시 쓸 때
- 호스트가 LBA 100번에 새 데이터를 쓰라고 요청합니다.
- FTL은 이미 쓰여 있는 물리 페이지를 건드리지 않고, 비어 있는 새 페이지를 고릅니다.
- 새 데이터를 그 페이지에 쓰고, 매핑 테이블에서 LBA 100번이 가리키는 위치를 새 페이지로 고칩니다.
- 예전 페이지에는 쓸모없다는 뜻의 무효(Invalid) 표시만 남깁니다.
- 읽기 요청이 오면 매핑 테이블을 조회해 가장 최근 데이터가 있는 물리 위치를 찾아 줍니다.
핵심은 호스트의 같은 주소가 낸드의 같은 자리에 대응하지 않는다는 점입니다. 쓰기가 일어날 때마다 데이터가 새 자리로 옮겨 다니니, 이 간접 층 덕분에 물리 위치를 자유롭게 고를 수 있게 됩니다.
여기서 파일을 지우면 해당 낸드 셀이 바로 지워진다는 생각은 흔한 오해입니다. 대부분의 경우 지운 파일의 페이지는 무효로 표시될 뿐이고, 실제 소거는 나중에 가비지 컬렉션이 블록 단위로 처리합니다.
가비지 컬렉션과 쓰기 증폭
무효 페이지가 쌓이면 빈 페이지가 점점 줄어듭니다. 이때 FTL은 무효 페이지가 많은 블록을 골라, 그 안에 남은 유효 페이지만 다른 블록으로 옮겨 쓰고, 원래 블록을 통째로 지워 빈 블록으로 되돌립니다. 이 과정이 가비지 컬렉션(Garbage Collection)입니다.
문제는 유효 페이지를 옮기느라 호스트가 요청하지 않은 쓰기가 낸드에 추가로 생긴다는 점입니다. 호스트가 쓴 양 대비 낸드가 실제로 쓴 양의 비율을 쓰기 증폭(WAF, Write Amplification Factor)이라고 하며, 1에 가까울수록 낸드의 수명을 덜 소모합니다.
가상 계산 예시, 쓰기 증폭실제 제품 값이 아니라 설명을 위한 가정입니다. 블록 하나가 256페이지이고, 가비지 컬렉션 대상 블록에 유효 페이지가 64개, 무효 페이지가 192개 있다고 둡니다.
유효 64개를 옮기고 블록을 지우면 빈 페이지 192개가 생기고, 호스트가 이 192페이지를 채우는 동안 낸드는 192 + 64 = 256페이지를 쓰게 됩니다. 쓰기 증폭은 256 ÷ 192 ≈ 1.33입니다.
유효 페이지가 128개인 블록을 골랐다면 빈 페이지 128개를 얻는 대가로 128개를 옮겨야 해서 (128 + 128) ÷ 128 = 2가 됩니다. 무효 페이지가 많은 블록을 고를수록 쓰기 증폭이 낮아집니다.
웨어 레벨링, 소거 횟수를 고르게 맞추는 방법
쓰기가 몇몇 블록에 몰리면 그 블록만 한계에 먼저 닿습니다. 웨어 레벨링(Wear Leveling)은 블록마다 소거 횟수가 비슷해지도록 쓰는 위치를 고르게 돌리는 기술이며, FTL의 간접 층이 있어서 가능합니다.
가장 기본은 동적 웨어 레벨링(Dynamic Wear Leveling)입니다. 새로 쓸 데이터를 받을 빈 블록을 고를 때, 소거 횟수가 적은 블록부터 순서대로 쓰는 방식입니다. 하지만 이 방식은 자주 바뀌는 데이터가 오가는 블록들만 돌고, 한 번 쓰고 거의 바뀌지 않는 데이터가 자리 잡은 블록은 순환에서 빠집니다.
이 빈틈을 메우는 것이 정적 웨어 레벨링(Static Wear Leveling)입니다. 오래 바뀌지 않은 데이터가 차지한 블록의 내용을 일부러 소거 횟수가 많은 블록 쪽으로 옮기고, 비워진 적게 닳은 블록을 순환에 합류시킵니다. 이동에 추가 쓰기가 들지만, 전체 블록이 함께 닳아 가도록 만드는 대가입니다.
그리고 마모 평준화가 있으면 SSD 수명이 무한해진다는 기대는 오해입니다. 이 기술은 닳는 속도를 고르게 맞출 뿐이고, 모든 블록의 소거 한계가 가까워지면 결국 용량과 수명이 끝납니다.
수명을 숫자로 가늠해 보는 가상 계산
수명은 총 기록량으로 표현하는 경우가 많고, 대략 이렇게 가늠할 수 있습니다. 용량에 블록당 소거 한계 횟수를 곱한 값이 낸드가 받아 줄 수 있는 총량이고, 여기에 쓰기 증폭을 반영해 호스트가 쓸 수 있는 양으로 환산합니다.
가상 계산 예시, 총 기록량실제 제품 값이 아니라 설명을 위한 가정입니다. 용량 1 TB, 블록당 소거 한계 3,000회, 쓰기 증폭 1.33(앞의 계산값)이라고 둡니다.
호스트가 쓸 수 있는 총량은 1 TB × 3,000 ÷ 1.33 ≈ 2,250 TB입니다. 하루에 100 GB씩 쓴다면 약 2,250,000 GB ÷ 100 GB = 22,500일, 60년이 넘는 셈이지만 실제 제품은 여유 공간, 오류 정정 여력, 분포의 치우침 때문에 이보다 보수적으로 표기합니다.
이 계산은 쓰기가 모든 블록에 완전히 고르게 퍼졌다고 가정한 이상적인 값입니다. 만약 마모 평준화가 없어서 쓰기가 전체 블록의 1%에만 계속 몰린다면, 그 1%가 먼저 한계에 닿으므로 쓸 수 있는 총량은 이상적인 값의 약 1%로 줄어드는 셈입니다.
매핑 테이블과 TRIM과 여유 공간의 역할
FTL의 명부, 곧 매핑 테이블은 크기가 만만치 않습니다. 4 KB 단위로 매핑하고 항목 하나를 4바이트로 잡으면 4 ÷ 4,096으로 용량의 약 1,000분의 1이고, 1 TB(2의 40제곱 바이트)라면 항목이 2의 28제곱 개, 곧 약 1 GB가 됩니다.
그래서 SSD는 이 테이블을 DRAM에 올려 두거나, DRAM을 아끼는 제품은 호스트 메모리나 낸드 일부를 활용하는 방식을 씁니다. 설계마다 선택이 달라 성능과 비용에서 차이가 생깁니다.
TRIM은 운영체제가 삭제된 주소를 SSD에 알려 주는 명령으로, FTL이 이 정보를 받으면 해당 페이지를 미리 무효로 처리해 가비지 컬렉션에서 옮길 유효 페이지를 줄일 수 있습니다. 여기에 사용자에게 보이지 않는 여유 공간(오버 프로비저닝)을 두면 가비지 컬렉션의 선택 폭이 넓어져 쓰기 증폭이 낮아집니다.
가비지 컬렉션과 두 가지 웨어 레벨링 비교 표
| 구분 | 가비지 컬렉션 | 동적 웨어 레벨링 | 정적 웨어 레벨링 |
|---|---|---|---|
| 목적 | 무효 페이지를 모아 빈 블록 확보 | 쓰기를 소거 횟수가 적은 블록으로 분산 | 바뀌지 않는 데이터의 블록까지 순환에 포함 |
| 대상 | 무효 페이지가 많은 블록 | 새 데이터를 받을 빈 블록 | 오래 바뀌지 않은 데이터가 있는 블록 |
| 동작 | 유효 페이지를 옮기고 블록 소거 | 소거 횟수가 적은 빈 블록부터 사용 | 콜드 데이터를 이동해 덜 닳은 블록을 해방 |
| 추가 비용 | 유효 페이지 복사로 쓰기 증폭 발생 | 거의 없음 | 이동을 위한 추가 쓰기 발생 |
| 한계 | 유효 페이지가 많으면 효율이 낮음 | 고정된 데이터의 블록은 닳지 않고 방치 | 이동 자체가 수명을 일부 소모 |
| 놓치기 쉬운 점 | 파일을 지우면 셀이 바로 지워진다는 오해와 수명이 무한해진다는 오해에 주의합니다. | ||
핵심 정리
낸드는 덮어쓸 수 없고 소거 횟수에 한계가 있어서, FTL이 논리 주소와 물리 위치 사이에 매핑 계층을 두고 쓰기를 새 페이지로 돌립니다. 이 위에서 가비지 컬렉션이 빈 블록을 확보하고, 웨어 레벨링이 소거 횟수를 고르게 맞춰 어느 한 블록만 먼저 닳는 일을 막습니다.
사물함 명부를 고쳐 헐거운 칸을 쉬게 하듯 이 기술들은 쓰는 위치를 바꿔 수명을 늘릴 뿐, 닳는 총량을 없애지는 못합니다. 그래서 쓰기 증폭을 낮추는 것과 닳음을 고르게 퍼뜨리는 것이 수명 설계의 두 축입니다.
면접 대비 질문
면접 대비 질문SSD에서 FTL이 필요한 이유를 낸드의 특성과 연결해 설명하고, 웨어 레벨링과 가비지 컬렉션이 쓰기 증폭과 수명에 주는 영향을 말해 보세요.
[답변 포인트] 낸드가 페이지 단위로 쓰고 블록 단위로 지우며 덮어쓰기가 안 된다는 점, 그리고 소거 횟수에 한계가 있다는 점으로 시작합니다. FTL이 논리 주소를 물리 주소로 매핑해 쓰기를 새 페이지로 돌리고 옛 페이지를 무효로 표시한다고 설명한 뒤, 가비지 컬렉션이 유효 페이지를 옮기면서 쓰기 증폭이 생긴다는 점을 연결합니다. 웨어 레벨링은 동적과 정적으로 나뉘어 소거 횟수를 고르게 맞추지만 이동에 따른 추가 쓰기가 있다는 점, 여유 공간과 TRIM이 쓰기 증폭을 낮춘다는 점, 총 기록량이 용량과 소거 한계 횟수를 쓰기 증폭으로 나눈 값으로 가늠된다는 점까지 덧붙이면 좋습니다.









