FTL(Flash Translation Layer)

FTL이란?

FTL(Flash Translation Layer)은 호스트가 사용하는 논리 블록 주소를 NAND Flash의 물리 주소와 대응시키고, Garbage Collection과 Wear Leveling 등을 관리하는 SSD 컨트롤러의 펌웨어 계층이다.

왜 필요한가?

운영체제의 블록 I/O 계층은 저장장치에 논리 블록 주소를 이용한 읽기·쓰기 요청을 전달한다. 반면 NAND Flash는 Page 단위로 데이터를 읽고 Program하며, Erase는 여러 Page로 구성된 Block 단위로 수행한다. 또한 기존 데이터가 기록된 Page를 바로 덮어쓸 수 없기 때문에, 논리 주소와 실제 NAND의 물리적 저장 위치를 분리하여 관리하는 FTL이 필요하다.

FTL의 주요 기능

  • Address Mapping
  • Out-of-Place Update
  • Garbage Collection
  • Wear Leveling
  • Bad Block Management
  • TRIM/Deallocate 처리

LBA(Logical Block Address)

LBA(Logical Block Addressing)는 호스트가 저장장치의 논리 블록에 접근하기 위해 사용하는 주소 지정 방식이다. 각 논리 블록에는 일반적으로 0부터 순차적으로 증가하는 주소가 부여되며, 호스트는 물리적인 NAND 위치를 알지 않아도 LBA를 이용하여 데이터를 읽거나 쓸 수 있다.

호스트가 읽기·쓰기 요청과 함께 LBA를 전달하면, FTL은 매핑 정보를 조회하여 해당 LBA에 대응하는 NAND의 물리적 저장 위치를 결정한다.

NAND Physical Address

NAND Physical Address는 NAND Flash 내부에서 데이터가 저장된 물리적 위치를 나타낸다. 물리 주소는 구현에 따라 Channel, Die, Plane, Block 및 Page 등의 위치정보로 구성될 수 있다. 이러한 물리 주소는 SSD 컨트롤러 내부에서 관리되며 호스트에는 직접 노출되지 않는다.

Mapping

FTL은 매핑 테이블을 이용하여 호스트의 LBA와 NAND Flash의 물리적 저장 위치를 대응시킨다. 읽기 요청에서는 LBA에 대응하는 물리 주소를 조회하고, 쓰기 요청에서는 새로운 물리 Page에 데이터를 기록한 후 매핑 정보를 갱신한다.

실제 구현에서는 하나 이상의 LBA를 내부적인 Logical Page 단위로 묶어 관리할 수 있으므로, LBA와 NAND Page가 항상 1:1로 대응하는 것은 아니다. 

Read mapping: Host LBA 수신 → Mapping Table 조회 → 물리 Page 확인 → NAND Read
Write mapping: Host LBA 수신 → Free Page 선택 → NAND Program → Mapping 갱신 → 기존 Page Invalid 처리

 

Mapping Granularity

Block Mapping에서는 작은 Random Write에도 비교적 큰 단위의 데이터 이동이 필요할 수 있어 WAF가 증가할 수 있다. Page Mapping은 Page 단위로 물리 위치를 관리하므로 이러한 불필요한 이동을 줄일 수 있지만, 더 많은 매핑 정보를 저장해야 한다. 실제 WAF는 매핑 방식뿐만 아니라 GC 정책, 여유 공간 및 Workload 특성에도 영향을 받는다.

Mapping Table의 저장 위치

FTL의 Mapping Table은 빠른 조회를 위해 일부 또는 전부가 SSD의 SRAM이나 DRAM에 저장될 수 있다. 전원이 꺼진 뒤에도 매핑 정보를 복구할 수 있도록 필요한 메타데이터는 NAND Flash에도 보존된다. 구체적인 저장 방식과 캐싱 범위는 SSD 설계에 따라 다르다.

따라서 SSD는 Mapping Table 전체 또는 일부를 휘발성 메모리에서 빠르게 조회하면서도, 전원 차단 후 매핑 정보를 복구할 수 있도록 필요한 매핑 메타데이터를 NAND에 별도로 유지한다. 구체적인 저장 및 복구 방식은 FTL 구현에 따라 달라진다.

 

Out-of-Place Update

NAND Flash는 이미 데이터가 기록된 Page에 새로운 데이터를 바로 덮어쓸 수 없다. 따라서 기존 LBA의 데이터가 수정되면 FTL은 새로운 물리 Page에 수정된 데이터를 기록하고, 해당 LBA의 매핑 정보를 새로운 물리 주소로 변경한다. 이전 데이터가 저장되어 있던 Page는 Invalid Page로 관리된다. 이러한 방식을 Out-of-Place Update라고 한다.

 

Garbage Collection

NAND는 데이터를 덮어 씌우지 못하고, 반드시 지운 후에만 쓸 수 있는 특성이 있다. 기존의 데이터를 수정할 경우, N FTL은 새로운 데이터를 사용 가능한 물리 Page에 기록하고, 해당 LBA의 매핑 정보를 새로운 물리 주소로 갱신한다. 이에 따라 이전 데이터가 저장되어 있던 Page는 더 이상 유효한 데이터를 가지지 않는 Invalid Page로 관리된다. Invalid Page는 즉시 재사용할 수 없으며, 해당 Block이 Erase된 이후에 다시 사용할 수 있다. 이러한 데이터들이 쌓여서 쓸 수 있는 저장 공간을 줄이기 때문에 주기적으로 불필요하게 점유된 공간들을 지워주는 Garbage Collection이 필수적이다. 

FTL은 SSD의 여유 공간과 쓰기 요청 상태 등을 고려하여 Garbage Collection을 수행한다. GC는 유휴 시간에 Background 방식으로 실행되거나, 쓰기에 필요한 여유 블록이 부족할 때 Foreground 방식으로 실행될 수 있다. FTL은 유효하지 않은 데이터가 많은 블록을 선별한 뒤, 해당 블록에서 유효 데이터만 다른 블록으로 복사한다. 이후 대상 블록을 Erase하여 새로운 데이터를 기록할 수 있는 Free Block으로 만든다.

부작용과 성능 저하

그런데 1MB의 데이터만 썼는데도, GC 과정에서 유효 데이터를 옮기느라 내부적으로는 2MB, 3MB의 쓰기 작업이 일어날 수 있다. 이 경우 WAF는 각각 2와 3이다.  이를 쓰기 증폭 현상(Write Amplification Factor, WAF) 라고 하며, 추가적인 내부 데이터 이동이 없다고 가정하면 WAF의 이상적인 값은 1이다. 따라서 FTL은 GC와 Wear Leveling 등으로 발생하는 내부 쓰기를 줄여 WAF를 가능한 한 1에 가깝게 유지하도록 설계된다. 여유 블록이 부족한 상태에서 Foreground GC가 실행되면 GC의 데이터 이동과 호스트의 I/O 요청이 NAND 자원을 함께 사용하게 된다. 이에 따라 쓰기 지연시간이 증가하고 순간적인 성능 저하가 발생할 수 있다.

 

Write Amplification

사용자가 원래 저장하려고 하는 데이터의 양보다 SSD 내부에서 실제로 쓰인 데이터의 양이 더 많은 현상을 말한다.

이를 수치화한 것이 쓰기 증폭 계수로 다음과 같은 식으로 나타낸다.

\[
\text{WAF}
=
\frac{\text{NAND Flash에 실제로 기록된 데이터 양}}
{\text{ 호스트가 SSD에 기록하도록 요청한 데이터 양}}
\] 

완화 전략

FTL 설계자들은 WAF를 최대한 1로 낮추기 위해 다음과 같은 전략을 사용한다.

GC 대상 블록 선택(Victim Block Selection)

GC 과정에서 이동해야 하는 유효 데이터의 양을 줄이기 위해, 일반적으로 유효 Page가 적거나 무효 Page의 비율이 높은 블록을 우선적인 대상으로 선택할 수 있다. 다만 실제 SSD는 블록의 P/E Cycle, 데이터의 갱신 빈도 및 블록 사용 시점 등을 함께 고려하여 GC 대상 블록을 결정할 수 있다.

Hot / Cold Data Separation - 데이터 생명 주기 분리

자주 갱신되는 Hot Data와 갱신 빈도가 낮은 Cold Data를 서로 다른 블록에 저장한다. 이렇게 하면 Hot Data가 저장된 블록에는 무효 Page가 빠르게 모이고, GC 과정에서 장기간 유지되는 Cold Data를 반복적으로 복사하지 않아도 되므로 WAF를 줄일 수 있다.

TRIM / Deallocate

TRIM 또는 Deallocate는 파일 시스템이나 호스트가 더 이상 유효하게 사용할 필요가 없는 LBA 범위를 SSD에 알려주는 기능이다. SSD는 해당 범위의 데이터를 더 이상 유지할 필요가 없다고 판단할 수 있으므로, 이후 GC에서 복사해야 하는 유효 데이터의 양을 줄일 수 있다.

Over-Provisioning

NAND의 물리 용량 중 일부를 호스트에 노출하지 않고 SSD 내부 관리에 사용하는 방식이다. 이 공간은 Garbage Collection, Wear Leveling 및 Bad Block 대체 등에 활용되며, 여유 블록을 확보하여 WAF와 쓰기 지연을 줄이는 데 도움을 준다. 구체적인 비율은 SSD의 용도와 제조사 설계에 따라 달라진다.

 

Wear Leveling

NAND Block은 허용 가능한 P/E Cycle이 제한되어 있다. 특정 블록에 Program과 Erase가 집중되면 해당 블록이 다른 블록보다 먼저 마모될 수 있다.

Wear Leveling은 쓰기와 Erase를 여러 블록에 분산하여 블록 간 마모 편차를 줄이는 기술이다. 갱신되는 데이터의 배치를 분산하는 Dynamic Wear Leveling과, 장기간 이동하지 않는 Cold Data까지 재배치하는 Static Wear Leveling으로 구분할 수 있다.

 

Bad Block Management

NAND Flash에는 제조 시점부터 사용할 수 없는 Initial Bad Block과 사용 중 열화로 발생하는 Runtime Bad Block이 존재할 수 있다. SSD 컨트롤러는 이러한 블록을 식별하여 사용 대상에서 제외하고, 필요한 경우 예비 블록으로 대체한다. 구체적인 기능 분담은 SSD 구현에 따라 달라질 수 있다.