NVM 익스프레스

'''NVM 익스프레스'''(NVM Express, NVMe) 또는 '''비휘발성 메모리 호스트 컨트롤러 인터페이스 사양'''(Non-Volatile Memory Host Controller Interface Specification, NVMHCI)은 PCI 익스프레스(PCIe) 버스에 부착된 비휘발성 기억 매체 접근을 위한 논리 장치 인터페이스 사양이다. "NVM"은 "비휘발성 메모리"(non-volatile memory)를 뜻하며, 보통 솔리드 스테이트 드라이브(SSD) 형태로 출시되는 플래시 메모리를 가리킨다.
설계 상, NVM 익스프레스는 현대의 SSD에서 볼 수 있는 여러 수준의 병렬화를 허용하며 이로써 호스트 하드웨어와 소프트웨어에 의해 완전히 이용될 수 있다. 그 결과, NVM 익스프레스는 입출력 부하를 줄이고 길이가 긴 다중 명령 큐, 감소된 레이턴시를 포함하여 이전 논리 장치 인터페이스에 비해 다양한 성능 개선을 이루게 된다.
NVM 익스프레스 장치는 표준 크기의 PCI 익스프레스 확장 카드와, U.2 단자(이전 이름: SFF-8639)를 통해 4 레인의 PCI 익스프레스 인터페이스를 제공하는 2.5인치 폼 팩터 장치로 존재한다. 내부적으로 마운트된 컴퓨터 확장 카드를 위한 SATA 익스프레스 스토리지 장치와 M.2 사양 또한 NVM 익스프레스를 논리 장치 인터페이스로서 지원한다.
비휘발성 메모리를 접근하는 새로운 표준에 대한 상세 내용은 인텔 개발자 포럼 2007에서 처음 등장하였고, 이 때 NVMHCI가 메모리 (플래시) 칩 사이드의 ONFI(Open NAND Flash Interface Working Group)가 포함된 제안 형태의 아키텍처 디자인의 호스트 사이드 프로토콜로 모습을 드러냈다. 인텔이 주도한 NVMHCI 워킹 그룹은 그 해에 창설되었다. NVMHCI 1.0 사양은 2008년 4월 완료되었고 인텔의 웹 사이트에 공개되었다.
NVMe에 대한 기술적인 작업은 2009년 후반에 시작되었다. NVMe 사양은 NVM 익스프레스 워크그룹에 의해 개발되었고, 90곳이 넘는 회사로 구성되었다. 인텔의 Amber Huffman는 그룹의 의장이었다. 버전 1.0의 사양은 2011년 3월 1일에 공개되었고, 버전 1.1의 사양은 2012년 10월 11일에 공개되었다. 버전 1.1에 추가된 주요 기능으로는 멀티패스 입출력 (이름공간 공유 포함)과 임의 길이 scatter-gather 입출력이다. 차기 버전은 이름공간 관리가 상당히 개선될 것이다. 기능에 초점을 두었기 때문에 NVMe 1.1은 처음에 "엔터프라이즈 NVMHCI"로 불렸다. 버전 1.0e의 기반 NVMe 사양의 업데이트는 2013년 1월에 공개되었다. 2011년 6월에 7개 회사가 주도하는 프로모터 그룹은 형성되었다.
최초로 상용화된 NVMe 칩셋은 2012년 8월 Integrated Device Technology(IDT, 89HF16P04AG3 및 89HF32P08AG)가 출시하였다. 최초의 NVMe 드라이브인 삼성의 XS1715 엔터프라이즈 드라이브는 2013년 7월에 발표되었고, 삼성에 따르면 이 드라이브는 과거 기업에 제공되었던 것 보다 6배 더 빠른 3 GB/초의 읽기 속도를 지원하였다. 2013년 11월에 출시된 LSI 샌드포스 SF3700 컨트롤러 계열도 NVMe를 지원한다.
고급 호스트 컨트롤러 인터페이스(AHCI) 인터페이스는 폭넓은 소프트웨어 호환성의 이점이 있지만, 단점으로는 PCI 익스프레스 버스를 통해 연결된 SSD와 함께 사용할 때 최적의 성능을 전달하지 않는다는 것이다. 논리 인터페이스로서 AHCI는 시스템의 호스트 버스 어댑터(HBA)의 목적이 CPU/메모리 하위 시스템을 회전하는 자기 매체 기반의 훨씬 더 느린 스토리지 하위 시스템과 연결하는 것이었던 시기에 개발되었다. 그 결과, AHCI는 회전하는 매체 보다 DRAM의 동작에 더 가까운 SSD 장치와 함께 사용할 때 특정한 비효율성이 유입되었다.
NVMe 장치 인터페이스는 밑바닥부터 다시 설계하여, PCI 익스프레스 SSD의 낮은 레이턴시와 병렬화를 이용하고 동시대 CPU, 플랫폼, 응용 프로그램의 병렬화를 보완한다.
높은 수준에서 AHCI 대비 NVMe의 기본적인 이점은 호스트 하드웨어와 소프트웨어의 병렬화를 이용할 수 있다는 것과 관련되며, 이는 명령 큐의 깊이의 차이, 인터럽트 처리의 효율성, 캐시 불가능한 레지스터 접근의 수 등의 차이에서 분명하게 볼 수 있으며, 그 결과 다양한 성능 개선을 이루었다.
아래의 표는 NVMe와 AHCI의 논리 장치 인터페이스 간 차이를 요약한 것이다.
+ AHCI와 NVMe의 비교
  
 AHCI
 NVMe
 최대 큐 깊이
 하나의 명령 큐큐 하나 당 32개의 명령 
 65535개의 큐큐 하나 당 65536개의 명령
 캐시 불가능한 레지스터 접근 수(각각 2000 사이클)
 큐에 없는 명령마다 6개큐가 있는 명령마다 9개 
 명령 당 2개
 MSI-X와 인터럽트 스티어링
 단일 인터럽트스티어링 없음 
 2048개의 MSI-X 인터럽트
 병렬화및 다중 스레드
 명령 발행을 위해동기화 락이 필요 
 락 없음
 4 KB 명령의효율성
 명령 매개변수는2개의 직렬화된 호스트 DRAM 페치 필요 
 하나의 64바이트 페치의명령 매개변수를 가져옴
파일:IO stack of the Linux kernel.svg|섬네일|오른쪽|upright=2.0|리눅스 커널의 스토리지 스택의 다양한 계층 안에 있는 NVMe 데이터 경로와 다중 내부 큐의 위치.
; 크롬 OS
: 2015년 2월 24일, NVM 익스프레스 장치의 부팅 지원이 크롬 OS에 추가되었다.
; FreeBSD
: 인텔은 FreeBSD의 head 및 stable/9 브랜치용 NVM 익스프레스 드라이버를 지원하였다. nvd(4)와 nvme(4) 드라이버가 FreeBSD 버전 10.2 이후로 GENERIC 커널 구성에 기본으로 포함되어 있다.
; 하이쿠
: NVMe의 하이쿠 지원은 예정되어 있으나 아직 완료되지 않았다.
; illumos
: illumos는 2014년 10월 15일 NVMe의 지원을 받았다.
; iOS
: 아이폰 6S, 6S 플러스의 출시와 함께 애플은 스마트폰에 PCIe를 통한 NVMe의 첫 모바일 기능을 도입하였다.
; 리눅스
: 인텔은 리눅스용 NVM 익스프레스 드라이버를 출시하였고 2012년 3월 19일 리눅스 커널 버전 3.3 출시와 함께 리눅스 커널 주류에 통합되었다.
; OpenBSD
: OpenBSD의 NVMe 지원에 필요한 개발 작업이 과거 USB 2.0, AHCI 지원을 맡았던 개발자에 의해 2014년 4월 시작되었다. NVMe의 지원은 OpenBSD 6.0 릴리스에서 활성화되었다.
; OS X
: OS X 요세미티의 10.10.3 업데이트에서 애플은 NVM 익스프레스의 지원을 도입하였다. 레티나 맥북은 논리 장치 인터페이스로서 PCIe를 통한 NVMe를 사용한다.
; 솔라리스
: 솔라리스는 오라클 솔라리스 11.2에서 NVMe의 지원을 받았다.
; VMware
: 인텔은 VMware용 NVMe 드라이버를 제공하였으며, vSphere 6.0 이상 빌드에 포함되어 있고 다양한 NVMe 장치를 지원한다.
; 윈도우
: 마이크로소프트는 윈도우 8.1과 윈도우 서버 2012 R2에 NVMe의 네이티브 지원을 추가하였다. 윈도우 7과 윈도우 서버 2008 R2의 네이티브 드라이버는 업데이트에 추가되었다.
; QEMU
: NVMe는 2013년 8월 15일 출시된 버전 1.6부터 QEMU에 의해 지원된다.
; UEFI
: UEFI용 오픈 소스 NVMe 드라이버는 소스포지를 통해 이용 가능하다.
* M.2
* PCI 익스프레스
* SATA 익스프레스
* 솔리드 스테이트 드라이브
* 유니버설 플래시 스토리지
*  
*   LFCS: Preparing Linux for nonvolatile memory devices, LWN.net, April 19, 2013, by Jonathan Corbet
*   Multipathing PCI Express Storage, Linux Foundation, March 12, 2015, by Keith Busch
분류:컴퓨터 버스
분류:컴퓨터 하드웨어 표준
분류:솔리드 스테이트 컴퓨터 저장 장치