NAND NVMe SSD Analysis
NAND ํ๋์ ๋ฐ NVMe SSD ๋์ ์๋ฆฌ ์์ธ ๋ถ์
NAND Flash Memory ยท SSD Controller ยท FTL ยท NVMe Protocol ยท OS I/O Stack
๋ณธ ๋ฌธ์๋ NAND ํ๋์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฌผ๋ฆฌ์ ๋์๋ถํฐ SSD ์ปจํธ๋กค๋ฌ์ FTL, ํธ์คํธ์์ NVMe ํ๋กํ ์ฝ ํต์ , ๊ทธ๋ฆฌ๊ณ ์ด์์ฒด์ (OS)๊ฐ SSD๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ์(ํ์ผ์์คํ ยท๋ธ๋ก I/O ์คํยทTRIMยทI/O ์ค์ผ์ค๋ฌ)๊น์ง SSD์ ์ ์ฒด ๋์ ์คํ์ ๊ณ์ธต์ ์ผ๋ก ๋ถ์ํฉ๋๋ค.
์ด ํ๋ฆ์ ์ ์ ์ ํ ์ ์ฅ ํน์ฑ, ์ปจํธ๋กค๋ฌ์ ์ฃผ์ ๋ณํ, ํธ์คํธ ํ์, ์ปค๋์ ๋ธ๋ก ๊ณ์ธต์ด ํ๋์ ํ์ดํ๋ผ์ธ์ฒ๋ผ ์ด์ด์ง๋ค๋ ์ ์์ ์ค์ํฉ๋๋ค. ์ฝ๊ธฐ ์ง์ฐ, ์ฐ๊ธฐ ์ฆํญ, ๋ง๋ชจ ํ์คํ, TRIM, ์ค๋ฒํ๋ก๋น์ ๋์ ๊ฐ๊ฐ ๋ฐ๋ก ์กด์ฌํ๋ ๊ธฐ๋ฅ์ด ์๋๋ผ ์๋ก์ ๋ถ๋ด์ ์ค์ด๊ธฐ ์ํด ๋ง๋ฌผ๋ ค ๋์ํฉ๋๋ค.
1. SSD ์ ์ฒด ์ํคํ ์ฒ ๊ฐ์
SSD๋ ํฌ๊ฒ ํธ์คํธ ์ธํฐํ์ด์ค, SSD ์ปจํธ๋กค๋ฌ(SoC), ๊ทธ๋ฆฌ๊ณ NAND ํ๋์ ์ด๋ ์ด์ ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ํธ์คํธ๋ PCIe ๋ฒ์ค ์์์ NVMe ํ๋กํ ์ฝ๋ก ๋ช ๋ น์ ์ ๋ฌํ๊ณ , ์ปจํธ๋กค๋ฌ ๋ด๋ถ์ FTL์ด ๋ ผ๋ฆฌ ์ฃผ์๋ฅผ ๋ฌผ๋ฆฌ ์ฃผ์๋ก ๋ณํํ๋ฉฐ, ๋ฉํฐ ์ฑ๋์ ํตํด ์ฌ๋ฌ NAND ํจํค์ง์ ๋ณ๋ ฌ๋ก ์ ๊ทผํฉ๋๋ค.
๊ทธ๋ฆผ 1. NVMe SSD ์ ์ฒด ์ํคํ ์ฒ โ ํธ์คํธ์์ NAND ์ ๊น์ง์ ๋ฐ์ดํฐ ๊ฒฝ๋ก ๋ฐ NAND ๊ณ์ธต ๊ตฌ์กฐ
NAND ๊ณ์ธต ๊ตฌ์กฐ
NAND ํ๋์๋ Package โ Die(LUN) โ Plane โ Block โ Page โ Cell์ ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๊ฐ ๊ณ์ธต์ ๋ณ๋ ฌ์ฑ๊ณผ ๋์ ๋จ์๋ฅผ ๊ฒฐ์ ํ๋ ํต์ฌ ์์์ ๋๋ค.
2. NAND ์ ๋์ ์๋ฆฌ
NAND ์ ์ ํ๋กํ ๊ฒ์ดํธ(๋๋ charge trap) ํธ๋์ง์คํฐ๋ก, ๊ฒ์ดํธ์ ์ ์ฅ๋ ์ ํ๋์ ๋ฐ๋ผ ๋ฌธํฑ์ ์(Vth)์ด ๋ฌ๋ผ์ง๋ ์๋ฆฌ๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ์ ํ๋์ ์ฌ๋ฌ ๋จ๊ณ๋ก ๊ตฌ๋ถํ๋ฉด ํ ์ ์ ์ฌ๋ฌ ๋นํธ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.
๊ทธ๋ฆผ 2. NAND ์ ๊ตฌ์กฐ, ์ ๋น ์ ์ฅ ๋นํธ(SLC~QLC), ๊ทธ๋ฆฌ๊ณ ์ฝ๊ธฐ/์ฐ๊ธฐ/์๊ฑฐ 3๋ ๋์
์ ๋น ์ ์ฅ ๋นํธ ์ ๋น๊ต
์ ๋น ๋นํธ ์๊ฐ ๋์๋ก ๊ฐ์ ๋ฉด์ ์ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง๋ง, ์ ์ ๋ ๋ฒจ ๊ฐ ๊ฐ๊ฒฉ์ด ์ข์์ ธ ์ค๋ฅ์จ์ด ๋์์ง๊ณ P/E ์๋ช ์ด ๊ธ๊ฐํฉ๋๋ค. ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๊ฐ๋ ฅํ ECC(LDPC)์ ์ ๊ตํ FTL์ด ํ์๊ฐ ๋ฉ๋๋ค.
์ฝ๊ธฐ / ์ฐ๊ธฐ / ์๊ฑฐ์ ๋น๋์นญ์ฑ
NAND์ ๊ฐ์ฅ ์ค์ํ ํน์ฑ์ ๋์ ๋จ์์ ๋น๋์นญ์ฑ์ ๋๋ค. ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ Page ๋จ์๋ก ์ํ๋์ง๋ง, ์๊ฑฐ๋ ๊ทธ๋ณด๋ค ํจ์ฌ ํฐ Block ๋จ์๋ก๋ง ๊ฐ๋ฅํฉ๋๋ค. ๋ํ ์ด๋ฏธ ๋ฐ์ดํฐ๊ฐ ์ฐ์ธ ์ ์ ๊ณง๋ฐ๋ก ๋ฎ์ด์ธ ์ ์๊ณ (in-place update ๋ถ๊ฐ), ๋ฐ๋์ ์๊ฑฐ๋ฅผ ๋จผ์ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
์ด ๋น๋์นญ์ฑ(Page R/W vs Block Erase)๊ณผ 'erase-before-write' ์ ์ฝ์ด ๋ฐ๋ก FTL์ด๋ผ๋ ์ํํธ์จ์ด ๊ณ์ธต์ด ๋ฐ๋์ ํ์ํ ๊ทผ๋ณธ ์์ธ์ ๋๋ค.
3. FTL (Flash Translation Layer)
FTL์ NAND์ ๋ฌผ๋ฆฌ์ ์ ์ฝ์ ํธ์คํธ๋ก๋ถํฐ ์จ๊ธฐ๊ณ , ์ผ๋ฐ ๋ธ๋ก ๋๋ฐ์ด์ค์ฒ๋ผ ๋ณด์ด๊ฒ ํ๋ ํต์ฌ ํ์จ์ด ๊ณ์ธต์ ๋๋ค. ๋ค ๊ฐ์ง ํต์ฌ ๊ธฐ๋ฅ โ ๋ ผ๋ฆฌ-๋ฌผ๋ฆฌ ๋งคํ, ๊ฐ๋น์ง ์ปฌ๋ ์ , ๋ง๋ชจ ํ์คํ, ์ค๋ฒํ๋ก๋น์ ๋ โ ์ ์ํํฉ๋๋ค.
๊ทธ๋ฆผ 3. FTL์ 4๋ ํต์ฌ ๋์ โ ๋งคํ, ๊ฐ๋น์ง ์ปฌ๋ ์ , ๋ง๋ชจ ํ์คํ, ์ค๋ฒํ๋ก๋น์ ๋
โ ๋ ผ๋ฆฌ-๋ฌผ๋ฆฌ ์ฃผ์ ๋งคํ (L2P)
ํธ์คํธ๊ฐ ์ฌ์ฉํ๋ ๋ ผ๋ฆฌ ์ฃผ์(LBA)๋ฅผ NAND์ ๋ฌผ๋ฆฌ ์ฃผ์(PPA)๋ก ๋ณํํ๋ ๋งคํ ํ ์ด๋ธ์ ๊ด๋ฆฌํฉ๋๋ค. ๋ฎ์ด์ฐ๊ธฐ๊ฐ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก, ๊ฐ์ LBA์ ๋ํ ์ฐ๊ธฐ ์์ฒญ์ด ์๋ ๋งค๋ฒ ์๋ก์ด ๋น ํ์ด์ง์ ๊ธฐ๋กํ๊ณ ๋งคํ ํ ์ด๋ธ๋ง ๊ฐฑ์ ํฉ๋๋ค(out-of-place update). ์ด ๋งคํ ํ ์ด๋ธ์ ์ ๊ทผ ์๋๋ฅผ ์ํด SSD ๋ด์ฅ DRAM์ ์ ์ฅ๋ฉ๋๋ค.
DRAM-less SSD๋ Host Memory Buffer(HMB)๋ ๋ ์์ ์จ๋๋ฐ์ด์ค ์บ์๋ฅผ ํจ๊ป ์ฌ์ฉํด ๋งคํ ํ ์ด๋ธ์ ์ผ๋ถ๋ฅผ ํธ์คํธ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋ค.
โก ๊ฐ๋น์ง ์ปฌ๋ ์ (Garbage Collection)
out-of-place ์ฐ๊ธฐ๋ก ์ธํด ๋ฌดํจ(invalid) ํ์ด์ง๊ฐ ๋ธ๋ก ๊ณณ๊ณณ์ ํฉ์ด์ง๋ฉด, ์ ํจ(valid) ํ์ด์ง๋ง ์ ๋ธ๋ก์ผ๋ก ๋ชจ์ ์ฎ๊ธด ๋ค ์๋ ๋ธ๋ก์ ํต์งธ๋ก ์๊ฑฐํด ๋น ๊ณต๊ฐ์ ํ์ํฉ๋๋ค. ์ด ๊ณผ์ ์์ ํธ์คํธ๊ฐ ์์ฒญํ์ง ์์ ์ถ๊ฐ ์ฐ๊ธฐ๊ฐ ๋ฐ์ํ๋ฉฐ, ์ด๋ฅผ Write Amplification(WAF)์ด๋ผ ํฉ๋๋ค. WAF๊ฐ ๋์์๋ก ์๋ช ๊ณผ ์ฑ๋ฅ์ด ์ ํ๋ฉ๋๋ค.
โข ๋ง๋ชจ ํ์คํ (Wear Leveling)
NAND ๋ธ๋ก์ P/E Cycle ํ๊ณ๊ฐ ์์ด, ํน์ ๋ธ๋ก์๋ง ์ฐ๊ธฐ๊ฐ ์ง์ค๋๋ฉด ๊ทธ ๋ธ๋ก์ด ๋จผ์ ์๋ช ์ ๋คํด ์ ์ฒด SSD๋ฅผ ๋ชป ์ฐ๊ฒ ๋ฉ๋๋ค. ๋ง๋ชจ ํ์คํ๋ ๋ชจ๋ ๋ธ๋ก์ P/E ํ์๋ฅผ ๊ท ๋ฑํ๊ฒ ๋ถ์ฐ์์ผ ์ ์ฒด ์๋ช ์ ๊ทน๋ํํฉ๋๋ค.
โฃ ์ค๋ฒํ๋ก๋น์ ๋ (Over-Provisioning)
์ฌ์ฉ์์๊ฒ ๋ ธ์ถ๋์ง ์๋ ์๋น ์์ญ(ํต์ 7~28%)์ ๋์ด, ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ํญ์ ์ถฉ๋ถํ ๋น ๋ธ๋ก์ ํ๋ณดํ ์ ์๊ฒ ํฉ๋๋ค. OP๊ฐ ํด์๋ก WAF๊ฐ ๋ฎ์์ง๊ณ ์ฑ๋ฅ๊ณผ ์๋ช ์ด ํฅ์๋ฉ๋๋ค.
4. ECC (์ค๋ฅ ์ ์ )
๋ฏธ์ธ ๊ณต์ ๊ณผ ๋ค๋นํธ ์ (QLC)๋ก ์ธํด NAND์ ์์ ๋นํธ ์ค๋ฅ์จ(RBER)์ ๋งค์ฐ ๋์ต๋๋ค. SSD ์ปจํธ๋กค๋ฌ๋ ๊ฐ๋ ฅํ ECC ์์ง์ผ๋ก ์ด๋ฅผ ์ ์ ํฉ๋๋ค.
LDPC๋ ์ ์ ์ ์์ ์ฌ๋ฌ ๋ฒ ์ ๋ฐ ์ธก์ (soft read)ํด ํ๋ฅ ๊ธฐ๋ฐ์ผ๋ก ๋์ฝ๋ฉํ๋ฏ๋ก, ์ ์ด ๋ง๋ชจ๋์ด ์ค๋ฅ๊ฐ ๋์ด๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต๊ตฌํ ์ ์์ด QLC ๊ฐ์ ๊ณ ๋ฐ๋ NAND์ ์ ๋ขฐ์ฑ์ ๋ท๋ฐ์นจํฉ๋๋ค.
5. NVMe ํ๋กํ ์ฝ
NVMe(Non-Volatile Memory Express)๋ PCIe ์์์ ๋์ํ๋๋ก ์ฒ์๋ถํฐ ํ๋์์ ์ต์ ํ๋ ํ๋กํ ์ฝ์ ๋๋ค. ๊ธฐ์กด SATA/AHCI๊ฐ ํ์ ๋์คํฌ ์๋์ ์ค๊ณ๋์ด ๋จ์ผ ํยท32 ๋ช ๋ น์ ๊ทธ์ณค๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, NVMe๋ ๋๊ท๋ชจ ๋ณ๋ ฌ ํ ๊ตฌ์กฐ๋ก SSD์ ์ ์ฌ๋ ฅ์ ๋์ด๋ ๋๋ค.
๊ทธ๋ฆผ 4. NVMe ํ ๊ธฐ๋ฐ I/O ์ฒ๋ฆฌ ํ๋ฆ (SQ/CQ Doorbell ๋ฉ์ปค๋์ฆ)
ํ ๊ธฐ๋ฐ I/O ์ฒ๋ฆฌ ํ๋ฆ
-
โ ํธ์คํธ๊ฐ Submission Queue(SQ)์ I/O ๋ช ๋ น(Read/Write)์ ๋ฑ๋กํ๋ค.
-
โก Doorbell ๋ ์ง์คํฐ์ ์จ์ SSD ์ปจํธ๋กค๋ฌ์ ์ ๋ช ๋ น์ ์๋ฆฐ๋ค.
-
โข ์ปจํธ๋กค๋ฌ๊ฐ SQ์์ ๋ช ๋ น์ ํ์น(fetch)ํด ์ฒ๋ฆฌํ๋ค.
-
โฃ ์ฒ๋ฆฌ ์๋ฃ ํ Completion Queue(CQ)์ ์ํ๋ฅผ ๊ธฐ๋กํ๊ณ MSI-X ์ธํฐ๋ฝํธ๋ก ํธ์คํธ์ ํต์งํ๋ค.
NVMe vs SATA/AHCI ๋น๊ต
| ํญ๋ชฉ | SATA / AHCI | NVMe |
|---|---|---|
| ์ธํฐํ์ด์ค | SATA 6 Gbps | PCIe ๊ธฐ๋ฐ |
| ํ ๊ตฌ์กฐ | 1๊ฐ ํ, ๋ช ๋ น 32๊ฐ | ๋ค์ค ํ, ํ๋น ์ต๋ 65,535๊ฐ ๋ช ๋ น |
| ๋ณ๋ ฌ์ฑ | ๋จ์ผ ๋ฝ/๋จ์ผ ๊ฒฝ๋ก ์ค์ฌ | CPU ์ฝ์ด์ ๋ณ๋ ฌ ์์์ ์ ์ ๋ก ์ค๊ณ |
| ํ๋กํ ์ฝ ์ค๋ฒํค๋ | ๋์ | ๋ฎ์ |
| ์ ํฉ์ฑ | HDD ์๋ ์ค๊ณ, ๋ ๊ฑฐ์ SSD | ํ๋์/NVM ์ฅ์น์ ์ต์ ํ |
์ด ์ฐจ์ด ๋๋ฌธ์ NVMe SSD์์๋ ๋ธ๋ก ๋ ์ด์ด๊ฐ ์์ฒญ์ ๊ณผํ๊ฒ ์ ๋ ฌํ๊ธฐ๋ณด๋ค ๋น ๋ฅด๊ฒ ์ ๋ฌํ๋ ํธ์ด ์ ๋ฆฌํฉ๋๋ค. Linux์์ none ๊ณ์ด์ ๊ฐ๋ฒผ์ด ์ค์ผ์ค๋ฌ๊ฐ ์์ฃผ ๊ถ์ฅ๋๋ ์ด์ ๋ ์ฌ๊ธฐ์ ์์ต๋๋ค.
6. ์ข ํฉ โ ์ฝ๊ธฐ/์ฐ๊ธฐ ์ ์ฒด ํ๋ฆ
์ฝ๊ธฐ ์์ฒญ ์ฒ๋ฆฌ
ํธ์คํธ๊ฐ NVMe SQ์ ์ฝ๊ธฐ ๋ช ๋ น ๋ฑ๋ก โ ์ปจํธ๋กค๋ฌ ํ์น โ FTL์ด LBA๋ฅผ PPA๋ก ๋ณํ โ ํด๋น NAND ํ์ด์ง ์ฝ๊ธฐ โ ECC ์ ์ โ DRAM ๋ฒํผ ๊ฒฝ์ โ PCIe๋ก ํธ์คํธ์ ์ ์ก โ CQ์ ์๋ฃ ๊ธฐ๋ก.
์ฐ๊ธฐ ์์ฒญ ์ฒ๋ฆฌ
ํธ์คํธ๊ฐ ์ฐ๊ธฐ ๋ช ๋ น ๋ฑ๋ก โ ์ปจํธ๋กค๋ฌ ํ์น โ ๋ฐ์ดํฐ๋ฅผ DRAM/SLC ์บ์์ ๋ฒํผ๋ง โ FTL์ด ๋น ํ์ด์ง์ ๊ธฐ๋ก(out-of-place) โ ๋งคํ ํ ์ด๋ธ ๊ฐฑ์ โ ๋น ๋ธ๋ก ๋ถ์กฑ ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ํธ๋ฆฌ๊ฑฐ โ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ง๋ชจ ํ์คํ ์ํ โ CQ์ ์๋ฃ ๊ธฐ๋ก.
7. ์ด์์ฒด์ (OS) ๊ด์ ์์ ๋ณธ SSD
์ง๊ธ๊น์ง๋ SSD ๋ด๋ถ(NANDยทFTLยทNVMe)๋ฅผ ์ดํด๋ดค์ต๋๋ค. ์ด์ OS๊ฐ SSD๋ฅผ ์ด๋ป๊ฒ ๋ฐ๋ผ๋ณด๊ณ ๋ค๋ฃจ๋์ง, ์ฆ ํ์ผ์์คํ ยท๋ธ๋ก I/O ์คํยท์บ์ยทTRIMยทI/O ์ค์ผ์ค๋ฌ์ ๊ด์ ์ ๋ถ์ํฉ๋๋ค. OS๋ SSD์ ๋ฌผ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์์ง ๋ชปํ ์ฑ LBA(๋ ผ๋ฆฌ ์นํฐ) ๋จ์๋ก๋ง ํต์ ํ๋ฉฐ, ๋ฌผ๋ฆฌ ๋งคํ์ ์ ์ ์ผ๋ก SSD ๋ด๋ถ FTL์ด ๋ด๋นํฉ๋๋ค.
7.1 ์คํ ๋ฆฌ์ง I/O ์คํ
์ ํ๋ฆฌ์ผ์ด์ ์ read()/write() ํธ์ถ์ ์ฌ๋ฌ ์ปค๋ ๊ณ์ธต์ ๊ฑฐ์ณ SSD์ ๋๋ฌํฉ๋๋ค. ๊ฐ ๊ณ์ธต์ LBA ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ, ๋ฌผ๋ฆฌ ์ฃผ์ ๋ณํ์ ํ๋์จ์ด ๊ฒฝ๊ณ ๋๋จธ SSD๊ฐ ์ฒ๋ฆฌํฉ๋๋ค.
๊ทธ๋ฆผ 5. OS ์คํ ๋ฆฌ์ง I/O ์คํ โ ์ ํ๋ฆฌ์ผ์ด์ ์์ NAND๊น์ง์ ๊ณ์ธต ๊ตฌ์กฐ
-
VFS โ ๋ค์ํ ํ์ผ์์คํ ์ ๊ณตํต ์ธํฐํ์ด์ค๋ก ์ถ์ํํ๋ค.
-
ํ์ผ์์คํ (ext4/F2FS/XFS) โ ํ์ผ์ ๋ ผ๋ฆฌ ๋ธ๋ก(LBA)์ ๋งคํํ๊ณ ์ ๋๋ง์ผ๋ก ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ค. ํนํ F2FS๋ NAND์ ์์ฐจ ์ฐ๊ธฐ ํน์ฑ์ ๋ง์ถ ๋ก๊ทธ ๊ตฌ์กฐ(log-structured) ํ์ผ์์คํ ์ด๋ค.
-
ํ์ด์ง ์บ์ โ ์ฝ๊ธฐ/์ฐ๊ธฐ๋ฅผ DRAM์ ๋ฒํผ๋งํ์ฌ ์ค์ I/O๋ฅผ ์ค์ด๊ณ , dirty page๋ฅผ ๋ชจ์ ์ง์ฐ ๊ธฐ๋ก(writeback)ํ๋ค.
-
๋ธ๋ก I/O ๋ ์ด์ด โ ์ธ์ ์์ฒญ์ ๋ณํฉยท์ ๋ ฌํ๋ฉฐ, ํ๋ ์ปค๋์ ๋ฉํฐํ(blk-mq)๋ก ๋ค์ค ์ฝ์ด ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๋ค.
7.2 I/O ์ค์ผ์ค๋ฌ โ SSD์ ๋ง๋ ์ ํ
HDD ์๋์ I/O ์ค์ผ์ค๋ฌ๋ ๋์คํฌ ํค๋ ์ด๋์ ์ค์ด๊ธฐ ์ํด ์์ฒญ์ ๋ฌผ๋ฆฌ ์์น ์์ผ๋ก ์ ๋ ฌํ์ต๋๋ค. ๊ทธ๋ฌ๋ SSD๋ ํ์ ์๊ฐ(seek time)์ด ์์ด ์ด๋ฐ ์ ๋ ฌ์ด ๋ถํ์ํ๊ฑฐ๋ ์คํ๋ ค ์ค๋ฒํค๋๊ฐ ๋ฉ๋๋ค. ๋ฐ๋ผ์ SSD์์๋ ๋จ์ํ ์ค์ผ์ค๋ฌ๊ฐ ์ ํธ๋ฉ๋๋ค.
SSD๋ ๋ด๋ถ์ ์ผ๋ก ๋ฉํฐ ์ฑ๋ ๋ณ๋ ฌ์ฑ๊ณผ ์์ฒด ํ(NVMe)๋ฅผ ๊ฐ์ง๋ฏ๋ก, OS๊ฐ ๊ณผํ๊ฒ ๊ฐ์ ํ๊ธฐ๋ณด๋ค ์์ฒญ์ ๋น ๋ฅด๊ฒ ์ ๋ฌํ๋ ํธ์ด ์ ๋ฆฌํฉ๋๋ค. ์ด๊ฒ์ด NVMe SSD์์ none ์ค์ผ์ค๋ฌ๊ฐ ๊ธฐ๋ณธ๊ฐ์ธ ์ด์ ์ ๋๋ค.
7.3 TRIM (Discard) โ OS-SSD ํ๋ ฅ์ ํต์ฌ
OS๊ฐ ํ์ผ์ ์ญ์ ํด๋ ๊ทธ ์ ๋ณด๋ SSD์ ์๋์ผ๋ก ์ ๋ฌ๋์ง ์์ต๋๋ค. ํ์ผ์์คํ ์ ๋ฉํ๋ฐ์ดํฐ๋ง ๊ฐฑ์ ํ ๋ฟ, SSD ์ ์ฅ์์๋ ํด๋น LBA๊ฐ ์ฌ์ ํ ์ ํจํ ๋ฐ์ดํฐ๋ก ๋ณด์ ๋๋ค. ์ด ์ ๋ณด ๋จ์ ์ ํด์ํ๋ ๊ฒ์ด TRIM(NVMe์์๋ Deallocate) ๋ช ๋ น์ ๋๋ค.
๊ทธ๋ฆผ 6. TRIM ์ ๋ฌด์ ๋ฐ๋ฅธ ์ฐจ์ด์ TRIM(Discard) ๋ฐํ ๊ฒฝ๋ก
TRIM์ด ์์ผ๋ฉด SSD๋ ์ญ์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ ํจํ ๊ฒ์ผ๋ก ์ค์ธํ์ฌ, ๊ฐ๋น์ง ์ปฌ๋ ์ ๋ ๋ถํ์ํ๊ฒ ๋ณต์ฌํฉ๋๋ค. ์ด๋ Write Amplification(WAF)์ ํค์ฐ๊ณ ์ฑ๋ฅ๊ณผ ์๋ช ์ ๋จ์ด๋จ๋ฆฝ๋๋ค. TRIM์ผ๋ก OS๊ฐ '์ด LBA๋ ๋ ์ด์ ์ฐ์ง ์๋๋ค'๊ณ ์๋ ค์ฃผ๋ฉด, SSD๋ ํด๋น ๋งคํ์ ๋ฌดํจํํด GC ๋์์์ ์ ์ธํ๊ณ ๋น ๋ธ๋ก์ ํจ์จ์ ์ผ๋ก ํ๋ณดํฉ๋๋ค.
-
์ค์๊ฐ ๋ฐฉ์ โ mount -o discard: ์ญ์ ์ฆ์ TRIM ๋ฐํ. ์ฆ์ ๋ช ๋ น์ผ๋ก ์ค๋ฒํค๋๊ฐ ์๊ธธ ์ ์์ต๋๋ค.
-
์ฃผ๊ธฐ์ ๋ฐฉ์ โ fstrim: cron/ํ์ด๋จธ๋ก ๋ชจ์์ batch TRIM. ์ผ๋ฐ์ ์ผ๋ก ๋ ๋ฌด๋ํ๋ฉฐ, ์ฃผ 1ํ ์ ๋์ ์ฃผ๊ธฐ๊ฐ ๋ง์ด ์ฐ์ ๋๋ค.
7.4 ํ์ด์ง ์บ์์ ์ฐ๊ธฐ ์ ์ฑ
OS์ ํ์ด์ง ์บ์๋ SSD ์ ๊ทผ์ ์ค์ด๋ 1์ฐจ ์์ถฉ ์ญํ ์ ํฉ๋๋ค. ์ฝ๊ธฐ๋ ์บ์ ํํธ๋ก SSD I/O๋ฅผ ๊ฑด๋๋ฐ๊ณ , ์ฐ๊ธฐ๋ write-back ์ ์ฑ ์ผ๋ก dirty page๋ฅผ ๋ชจ์ ๋์๋ค๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก(๋๋ fsync ์) SSD์ ๊ธฐ๋กํฉ๋๋ค. ์ด ๋ฒํผ๋ง์ ์์ ์ฐ๊ธฐ๋ฅผ ๋ณํฉํด SSD์ WAF๋ฅผ ์ค์ด๋ ๋ฐ์๋ ๊ธฐ์ฌํฉ๋๋ค. ๋ค๋ง ์ ์ ์ฅ์ ์ ๋ฐ์ดํฐ ์ ์ค์ ๋ง์ผ๋ ค๋ฉด fsync/FUA(Force Unit Access)๋ก ์์์ฑ์ ๋ณด์ฅํด์ผ ํฉ๋๋ค.
7.5 OS๊ฐ SSD ํน์ฑ์ ๊ณ ๋ คํ๋ ๋ฐฉ๋ฒ ์์ฝ
| ๊ณ์ธต | ์ญํ | ๋ณ๋ ฌ์ฑ / ๋จ์ |
|---|---|---|
| Package | ์ฌ๋ฌ Die๋ฅผ ์ ์ธตํ ๋ฌผ๋ฆฌ ์นฉ | ์ฑ๋์ ์ฐ๊ฒฐ |
| Die (LUN) | ๋ ๋ฆฝ์ ์ผ๋ก ๋ช ๋ น ์ํ ๊ฐ๋ฅํ ์ต์ ๋จ์ | Die ๊ฐ ์์ ๋ณ๋ ฌ |
| Plane | Die ๋ด ๋ณ๋ ฌ ๋์ ๋จ์ (๋ณดํต 2~4๊ฐ) | Plane ๊ฐ ๋์ ๋์ |
| Block | ์๊ฑฐ(Erase)์ ์ต์ ๋จ์ (์๋ฐฑ~์์ฒ Page) | ์๊ฑฐ ๋จ์ |
| Page | ์ฝ๊ธฐ/์ฐ๊ธฐ(R/W)์ ์ต์ ๋จ์ (4~16 KB) | R/W ๋จ์ |
| Cell | 1๋นํธ ์ด์์ ์ ์ฅํ๋ ํธ๋์ง์คํฐ | SLC~QLC |
| ์ข ๋ฅ | ๋นํธ/์ | ์ ์ ๋ ๋ฒจ | P/E Cycle | ํน์ฑ |
|---|---|---|---|---|
| SLC | 1 bit | 2 | ~100,000 | ์ต๊ณ ์๋ยท์๋ช , ๊ณ ๊ฐ, ์ํฐํ๋ผ์ด์ฆ/์บ์ |
| MLC | 2 bit | 4 | ~3,000~10,000 | ์๋ยท์๋ช ยท๋น์ฉ ๊ท ํ |
| TLC | 3 bit | 8 | ~1,000~3,000 | ํ์ฌ ์๋น์ ์ฃผ๋ฅ |
| QLC | 4 bit | 16 | ~100~1,000 | ์ต๋ ์ฉ๋ยท์ต์ ๋น์ฉ, ๋ฎ์ ์๋ช |
| ๋์ | ๋จ์ | ์๋(๋๋ต) | ํน์ฑ |
|---|---|---|---|
| READ (์ฝ๊ธฐ) | Page (4~16KB) | 25~100 ยตs | ๋นํ๊ดด์ , ๊ฐ์ฅ ๋น ๋ฆ |
| PROGRAM (์ฐ๊ธฐ) | Page | 200~1,500 ยตs | ์ ํ ์ฃผ์ (FN ํฐ๋๋ง), ์๊ฑฐ ์ ํ ํ์ |
| ERASE (์๊ฑฐ) | Block | 2~10 ms | ์ ํ ๋ฐฉ์ถ, ์ ๋ง๋ชจ ๋ฐ์, ๊ฐ์ฅ ๋๋ฆผ |
| ECC ๋ฐฉ์ | ํน์ง | ์ ์ฉ |
|---|---|---|
| BCH | ๋์์ ์ ์ , ๊ตฌํ ๋จ์, ์ ์ ๋ฅ๋ ฅ ์ ํ | ๊ตฌํ SLC/MLC |
| LDPC | ์ฐํ์ (soft-decision) ๋์ฝ๋ฉ, ๋์ ์ ์ ๋ฅ๋ ฅ | ํ์ฌ TLC/QLC ์ฃผ๋ฅ |
| ํญ๋ชฉ | SATA / AHCI | NVMe |
|---|---|---|
| ์ธํฐํ์ด์ค | SATA 6 Gbps | PCIe (Gen5 x4 โ 16 GB/s) |
| ํ ๊ฐ์ | 1๊ฐ | ์ต๋ 65,535๊ฐ |
| ํ๋น ๋ช ๋ น ์ | 32 | ์ต๋ 65,535 |
| ํ๋กํ ์ฝ ์ค๋ฒํค๋ | ๋์ (HDD ์๋ ์ค๊ณ) | ๋ฎ์ (ํ๋์ ์ต์ ํ) |
| ๋ ์ดํด์ | ๋์ | ๋ฎ์ |
| ์ค์ผ์ค๋ฌ | ํน์ง | SSD ์ ํฉ์ฑ |
|---|---|---|
| none (noop) | ์ค์ผ์ค๋ง ๊ฑฐ์ ์์ด ๋ฐ๋ก ์ ๋ฌ | โ โ โ NVMe SSD ๊ธฐ๋ณธ ๊ถ์ฅ |
| mq-deadline | ์ง์ฐ์๊ฐ ์ํ ๋ณด์ฅ, ๊ฐ๋ฒผ์ด ์ ๋ ฌ | โ โ ํผํฉ ์ํฌ๋ก๋ |
| kyber | ์ง์ฐ์๊ฐ ๋ชฉํ ๊ธฐ๋ฐ ์ ์ ์ ์ด | โ โ ๊ณ ์ฑ๋ฅ NVMe |
| BFQ | ๊ณต์ ์ฑ ์ค์ฌ, ๋ฐ์คํฌํ ๋ฐ์์ฑ | โ ์ค๋ฒํค๋ ํผ |
| OS ๊ธฐ๋ฒ | ๋ชฉ์ | SSD์ ๋ฏธ์น๋ ํจ๊ณผ |
|---|---|---|
| TRIM/Discard | ์ญ์ ์ ๋ณด ์ ๋ฌ | WAFโ, GC ํจ์จโ, ์๋ช โ |
| none I/O ์ค์ผ์ค๋ฌ | ๋ถํ์ํ ์ ๋ ฌ ์ ๊ฑฐ | ๋ ์ดํด์โ, CPU ์ค๋ฒํค๋โ |
| F2FS ๋ฑ FS | ์์ฐจ ์ฐ๊ธฐ ์ ๋ | GC ๋ถ๋ดโ, ์ฑ๋ฅโ |
| ํ์ด์ง ์บ์ write-back | ์์ ์ฐ๊ธฐ ๋ณํฉ | WAFโ, I/O ํ์โ |
| ์ ๋ ฌ(alignment) | ํํฐ์ ์ ํ์ด์ง ๊ฒฝ๊ณ ์ ๋ ฌ | ์ฐ๊ธฐ ๋ถํ ๋ฐฉ์ง, WAFโ |
8. ์ฅ๋จ์
์ฅ์
-
NVMe์ blk-mq์ ์กฐํฉ์ผ๋ก ๋ค์ค ์ฝ์ด ๋ณ๋ ฌ I/O๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
-
FTL๊ณผ ์ค๋ฒํ๋ก๋น์ ๋ ๋๋ถ์ ํธ์คํธ๋ NAND์ ๋ฎ์ด์ฐ๊ธฐ ๋ถ๊ฐ ์ ์ฝ์ ์ง์ ๋ณด์ง ์์๋ ๋ฉ๋๋ค.
-
TRIM๊ณผ page cache write-back์ด ์์ ์ฐ๊ธฐ๋ฅผ ๋ณํฉํด WAF์ ์ง์ฐ์ ๋ฎ์ถฅ๋๋ค.
ํ๊ณ
-
๊ฐ๋น์ง ์ปฌ๋ ์ ๊ณผ LDPC ์ฌ์๋๋ก ์ธํด tail latency๊ฐ ํ๋ค๋ฆด ์ ์์ต๋๋ค.
-
์ ๋น ๋นํธ ์๊ฐ ๋์๋ก ์๋ช ๊ณผ ์ค๋ฅ ์ฌ์ ๊ฐ ์ค์ด๋ญ๋๋ค.
-
DRAM-less SSD๋ HMB์ ์์กดํ๋ฏ๋ก ๊ณ ๋ถํ ๋๋ค I/O์์ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
-
SLC ์บ์๋ ๋ฒ์คํธ ์ฐ๊ธฐ์๋ ์ ๋ฆฌํ์ง๋ง, ์ฅ์๊ฐ ์ฐ์ ์ฐ๊ธฐ์์๋ ์์ง๋ ์ ์์ต๋๋ค.
9. ๊ด๋ จ ๊ธฐ์
-
nand_0010_nand_flash_internals.html- ์ ๊ตฌ์กฐ, Vth ๋ถํฌ, Program/Erase ๋ฌผ๋ฆฌ -
nand_0020_ftl_wearleveling_garbagecollection.html- L2P ๋งคํ, GC, Wear Leveling, OP -
nand_0015_vfs_fs_pagecache_blockio.html- VFS, page cache, blk-mq ๊ฒฝ๋ก -
nand_0025_ssd_internal_parallelism_channel_die_plane.html- ์ฑ๋, ๋ค์ด, ํ๋ ์ธ ๋ณ๋ ฌ์ฑ -
../system/system_0025_nvme_architecture.html- NVMe ํ ๊ตฌ์กฐ์ ์ธํฐํ์ด์ค -
../system/system_0020_ecc_error_correction.html- ECC/LDPC์ ๋ฐ์ดํฐ ์ ์ ๋ฐฐ๊ฒฝ -
https://docs.kernel.org/filesystems/f2fs.html- F2FS์ ๋ก๊ทธ ๊ตฌ์กฐ, background GC, discard -
https://docs.kernel.org/block/blk-mq.html- ๋ฉํฐํ ๋ธ๋ก I/O์ ์์ฒญ ๋ถ์ฐ -
https://man7.org/linux/man-pages/man8/fstrim.8.html- ์ฃผ๊ธฐ์ TRIM๊ณผ discard ์ด์
10. ํต์ฌ ์ ๋ฆฌ
NAND SSD๋ ์ ๋ฌผ๋ฆฌ, FTL, NVMe, OS ๋ธ๋ก ๊ณ์ธต์ด ์๋ก ๋ถ๋ด์ ๋๋ ๊ฐ๋ ๊ตฌ์กฐ์ ๋๋ค. NAND์ erase-before-write ์ ์ฝ์ FTL์ด ์จ๊ธฐ๊ณ , NVMe์ blk-mq๊ฐ ๋ค์ค ํ ๋ณ๋ ฌ์ฑ์ ์ ๊ณตํ๋ฉฐ, OS๋ page cache์ TRIM์ผ๋ก ๋ด๋ถ ์ฆํญ์ ์ค์ ๋๋ค. ์ฑ๋ฅ์ ๋จ์ํ ๋์ญํญ๋ณด๋ค GC, ECC, HMB, OP ๊ฐ์ ๋ณด์กฐ ๋ฉ์ปค๋์ฆ์ ๊ท ํ์ ๋ ํฌ๊ฒ ์ข์ฐ๋ฉ๋๋ค. ๊ฒฐ๊ตญ ์ข์ SSD๋ ๋น ๋ฅธ NAND๋ง์ด ์๋๋ผ, ๊ทธ NAND๋ฅผ ์ผ๋ง๋ ์์ ์ ์ผ๋ก ๊ด๋ฆฌํ๋๋์ ๋ฌ๋ ค ์์ต๋๋ค.