SSD와 플래시 컨트롤러
8장과 9장에서 본 NAND 플래시는 덮어쓸 수 없고, 쓰는 단위와 지우는 단위가 다르며, 몇천 번 지우면 닳는 까다로운 소자다. 그런데 운영체제는 SSD를 "아무 주소에나 몇 번이고 덮어쓸 수 있는 디스크"로 쓴다. 이 간극을 메우는 것이 SSD 컨트롤러와 그 안의 펌웨어 — 플래시 변환 계층(FTL)이다. 이 장에서는 주소 매핑, 가비지 컬렉션, 쓰기 증폭, 웨어 레벨링, SLC 캐시, 그리고 NVMe 인터페이스까지 SSD가 '빠르고 오래가는 디스크'인 척하는 기술을 하나씩 해부한다.
- SSD의 구성 요소(컨트롤러, NAND, DRAM/HMB)와 채널·웨이·다이·플레인 병렬성으로 처리량을 계산할 수 있다.
- NAND의 세 가지 제약(덮어쓰기 불가, 페이지/블록 단위 불일치, 제한된 P/E)이 FTL을 필요로 하는 이유를 설명할 수 있다.
- 페이지 매핑 FTL의 out-of-place 업데이트와 매핑 테이블 DRAM 요구량(1 TB당 약 1 GB)을 계산할 수 있다.
- 가비지 컬렉션의 동작, victim 선택 정책, 쓰기 증폭 계수 \(\mathrm{WAF} = 1/(1-u)\)와 오버 프로비저닝의 관계를 이해한다.
- TBW·DWPD를 계산하고, SLC 캐시의 쓰기 속도 절벽과 TRIM의 효과를 설명할 수 있다.
- NVMe 큐 구조와 리틀의 법칙으로 큐 깊이–IOPS–지연의 관계를 설명하고, PCIe 세대별 대역폭과 ZNS·FDP의 의미를 안다.
SSD 해부: 컨트롤러 · NAND · DRAM
M.2 2280 SSD 기판을 뒤집어 보면 부품은 의외로 단출하다. 가운데에 컨트롤러(Controller SoC) 하나, 그 옆에 DRAM 칩 하나(없는 제품도 있다), 그리고 나머지 면적을 차지하는 NAND 패키지 2~4개. 여기에 전원 관리 IC(PMIC)와, 기업용 제품이라면 정전 시 버퍼를 NAND에 쏟아낼 시간을 벌어 주는 커패시터 뱅크(PLP, Power Loss Protection)가 더해진다.
컨트롤러가 하는 일은 크게 네 갈래다. ① 호스트 인터페이스: PCIe 링크를 통해 NVMe 명령을 받고 데이터를 DMA로 주고받는다. ② FTL: 호스트가 주는 논리 주소(LBA)를 NAND의 물리 위치로 번역하고, 가비지 컬렉션과 웨어 레벨링을 돌린다. ③ 데이터 무결성: 11장에서 다룰 LDPC 부호로 비트 오류를 정정하고, 읽기 재시도(read retry)와 리프레시로 데이터 보존을 관리한다. ④ NAND 구동: 여러 채널로 수십 개의 다이에 명령을 뿌리고 그 타이밍을 스케줄링한다.
| 구성 요소 | 역할 | 대표 수치 (2024~2026 소비자·데이터센터 제품) |
|---|---|---|
| 컨트롤러 | FTL, ECC, 호스트/NAND 인터페이스 | Arm Cortex-R 계열 3~8코어, 8~16채널, 5~12 nm 공정 |
| NAND 다이 | 데이터 저장 | TLC 1 Tb(128 GB)/다이, 16 KB 페이지, 4~6 플레인, I/O 2.4~3.6 GT/s |
| DRAM | 매핑 테이블 캐시 | 용량의 약 1/1000 (1 TB → 1 GB), LPDDR4X/DDR4 |
| HMB | DRAM-less 제품의 대안 | 호스트 DRAM 수십 MB 차용 (NVMe 1.2 기능) |
| 호스트 링크 | PCIe + NVMe | Gen4 ×4 ≈ 7 GB/s, Gen5 ×4 ≈ 14 GB/s |
| PLP | 정전 시 휘발 버퍼 보호 | 탄탈/폴리머 커패시터 수십 ms 유지 (주로 기업용) |
저가형 SSD는 원가와 전력을 줄이려 DRAM을 뺀다. 대신 NVMe의 HMB(Host Memory Buffer) 기능으로 호스트 PC의 메인 메모리 일부(보통 수십 MB)를 PCIe 너머로 빌려 매핑 테이블의 '자주 쓰는 부분'만 캐싱한다. 1 TB 전체 테이블(~1 GB)은 못 담지만, 실제 워크로드는 지역성(1장)이 있어 좁은 LBA 범위에 몰리므로 일상 사용에서는 차이가 작다. 넓은 범위에 랜덤 접근이 퍼지면 매핑 미스가 나서 NAND에서 매핑 정보를 먼저 읽어야 하므로 지연이 늘어난다.
병렬성: 채널 · 웨이 · 다이 · 플레인
NAND 다이 하나는 결코 빠르지 않다. TLC 다이가 한 번 프로그램하는 데 수백 µs가 걸리고, 읽기(\(t_R\))도 수십 µs다. 다이 하나의 순차 쓰기 속도는 기껏해야 수백 MB/s. 7 GB/s짜리 SSD는 이런 느린 다이 수십 개를 동시에 돌려서 만든다. 병렬성은 계층적으로 조직된다.
핵심은 느린 셀 동작(\(t_{PROG}, t_R\))과 빠른 데이터 전송을 겹치는 것이다. 다이 0이 데이터를 받아 수백 µs 동안 프로그램하는 동안, 채널 버스는 비어 있으니 다이 1, 2, 3에 데이터를 차례로 보낸다. 이것이 웨이 인터리빙(way interleaving)이다. 여러 채널은 서로 완전히 독립이므로 채널 수만큼 곱절로 늘어난다. 다이 하나의 쓰기 처리량과 채널 하나의 처리량은 다음과 같다.
예를 들어 4플레인 TLC 다이(\(t_{PROG}\) = 500 µs)는 한 사이클에 192 KB를 쓰고 전송에 80 µs가 걸리므로 다이당 약 330 MB/s다. 1 Tb 다이 8개로 만든 1 TB SSD는 SLC 캐시(7절)를 쓰지 않으면 약 2.6 GB/s가 한계다. 같은 컨트롤러라도 4 TB 제품(다이 32개)이 더 빠른 이유가 여기 있다. 읽기는 \(t_R\)이 짧아 오히려 채널 버스가 병목이 되기 쉽다.
채널 × 웨이 × 플레인 병렬성과 타임라인
컨트롤러는 병렬성을 쉽게 쓰려고 모든 다이·플레인에서 같은 번호의 블록을 하나씩 묶어 슈퍼블록(superblock)이라는 논리 단위로 관리한다. 호스트 데이터는 슈퍼블록 안의 페이지들에 라운드로빈으로 흩뿌려져(striping) 모든 다이가 동시에 일한다. 대신 GC와 소거도 슈퍼블록 단위로 일어나므로, FTL이 보는 '블록'은 수백 MB~GB에 이를 수 있다. 슈퍼블록 안에 RAID-5 같은 다이 간 패리티(흔히 RAIN, XOR 패리티라 부른다)를 두어 다이 하나가 통째로 고장 나도 데이터를 복구한다.
플래시의 세 가지 제약
8장에서 NAND 셀은 플로팅 게이트(또는 차지 트랩)에 전자를 넣어 문턱 전압 \(V_t\)를 올리는 방식으로 프로그램한다고 했다. 이 물리가 SSD 설계의 모든 제약을 만든다.
- 덮어쓰기 불가(erase-before-write): 프로그램은 전자를 넣는 방향(\(V_t\) 상승, 비트 1→0)으로만 할 수 있다. 전자를 빼려면 기판 쪽에 고전압(~20 V)을 걸어 FN 터널링으로 한꺼번에 빼내는 소거가 필요하다. 이미 쓴 페이지는 소거 전까지 다시 쓸 수 없다.
- 단위 불일치: 쓰기·읽기 단위는 페이지(16 KB)인데 소거 단위는 수백~수천 페이지를 묶은 블록(수 MB~수십 MB)이다. 소거용 고전압이 웰(well) 전체에 걸리기 때문이다. 게다가 블록 안의 페이지는 워드라인 순서대로만 써야 한다(셀 간 간섭 보상 때문).
- 제한된 수명: 프로그램·소거(P/E) 사이클마다 터널 산화막에 결함이 쌓여 전자를 잃기 쉬워지고 \(V_t\) 분포가 넓어진다. TLC는 대략 1,000~3,000회, QLC는 수백~1,500회 정도에서 오류율이 ECC 한계에 다가간다(11장).
만약 FTL 없이 LBA를 물리 위치에 고정한다면(블록 매핑의 극단), 4 KB 하나를 고칠 때마다 그 블록 전체(예: 24 MB)를 읽어 DRAM에 담고, 블록을 지우고, 수정된 전체를 다시 써야 한다. 4 KB 쓰기에 24 MB를 쓰는 셈이니 쓰기 증폭이 6,000배, 속도는 소거 시간 수 ms에 묶이고 자주 쓰는 블록은 금세 닳는다. FTL은 이 세 문제를 한꺼번에 푸는 소프트웨어 층이다.
FTL: 논리 주소를 물리 위치로
FTL(Flash Translation Layer)의 기본 아이디어는 간단하다. "고칠 데이터는 제자리에 쓰지 말고 빈 페이지에 새로 쓴 뒤, 주소록만 고친다." 이를 out-of-place 업데이트라 한다. 호스트가 보는 논리 블록 주소(LBA, 또는 FTL 단위로 묶은 LPN)마다 현재 데이터가 있는 물리 페이지 번호(PPN)를 적어 둔 표가 L2P 매핑 테이블이다.
이 방식 덕분에 모든 쓰기는 "빈 페이지에 순서대로 쓰기"가 되어 빠르고, 소거는 쓰기 경로에서 빠진다. 대가는 두 가지다. 첫째, 무효 페이지가 계속 쌓여 언젠가 치워야 한다(다음 절의 가비지 컬렉션). 둘째, 모든 LPN의 위치를 담은 큰 테이블을 빠른 메모리에 둬야 한다.
그래서 30 TB급 데이터센터 SSD는 DRAM이 30 GB 이상 필요해진다. 2023~2026년 QLC 기반 60~245 TB급 제품이 나오면서 매핑 단위를 16 KB 이상으로 키워 DRAM을 1/4 이하로 줄이는 설계(Indirection Unit, IU 확대)가 널리 쓰이기 시작했다. 대신 4 KB 랜덤 쓰기가 들어오면 16 KB 단위를 읽고-고치고-다시 써야(read-modify-write) 하므로 쓰기 증폭이 커진다.
매핑 테이블 DRAM 요구량 계산기
초기(2000년대) USB 메모리와 SD 카드는 DRAM이 없어 블록 단위로만 매핑했다(블록 매핑: 테이블이 수백 분의 1로 작아지지만 랜덤 쓰기가 끔찍하게 느리다). 그 사이에 로그 블록 몇 개만 페이지 매핑하는 하이브리드 FTL(BAST, FAST 등)이 연구되었다. 오늘날 SSD는 거의 모두 페이지 매핑이며, DRAM이 부족하면 테이블 전체를 NAND에 두고 일부만 캐싱하는 DFTL(Demand-based FTL) 방식을 쓴다. HMB SSD가 바로 이 구조다.
가비지 컬렉션과 쓰기 증폭
Out-of-place 업데이트를 계속하면 빈 블록은 줄고 무효 페이지만 늘어난다. 빈 블록이 일정 수 아래로 떨어지면 FTL은 가비지 컬렉션(GC, Garbage Collection)을 시작한다. ① 희생 블록(victim)을 고르고, ② 그 안의 유효 페이지를 다른 빈 페이지로 복사하고(매핑 테이블도 갱신), ③ 희생 블록을 소거해 빈 블록 목록에 되돌린다.
GC가 하는 복사는 호스트가 요청하지 않은 추가 쓰기다. 그래서 SSD가 실제 NAND에 쓴 양은 호스트가 쓴 양보다 크다. 이 비율을 쓰기 증폭 계수(WAF, Write Amplification Factor)라 한다. 정상 상태에서 희생 블록의 평균 유효 비율이 \(u\)라면, 블록 하나를 치울 때마다 \(uP\)번 복사하고 \((1-u)P\)만큼의 새 공간을 얻으므로
그렇다면 희생 블록의 \(u\)를 낮추려면? 전체 물리 공간 중 호스트가 쓸 수 있는 부분을 줄여 여유 공간을 늘리면 된다. 이것이 오버 프로비저닝(OP, Over-Provisioning)이다. 512 GB 제품에 512 GiB(≈550 GB)의 NAND를 넣으면 약 7%가 호스트에 보이지 않는 여유 공간이 된다. 데이터센터용 '혼합 사용' 제품은 3.84 TB 대신 3.2 TB로 팔아 OP를 28% 안팎으로 키운다.
희생 블록 선택 정책도 WAF를 좌우한다. Greedy는 유효 페이지가 가장 적은 블록을 고른다 — 당장 복사량이 최소다. Cost-Benefit은 로그 구조 파일 시스템(LFS, Rosenblum & Ousterhout 1992)에서 온 정책으로, 얻는 공간 \((1-u)\)과 데이터의 나이(age, 마지막으로 수정된 뒤 흐른 시간)를 함께 본다.
FTL · 가비지 컬렉션 시뮬레이터
공장에서 갓 나온(FOB, Fresh-Out-of-Box) SSD는 모든 블록이 비어 있어 GC가 없다. 랜덤 쓰기를 계속 퍼부으면 몇 분~몇 시간 뒤 GC가 시작되며 성능이 1/3~1/10로 떨어지고 요동친 뒤 정상 상태(steady state)에 안착한다. SNIA의 SSD 성능 시험 규격(PTS)이 드라이브를 두 번 가득 채우는 프리컨디셔닝을 요구하는 이유다. 데이터센터 SSD 스펙의 '4K 랜덤 쓰기 IOPS'는 정상 상태 값이다.
웨어 레벨링과 내구성: TBW · DWPD
P/E 수명이 3,000회라도, 특정 블록만 계속 소거되면 그 블록이 먼저 죽는다. 웨어 레벨링(Wear Leveling)은 모든 블록이 비슷한 속도로 닳도록 하는 기법이다.
- 동적 웨어 레벨링: 새로 쓸 빈 블록을 고를 때 소거 횟수가 가장 적은 블록을 준다. 자주 바뀌는(핫) 데이터가 들어가는 블록들 사이에서는 고르게 닳는다. 하지만 한 번 쓰고 안 바뀌는 콜드 데이터(OS 파일, 사진 등)가 앉은 블록은 영영 소거되지 않아 '젊은' 채로 남는다.
- 정적 웨어 레벨링: 소거 횟수 차이가 문턱을 넘으면, 콜드 데이터가 있는 젊은 블록을 강제로 비워(콜드 데이터를 많이 닳은 블록으로 옮김) 젊은 블록을 핫 데이터 풀에 투입한다. 추가 복사가 생기므로 WAF를 약간 희생한다.
완벽한 웨어 레벨링을 가정하면, SSD 전체가 견딜 수 있는 호스트 쓰기 총량은 NAND 전체 용량 × P/E 수명을 WAF로 나눈 값이다. 제조사가 보증하는 TBW(Terabytes Written)와, 보증 기간 동안 매일 용량의 몇 배를 쓸 수 있는지 나타내는 DWPD(Drive Writes Per Day)는 다음과 같이 연결된다.
| 제품 등급 (예) | 용량 | 정격 | DWPD (5년) | 비고 |
|---|---|---|---|---|
| 소비자 TLC (PCIe 4.0 플래그십) | 1 TB | 600 TBW | ≈ 0.33 | 일반 PC 사용(하루 20~50 GB)으로 수십 년 |
| 소비자 QLC | 2 TB | ~ 400–700 TBW | ≈ 0.1–0.2 | 읽기 위주 대용량 |
| 데이터센터 읽기 집중형 (TLC) | 3.84 TB | 1 DWPD | 1 | ≈ 7 PBW, OP ~7% |
| 데이터센터 혼합 사용 (TLC) | 3.2 TB | 3 DWPD | 3 | 같은 NAND, OP ~28% → WAF↓ |
| 데이터센터 대용량 QLC (2024~) | 30~245 TB | ~0.3–0.6 DWPD | 0.3–0.6 | 순차 쓰기 위주, 16 KB+ IU |
내구성 계산기: TBW · DWPD · 수명
블록이 닳으면 프로그램/소거가 실패하거나 ECC로 못 고치는 오류가 나는데, 컨트롤러는 그 블록을 배드 블록으로 표시하고 예비 블록으로 대체한다. 예비 블록(OP의 일부)이 바닥나면 SSD는 데이터 손실을 막기 위해 읽기 전용 모드로 들어간다. NVMe의 SMART 로그에 있는 'Percentage Used'와 'Available Spare' 항목으로 이 상태를 미리 볼 수 있다. 실제로는 정격 TBW를 몇 배 넘겨도 동작하는 경우가 많지만, 보존 기간(전원 없이 데이터를 유지하는 시간)이 짧아진다(11장).
SLC 캐시와 TRIM
TLC 셀에 3비트를 쓰려면 8개 \(V_t\) 레벨을 정밀하게 맞추느라 여러 번의 프로그램-검증 펄스가 필요하다(8장의 ISPP). 반면 같은 셀을 1비트(SLC 모드)로 쓰면 두 레벨만 가르면 되므로 수 배 빠르다. 거의 모든 소비자용 SSD는 이 점을 이용해 빈 공간 일부를 SLC 캐시(SLC write buffer)로 쓴다. 호스트 쓰기를 일단 SLC 모드로 빠르게 받고, 유휴 시간에 3개 SLC 블록의 데이터를 1개 TLC 블록으로 옮겨 담는다(폴딩, folding).
캐시 크기는 제품마다 다르다. 몇 GB 크기로 고정된 정적 SLC 캐시와, 빈 공간에 비례해 수십~수백 GB까지 늘어나는 동적 SLC 캐시를 섞어 쓰는 경우가 많다. 동적 캐시는 드라이브가 찰수록 작아지므로, 80~90% 찬 SSD에 큰 파일을 복사하면 절벽이 훨씬 일찍 온다. QLC SSD는 캐시 밖 쓰기 속도가 HDD 수준(수백 MB/s 이하)까지 떨어지기도 한다.
SLC 캐시와 쓰기 속도 절벽
TRIM: 지운 파일을 SSD에 알려 주기
파일 시스템이 파일을 지워도, 전통적으로는 메타데이터만 고치고 데이터 블록은 그대로 둔다. HDD는 상관없지만 SSD 입장에서는 그 LBA들이 여전히 유효 데이터로 보이므로, GC 때 쓸데없이 복사된다. TRIM(ATA) 또는 NVMe의 Deallocate(Dataset Management 명령)는 "이 LBA 범위는 더 이상 안 쓴다"고 SSD에 알려 주는 명령이다. FTL은 해당 매핑을 지우고 그 물리 페이지를 무효로 표시한다. 효과는 유효 데이터가 줄어드는 것 — 즉 실질 오버 프로비저닝이 늘어나 WAF가 낮아지는 것이다. 앞의 GC 시뮬레이터에서 TRIM 25% 버튼으로 확인할 수 있다. 리눅스의 fstrim, 윈도우의 '드라이브 최적화'가 주기적으로 TRIM을 보낸다.
파티션에 할당하지 않은 공간이나 TRIM된 빈 공간은 FTL 입장에서 추가 OP다. 소비자용 SSD라도 10~20%를 비워 두면 동적 SLC 캐시가 넉넉하게 유지되고 GC 효율이 좋아져 성능과 수명이 모두 개선된다. 데이터센터에서 3.84 TB 드라이브를 3.2 TB로 파티션해(또는 NVMe namespace를 작게 만들어) 혼합 사용 등급처럼 쓰는 것도 같은 원리다.
NVMe와 PCIe: 병렬성을 위한 인터페이스
SATA SSD는 HDD용으로 설계된 AHCI 프로토콜을 썼다. AHCI는 명령 큐가 1개, 깊이 32이고, 명령 하나를 내는 데 여러 번의 레지스터 접근(비캐시 MMIO 읽기)과 락이 필요했다. 회전 원판의 지연이 수 ms이던 시절엔 문제가 없었지만, 수십 µs에 응답하고 수십 개 다이가 동시에 일하는 SSD에는 병목이었다. NVMe(Non-Volatile Memory Express, 2011년 1.0)는 처음부터 플래시와 멀티코어 CPU를 위해 설계되었다.
코어마다 전용 큐 쌍이 있으니 코어끼리 락을 잡을 필요가 없고, 큐 깊이가 깊어 수십~수백 개의 명령을 동시에 SSD 안으로 밀어 넣을 수 있다. 이 동시 명령들이 2절의 다이 병렬성을 채운다. 큐 깊이(QD), IOPS, 지연 사이의 관계는 대기행렬 이론의 리틀의 법칙(Little's law)이 정확히 말해 준다.
| PCIe 세대 | 전송률/레인 | 인코딩 | ×4 단방향 대역폭 | 대표 SSD 순차 읽기 | SSD 보급 시기 |
|---|---|---|---|---|---|
| Gen3 | 8 GT/s | 128b/130b NRZ | ≈ 3.9 GB/s | ~3.5 GB/s | 2015~ |
| Gen4 | 16 GT/s | 128b/130b NRZ | ≈ 7.9 GB/s | ~7.0–7.4 GB/s | 2019~ |
| Gen5 | 32 GT/s | 128b/130b NRZ | ≈ 15.8 GB/s | ~12–14.5 GB/s | 2023~ |
| Gen6 | 64 GT/s | PAM4 + FLIT (FEC) | ≈ 30 GB/s | ~28 GB/s (데이터센터용) | 2026~ (데이터센터용부터) |
PCIe 6.0은 6장에서 본 PAM4 신호를 도입해 레인당 64 GT/s를 얻고, 오류율 증가를 FEC와 고정 크기 FLIT 패킷으로 감당한다. 참고로 SATA 3의 한계는 600 MB/s(실효 ~550 MB/s)다.
큐 깊이 vs IOPS · 지연 (리틀의 법칙)
ZNS와 FDP: 호스트와 FTL의 협업
지금까지 본 FTL은 호스트에게 NAND의 모든 사정을 숨기는 '블랙박스'였다. 그 대가가 쓰기 증폭, OP로 버리는 용량, 큰 DRAM, 그리고 GC가 도는 순간 튀는 꼬리 지연(tail latency)이다. 문제의 뿌리는 FTL이 데이터의 수명을 모른다는 데 있다. 곧 지워질 임시 파일과 몇 년 갈 아카이브가 같은 블록에 섞이면, 그 블록은 GC 때 반드시 유효 데이터를 복사해야 한다. 데이터를 가장 잘 아는 호스트가 배치를 거들면 이 문제가 크게 줄어든다.
ZNS는 이론상 가장 깔끔하지만 호스트 소프트웨어(파일 시스템, RocksDB 같은 KV 저장소)가 순차 쓰기 규칙을 지키도록 다시 짜야 한다. SMR 하드디스크를 위한 zoned 인터페이스와 같은 계열이라 리눅스의 F2FS, btrfs 등이 지원한다. FDP는 태그를 모르는 호스트에서도 평범한 SSD처럼 동작하는 하위 호환성 덕분에 2024년 이후 하이퍼스케일러(Meta, Google 등)가 주도해 도입이 빨라지고 있다. 두 방식 모두 핵심은 5절의 교훈 — 수명이 비슷한 데이터를 같은 블록에 모으면 희생 블록의 \(u\)가 0에 가까워지고 WAF는 1에 가까워진다 — 을 호스트의 지식으로 실현하는 것이다.
SSD 컨트롤러는 이미 여러 개의 CPU 코어를 가진 컴퓨터다. 데이터를 호스트로 옮기지 않고 SSD 안에서 필터링·압축·검색하는 컴퓨테이셔널 스토리지, 그리고 CXL 인터페이스로 SSD를 바이트 단위로 접근하는 메모리 확장 장치처럼 쓰려는 시도가 진행 중이다. 12장의 PIM(Processing-in-Memory)과 같은 문제 의식 — 데이터 이동이 계산보다 비싸다 — 에서 출발한다.
핵심 정리
- SSD는 컨트롤러(Arm 코어, LDPC ECC, 8~16 채널), 여러 NAND 다이, 매핑 테이블용 DRAM(또는 HMB)으로 구성된다. 속도는 느린 다이 수십 개를 채널·웨이·플레인으로 병렬 구동해 얻는다.
- 다이당 쓰기 처리량은 \(N_{plane} S_{prog}/(t_{xfer}+t_{PROG})\) — 수백 MB/s에 불과하므로 같은 컨트롤러라도 다이 수(용량)가 많을수록 빠르다. 읽기는 채널 버스가 병목이 되기 쉽다.
- NAND는 덮어쓸 수 없고(erase-before-write), 쓰기 단위(페이지 16 KB)와 소거 단위(블록 수 MB~수십 MB)가 다르며, P/E 수명이 유한하다(TLC 약 1k~3k회).
- FTL은 out-of-place 업데이트와 L2P 페이지 매핑으로 이를 숨긴다. 4 KB 매핑 × 4 B 항목이면 DRAM은 용량의 약 1/1000(1 TB당 1 GB). 대용량 QLC는 매핑 단위를 16 KB 이상으로 키운다.
- 가비지 컬렉션은 희생 블록의 유효 페이지를 복사한 뒤 소거한다. 정상 상태 WAF = 1/(1−u)이며, 오버 프로비저닝이 클수록 u가 낮아져 WAF가 줄어든다(균일 랜덤·greedy 근사 (1+ρ)/2ρ).
- Greedy는 당장 복사량을 최소화하고, Cost-Benefit은 데이터 나이를 고려해 핫/콜드 편중 워크로드에서 유리하다. 스트림 분리(ZNS·FDP 포함)는 수명이 비슷한 데이터를 모아 WAF를 1에 가깝게 한다.
- 동적/정적 웨어 레벨링으로 소거를 고르게 분산한다. TBW ≈ CNAND·NPE/WAF, DWPD = TBW/(C·365·Y). TRIM은 무효 데이터를 알려 실질 OP를 늘리고 WAF를 낮춘다.
- SLC 캐시는 쓰기를 1비트 모드로 빠르게 받지만 소진되면 쓰기 속도 절벽이 온다. NVMe는 코어별 다중 큐(최대 64K × 64K)로 병렬성을 끌어내며, 리틀의 법칙 IOPS = QD/지연이 성능을 지배한다.
확인 퀴즈
1. NAND 플래시에서 이미 쓴 페이지를 제자리에서 덮어쓸 수 없는 근본적인 이유는?
2. 4 TB SSD가 4 KB 페이지 매핑, 항목당 4 B를 쓴다면 L2P 테이블에 필요한 DRAM은 약 얼마인가?
3. 정상 상태에서 GC가 고르는 희생 블록의 평균 유효 페이지 비율이 25%라면 쓰기 증폭 계수(WAF)는?
4. 2 TB SSD의 NAND P/E 수명이 3,000회, WAF가 2.5일 때, 이상적 웨어 레벨링을 가정하고 OP는 무시한 5년 기준 DWPD는?
5. 4 KB 랜덤 읽기 평균 지연이 100 µs로 유지되는 구간에서 큐 깊이 32로 요청하면 IOPS는 약 얼마인가?
6. 운영체제가 삭제된 파일의 LBA에 대해 TRIM(Deallocate)을 보내면 SSD 내부에서 일어나는 가장 중요한 효과는?