title: NVMe Architecture
date: 2025-06-22
category: system
tags: [NVMe, SSD, PCIe, Storage, Non-Volatile Memory]
NVMe Architecture
개요
NVMe(Non-Volatile Memory Express)는 PCIe를 중심으로, 확장 시에는 RDMA나 TCP 같은 fabric transport 위에서도 사용할 수 있도록 정의된 고성능 비휘발성 스토리지 인터페이스 표준이다. 2011년에 처음 공개된 이후, SATA/AHCI가 가진 단일 큐와 레지스터 중심 경로의 병목을 줄이도록 설계되어 현대 데이터 센터와 개인용 시스템의 스토리지 성능을 크게 끌어올렸다.
NVMe는 낮은 레이턴시와 높은 병렬성을 활용하도록 설계되어, 기존 HDD 중심 인터페이스인 AHCI 대비 훨씬 많은 동시 명령을 처리할 수 있다. 특히 CPU 코어별 큐 배치, DMA 기반 데이터 이동, MSI-X 기반 완료 알림 덕분에 멀티코어 서버와 고성능 SSD에서 성능을 안정적으로 끌어내기 쉽다. 현재는 클라이언트 PC의 M.2 SSD부터 서버용 U.2, EDSFF, NVMe-oF 스토리지까지 폭넓게 사용된다.
핵심 개념
NVMe 스택 구조
NVMe 아키텍처는 크게 세 가지 레이어로 구성된다:
- Host System (CPU/GPU): NVMe 드라이버와 파일 시스템을 통해 스토리지 요청을 관리
- PCIe Bus: Gen3/4/5 x4 레인을 통해 고대역폭 저지연 연결 제공
- NVMe Controller: 명령 큐 관리, NAND Flash 인터페이스, FTL(Flash Translation Layer) 처리
명령 큐 구조
NVMe의 가장 큰 특징은 다중 명령 큐(Multi-Queue) 구조이다:
- Admin Queue: 디바이스 관리 명령 (포맷, 설정 변경 등)
- I/O Queue: 데이터 읽기/쓰기 명령 (최대 65,535개 큐 지원)
- 큐 깊이: 각 큐당 최대 65,536개 명령 동시 처리 가능
각 CPU 코어는 전용 I/O 큐를 사용하여 락 경쟁 없이 병렬로 I/O 작업을 수행할 수 있다. 이는 AHCI의 단일 큐 구조와 극명하게 대비된다.
실제 동작은 Submission Queue와 Completion Queue가 한 쌍을 이루는 queue pair를 중심으로 진행된다. 호스트는 Submission Queue에 명령을 적재하고 doorbell 레지스터를 갱신하며, 컨트롤러는 명령 처리 후 Completion Queue에 상태를 기록하고 MSI-X 인터럽트 또는 polling으로 완료를 알린다.
대용량 데이터 전송 시에는 명령 자체에 데이터를 싣는 것이 아니라 PRP(Physical Region Page) 또는 SGL(Scatter-Gather List)로 호스트 메모리 버퍼를 가리킨다. 이 덕분에 NVMe는 명령 경로를 짧게 유지하면서도 큰 I/O를 DMA로 효율적으로 처리할 수 있다.
Namespace와 컨트롤러
NVMe는 저장 장치를 하나의 namespace 또는 여러 namespace로 나누어 호스트에 노출할 수 있다. 각 namespace는 독립적인 LBA 주소 공간을 가지며, 한 컨트롤러가 여러 namespace를 관리할 수 있다.
이 구조 덕분에 호스트는 워크로드, 테넌트, 용도별로 저장 공간을 분리하기 쉽고, 멀티큐 구조와 결합하면 병렬 I/O 경로를 더 세밀하게 구성할 수 있다.
NVMe 2.0 계열에서는 command set 분리와 subsystem 개념이 더 중요해졌다. 하나의 NVMe subsystem 아래에 여러 컨트롤러와 namespace가 배치될 수 있고, namespace는 NVM command set 외에도 ZNS 같은 다른 command set과 결합될 수 있어 장치 특화 인터페이스를 유연하게 노출할 수 있다.
NVMe vs AHCI 비교
| 항목 | AHCI | NVMe |
|---|---|---|
| 명령 큐 | 1개 (깊이: 32) | 65,535개 (깊이: 64K) |
| 인터럽트 | 단일 IRQ | MSI-X (2,048 벡터) |
| 레지스터 접근 | 6~9회/명령 | 2회/명령 |
| 데이터 전송 | 반이중 | 풀 듀플렉스 |
| 동기화 | 락 필요 | 락 불필요 |
| 적용 시대 | HDD (1990s) | NVMe SSD (2011+) |
포맷 팩터
NVMe SSD는 다양한 포맷 팩터로 제공된다:
M.2 (NGFF)
- 크기: 22mm × 30~110mm (2280이 가장 흔함)
- 인터페이스: PCIe Gen3/4/5 x4
- 적용: 소비자 노트북, 데스크톱, 모바일
- 장점: 소형, 저전력, 높은 호환성
U.2 (SFF-8639)
- 크기: 2.5" 폼 팩터
- 인터페이스: PCIe Gen3/4 x4
- 적용: 엔터프라이즈 서버, 스토리지 어레이
- 장점: 핫스왑 지원, 최대 25W 전력
AIC (Add-in Card)
- 크기: HHHL/FHHL PCIe 슬롯
- 인터페이스: PCIe Gen3/4 x4/x8
- 적용: 데이터 센터, 고성능 컴퓨팅
- 장점: 높은 용량, 방열판 장착 가능
EDSFF (Enterprise and Data Center Standard Form Factor)
- 크기: E1.S, E3.S 등 표준화된 규격
- 인터페이스: PCIe Gen5
- 적용: 차세대 데이터 센터
- 장점: 확장성, 표준화된 관리
NVMe over Fabrics (NVMe-oF)
NVMe-oF는 네트워크를 통해 원격 NVMe 디바이스에 접근하는 프로토콜이다:
- FC-NVMe: Fibre Channel 기반 (데이터 센터 표준)
- NVMe/TCP: TCP/IP 기반 (비용 효율적)
- NVMe/RoCE: RDMA over Converged Ethernet (저지연)
- NVMe/IB: InfiniBand (고성능 컴퓨팅)
핵심은 로컬 PCIe NVMe의 queue pair와 명령 모델을 최대한 유지한 채 transport만 바꾸는 점이다. 따라서 애플리케이션과 상위 스토리지 소프트웨어는 로컬 NVMe와 유사한 프로그래밍 모델을 유지하면서도, 랙 단위나 패브릭 단위로 분리된 스토리지를 사용할 수 있다.
최신 기능 (NVMe 2.0+)
Zoned Namespaces (ZNS)
- NAND Flash를 존(Zone)으로 구조화
- 쓰기 증폭(Write Amplification) 감소
- SSD 수명 연장
Key-Value (KV)
- 파일 시스템 없이 키-값 직접 저장
- 스토리지 효율성 향상
Host Memory Buffer (HMB)
- DRAM-less SSD가 호스트 DRAM 활용
- 비용 절감하면서 성능 유지
비교/분석
스토리지 인터페이스 비교
| 인터페이스 | 대역폭 | 레이턴시 | 큐 깊이 | 적용 |
|---|---|---|---|---|
| SATA III | 6 Gbps | ~100μs | 32 | HDD, Entry SSD |
| SAS 3 | 12 Gbps | ~50μs | 256 | Enterprise HDD/SSD |
| NVMe Gen3 | 32 Gbps | ~10μs | 64K | Consumer/Enterprise SSD |
| NVMe Gen4 | 64 Gbps | ~5μs | 64K | High-end SSD |
| NVMe Gen5 | 128 Gbps | ~3μs | 64K | Next-gen SSD |
데이터 센터 활용 비교
| 항목 | SATA SSD | SAS SSD | NVMe SSD |
|---|---|---|---|
| IOPS | 100K | 200K | 1M+ |
| 대역폭 | 550 MB/s | 1.2 GB/s | 7 GB/s+ |
| 레이턴시 | 100μs | 50μs | 10μs |
| 큐 깊이 | 32 | 256 | 64K |
| 가격/GB | 낮음 | 중간 | 높음 |
| 적용 | 범용 | 엔터프라이즈 | 고성능 |
NVMe 세대별 비교
| 세대 | 대역폭 | PCIe 레인 | 주요 특징 |
|---|---|---|---|
| Gen3 | 32 Gbps | x4 | 최초 상용화 |
| Gen4 | 64 Gbps | x4 | 높은 대역폭 |
| Gen5 | 128 Gbps | x4 | 차세대 플랫폼 |
동작 원리
1단계: 명령 제출 (Submission)
- 호스트 드라이버: NVMe 명령을 Submission Queue에 기록
- doorbell 레지스터: 컨트롤러에 새 명령 알림
- PRP/SGL 준비: 데이터 버퍼의 물리 메모리 위치를 명령에 연결
- DMA 전송: 컨트롤러가 호스트 메모리에서 명령과 버퍼 정보를 읽음
2단계: 명령 처리 (Execution)
- 명령 파싱: NVMe 컨트롤러가 명령 해석
- LBA 변환: 논리적 주소를 NAND Flash 물리 주소로 변환 (FTL)
- 내부 병렬화 배치: 채널, 다이, 플레인 단위로 요청 분산
- 데이터 전송: NAND Flash에서 데이터 읽기/쓰기
3단계: 완료 알림 (Completion)
- Completion Queue Entry: 결과를 Completion Queue에 기록
- 인터럽트: MSI-X를 통해 호스트에 완료 알림
- 상태 확인: 호스트가 status field와 phase tag를 확인
- 큐 헤드 갱신: 호스트가 Completion Queue 소비 위치를 업데이트
데이터 흐름 예시 (Read Operation)
Host Application
↓
File System (ext4/NTFS)
↓
Block Layer (I/O Scheduler)
↓
NVMe Driver
↓
PCIe Bus (DMA Transfer)
↓
NVMe Controller
↓
FTL (LBA → PPA 변환)
↓
NAND Flash (Multi-Channel Read)
↓
Data Return to Host
읽기 경로에서는 host memory에 직접 DMA를 수행하므로 중간 복사 횟수를 줄일 수 있고, 쓰기 경로에서는 호스트가 PRP/SGL에 연결한 버퍼를 기준으로 컨트롤러가 데이터를 가져간다. 운영체제 관점에서는 blk-mq와 NVMe 드라이버가 CPU 로컬 큐를 최대한 유지해 lock contention을 줄이는 것이 중요하다.
장단점
| 장점 | 단점 |
|---|---|
| AHCI 대비 100배 이상 처리량 향상 | SATA SSD 대비 높은 가격 |
| 65,535개 I/O 큐로 극한 병렬성 | 구형 메인보드에서 호환성 문제 |
| 낮은 레이턴시 (~10μs) | 고성능 시 방열 처리 필요 |
| 풀 듀플렉스 데이터 전송 | DRAM-less 모델에서 HMB 의존 |
| MSI-X 인터럽트로 효율적 처리 | 엔터프라이즈 기능 추가 비용 |
| ZNS/KV로 차세대 스토리지 지원 | 소비자 수준에서 성능 차이 체감 어려움 |
| 모바일까지 확장 (Apple NVMe) | 소프트웨어 생태계 지속적 발전 필요 |
관련 기술
- NVM Express Specifications: 공식 사양과 최신 버전
- NVM Express FAQ: 폼 팩터, 전송 계층, 아키텍처 개요
- NVMe Base Specification 2.0: command set 분리, subsystem, queue model의 기준 문서
- PCI Express: NVMe의 주된 물리 계층
- NVM Express: 배경, AHCI 비교, NVMe-oF 개요
- NAND NVMe SSD Analysis: SSD 내부 계층과 NVMe 연결
- VFS FS PageCache BlockIO: VFS, page cache, blk-mq 경로
- FTL WearLeveling GarbageCollection: 주소 변환, GC, HMB 배경
- SSD Internal Parallelism Channel Die Plane: 채널/다이/플레인 병렬성
- ZNS OpenChannelSSD Analysis: ZNS 계열 저장 방식
핵심 정리
NVMe는 SSD를 위한 최신 스토리지 인터페이스로, AHCI 대비 큰 폭의 처리량 향상과 낮은 지연을 제공한다. 65,535개의 다중 I/O 큐와 64K 명령 깊이를 통해 극한의 병렬성을 제공하며, M.2, U.2, AIC 등 다양한 폼 팩터로 제공된다. NVMe-oF를 통해 네트워크 스토리지까지 확장 가능하며, ZNS와 KV 같은 최신 기술로 차세대 스토리지 효율성을 높이고 있다. Apple 모바일 기기부터 데이터 센터까지 폭넓게 적용되며, PCIe Gen5와 함께 더 높은 대역폭을 활용할 수 있다.