dynamic wear leveling은 새 write를 erase 횟수가 적은 free block에 배치한다.
static wear leveling은 거의 변하지 않는 cold data도 가끔 옮겨서 특정 block만 너무 적게 쓰이고 다른 block만 너무 많이 쓰이는 상황을 줄인다.
wear leveling은 SSD 수명을 늘리기 위한 핵심 기법이다.
Over-provisioning
SSD는 host에게 보이는 capacity보다 실제 NAND capacity를 더 많이 가질 수 있다.
이 여분 공간을 over-provisioning이라고 한다.
over-provisioning은 다음에 도움이 된다.
garbage collection
wear leveling
bad block replacement
write amplification 감소
free block이 충분하면 GC가 더 효율적으로 동작할 수 있다.
반대로 SSD가 거의 가득 차면 GC가 어려워지고 write amplification이 커질 수 있다.
그래서 SSD는 여유 공간이 있을수록 성능 유지가 더 쉽다.
SSD Performance Characteristics
SSD는 HDD보다 random access가 훨씬 빠르다.
mechanical seek이 없기 때문이다.
하지만 SSD도 read와 write 특성이 다르다.
read는 비교적 간단하다.
mapping table을 보고 physical page를 읽으면 된다.
write는 복잡하다.
overwrite가 안 된다.
새 page에 써야 한다.
old page를 invalid 처리해야 한다.
나중에 GC가 필요하다.
그래서 SSD는 read 성능이 write 성능보다 안정적인 경우가 많다.
random write는 GC와 write amplification 때문에 성능 변동이 클 수 있다.
SSD 성능은 다음 요소에 영향을 받는다.
FTL mapping policy
GC policy
wear leveling policy
내부 병렬성
DRAM cache
over-provisioning
workload pattern
SSD vs HDD: 핵심 차이
HDD는 physical geometry와 mechanical movement가 중요하다.
SSD는 NAND flash constraint와 internal management가 중요하다.
HDD 최적화의 핵심은 seek과 rotational delay를 줄이는 것이다.
SSD 최적화의 핵심은 write amplification과 GC overhead를 줄이는 것이다.
HDD에서는 sequential access가 random access보다 압도적으로 유리하다.
SSD에서도 sequential write가 유리할 수 있지만, HDD만큼 mechanical difference가 크지는 않다.
SSD는 random read에 강하다.
하지만 random write는 내부적으로 invalid page를 많이 만들고 GC 부담을 키울 수 있다.
따라서 SSD는 빠르지만 내부적으로 매우 복잡한 translation system을 가진 storage라고 볼 수 있다.
Why FTL Is Needed
host file system은 block device abstraction을 기대한다.
즉 host는 다음처럼 생각한다.
sector 0을 read/write할 수 있다.
sector 1을 read/write할 수 있다.
같은 sector에 여러 번 write할 수 있다.
하지만 NAND flash는 다음과 같은 특성을 가진다.
page 단위 program
block 단위 erase
no in-place update
bad block 존재
limited erase cycles
이 둘 사이에는 mismatch가 있다.
FTL은 이 mismatch를 숨긴다.
FTL이 없으면 file system이 직접 NAND flash의 모든 제약을 이해해야 한다.
SSD는 FTL 덕분에 기존 OS와 file system에서 disk처럼 사용할 수 있다.
SSD 내부 병렬성
SSD는 여러 NAND chip, die, plane, channel을 병렬로 사용할 수 있다.
controller는 여러 request를 동시에 여러 channel에 분산시킬 수 있다.
이 내부 병렬성이 SSD throughput을 높인다.
host interface가 SATA에서 PCIe/NVMe로 발전한 이유도 SSD 내부 병렬성과 낮은 latency를 더 잘 활용하기 위해서다.
HDD는 mechanical arm 때문에 병렬성이 제한적이다.
SSD는 moving part가 없고 여러 NAND unit을 병렬로 다룰 수 있어 높은 IOPS를 낼 수 있다.
Reliability Issues
SSD reliability는 단순히 “고장 안 남”이 아니라 여러 내부 기법에 의존한다.
주요 reliability issue는 다음과 같다.
bit error
bad block
wear-out
power loss during write
SSD controller는 ECC로 bit error를 수정한다.
bad block table로 bad block을 피한다.
wear leveling으로 block wear를 고르게 만든다.
mapping table과 metadata를 안전하게 유지해야 한다.
power loss 중 mapping update가 깨지면 data loss가 생길 수 있다.
따라서 enterprise SSD는 power-loss protection capacitor 등을 갖기도 한다.
TRIM
SSD에서는 host가 더 이상 사용하지 않는 logical block을 SSD에게 알려주는 것이 중요하다.
file을 삭제해도 일반적으로 SSD는 그 LBA가 더 이상 필요 없다는 사실을 바로 모를 수 있다.
TRIM command는 OS가 SSD에게 “이 logical block들은 더 이상 유효하지 않다”고 알려주는 기능이다.
SSD는 해당 mapping을 invalid 처리하여 GC를 더 효율적으로 할 수 있다.
TRIM은 write amplification을 줄이고 성능 유지에 도움이 된다.
강의 슬라이드의 핵심 범위는 FTL과 GC이지만, TRIM은 SSD 최적화 맥락에서 함께 기억하면 좋다.
Summary
이 단원은 flash-based SSD의 구조와 동작 원리를 다룬다.
SSD는 NAND flash를 기반으로 한 persistent storage다.
NAND flash는 non-volatile이고 빠르지만 여러 제약이 있다.
가장 중요한 제약은 다음이다.
erase-before-write
no in-place update
page 단위 program
block 단위 erase
bit errors
bad blocks
limited program/erase cycles
SSD는 host에게 block device처럼 보인다.
하지만 내부에서는 FTL이 logical address를 physical flash page로 mapping한다.
write는 overwrite가 아니라 새 free page에 기록하는 방식으로 처리된다.
old page는 invalid 처리된다.
invalid page가 많아지면 garbage collection이 수행된다.
GC는 valid page를 다른 block으로 copy하고 victim block을 erase한다.
이 과정에서 write amplification이 발생할 수 있다.
wear leveling은 erase 횟수를 고르게 분산시켜 SSD 수명을 늘린다.
SSD는 HDD보다 random access가 훨씬 빠르지만, write path는 FTL, GC, wear leveling 때문에 복잡하다.
결국 16단원의 핵심은 SSD는 HDD보다 빠른 flash-based block device이지만, NAND flash의 erase-before-write 제약을 숨기기 위해 FTL, mapping, GC, wear leveling 같은 복잡한 내부 mechanism이 필요하다는 것이다.