NVMe Overview
NVMe 란?
- SSD나 HDD 같은 데이터 저장 장치에서 파일을 주고 받기 위한 일종의 규약
- SATA와 PCIe 가 자동차가 움직이기 위한 도로라면 AHCI와 NVMe는 도로위에 설치된 신호등 같은 존재입니다.
- SSD가 등장하게 되면서 하나의 커맨드를 완료할 때 9번의 레지스터 접근이 필요한 AHCI로는 속도를 커버할 수 없었다. 그로 인하여, 레지스터 접근을 2번으로 줄여서 해결했습니다.
지원 기능
- 최적화된 Queuing Interface (64K commands per queue, up to 64K queues)
- Streamlined & simple 명령어 set
- MSI-X & Interrupt aggregation 지원
- 멀티코어 지원
- 최소화된 MMIO(Memory Mapped I/O) write
NVMe Queue
- NVMe 는 원형 큐를 사용합니다. PCIe 메모리 안에 어디든지 큐는 위치할 수 있습니다. 주로 host의 메모리에 위치하고 있습니다.
- 큐는 고정된 사이즈의 elements 집합으로 구성되어 있습니다.
Admin Queue for Admin Command Set
- NVMe 컨트롤러 당 최대 4K elements queues를 가짐
- I/O Queues와 컨트롤러/특징 관리를 구성할 때 사용합니다
I/O Queues for I/O Command Sets
- 최대 64K elements per queues 를 가진 NVMe 컨트롤러가 최대 64K개의 queues
- Submit/Complete I/O 명령어에 사용됩니다.
Submission Queues(SQ)
- 호스트에서 컨트롤러로 가는 메세지의 Queues
- 명령어를 submit 할 때 사용한다
- SQ ID로 구분한다
Completion Queues(CQ)
- 컨트롤러에서 호스트로 가는 메시지의 Queues
- 완료된 명령어를 보낼 때 사용됨
- CQ ID로 구분한다.
- 각각의 CQ가 MSI-X 인터럽트를 독립적으로 가질 수 있다.
NVMe 명령어
NVMe 명령어 순서
- 명령어를 SQ에 집어 넣는다.
- Doorbell을 울린다.
- 명령어를 가져온다.
- 명령어를 수행한다.
- 완료된 명령어를 CQ에 집어 넣는다.
- 인터럽트를 발생시킨다.
- 프로세스를 완료한다.
- Doorbell을 울린다.
출처
- http://dpg.danawa.com/bbs/view?boardSeq=231&listSeq=3068977&past=Y
- https://www.flashmemorysummit.com/English/Collaterals/Proceedings/2013/20130812_PreConfD_Marks.pdf
PREVIOUS우버 항공 택시의 등장과 기대