참고: https://www.cnblogs.com/vlhn/

Anatomy of SPDK/NVMe Storage Technology 시리즈는 잘 정리된 참고 사이트의 전개 방식을 답습하면서 한글로 정리한 내용입니다. 많은 인구 기반의 중국의 굴기, 특히 최근 IT 분야에 대해 쏟아져 나오는 자료를 보면 부러움을 떠나 두려울 따름입니다.

SPDK/NVMe 개요

1. NVMe 개요

  • NVMe는 PCIe 기반 SSD를 위한 확장 가능한 고성능 호스트 컨트롤러 인터페이스입니다.
  • NVMe의 특징은 I/O 명령을 처리하기 위한 여러 대기열을 제공한다는 것입니다. 단일 NVMe 장치는 최대 64K I/O 대기열을 지원하고 각 I/O 대기열은 최대 64K 명령을 관리할 수 있습니다.
  • 호스트가 I/O 명령을 내리면 호스트 시스템은 명령을 제출 대기열(SQ)에 넣은 다음 초인종 레지스터(DB)를 사용하여 NVMe 장치에 알립니다.
  • NVMe 장치가 I/O 명령 처리를 완료하면 장치는 처리 결과를 완료 대기열(CQ)에 쓰고 인터럽트를 트리거하여 호스트 시스템에 알립니다.
  • NVMe는 MSI/MSI-X 및 인터럽트 집계를 사용하여 인터럽트 처리 성능을 향상시킵니다.

2. SPDK 개요

Storage Performance Development Kit(SPDK)는 확장 가능한 고성능 사용자 모드 스토리지 응용 프로그램을 작성하기 위한 일련의 도구 및 라이브러리 기능을 제공합니다. SPDK가 고성능을 낼 수 있는 이유는 필요한 모든 드라이버를 사용자 공간으로 옮겨 실행하고, 인터럽트 모드 대신 폴링 모드를 사용함으로써 커널 컨텍스트 전환을 피하고 인터럽트 처리 오버헤드를 제거하기 때문입니다.

SPDK의 기반은 사용자 공간, 폴링 모드, 비동기식, 잠금 없는 NVMe 드라이버입니다. 사용자 공간 애플리케이션은 SSD 디스크에 직접 액세스할 수 있으며 무복사, 고도의 병렬 방식으로 SSD 디스크에 액세스할 수 있습니다. 드라이버는 단일 공용 헤더 파일을 포함하는 C 라이브러리로 구현됩니다. 마찬가지로 SPDK는 NVMe 드라이버의 모든 특성을 가진 많은 Intel Xeon 기반 플랫폼에 있는 I/OAT DMA 엔진용 사용자 공간 드라이버를 제공합니다.

또한 SPDK는 또한 이러한 사용자 공간 드라이버 위에 구축된 NVMe-oFiSCSI 서버를 제공하여 네트워크 디스크를 서비스할 수 있도록 합니다. 클라이언트는 표준 Linux 커널 iSCSI 및 NVMe-oF 이니시에이터(또는 Windows의 iSCSI 이니시에이터)를 사용하여 서버에 연결할 수 있습니다. 이러한 서버는 다른 구현에 비해 CPU 사용률을 훨씬 향상시킬 수 있습니다.

SPDK는 C 라이브러리와 실행 파일을 통합하는 오픈 소스 BSD 라이센스 개발 키트이며 해당 소스 코드는 GitHub에서 호스팅됩니다. 모든 새로운 개발은 마스터 브랜치에 적용되며 안정적인 버전은 분기마다 릴리스됩니다. 코드 기여자와 사용자는 메일링 리스트를 통해 패치를 제출하고, 문제를 보고하고, 질문할 수 있습니다.

3. SPDK/NVMe 드라이버 개요

NVMe 드라이버는 응용 프로그램과 NVMe SSD 간에 복사 없이 직접 데이터 전송을 제공하기 위해 응용 프로그램에 직접 연결할 수 있는 C 함수 라이브러리입니다. 이것은 완전히 수동적입니다. 스레드를 생성하지 않고 애플리케이션 자체의 함수 호출에 대한 응답으로만 작업을 수행합니다. 이 라이브러리는 PCI BAR 레지스터를 로컬 프로세스에 직접 매핑한 다음 MMIO(메모리 매핑된 I/O)를 수행하여 NVMe 장치를 직접 제어합니다. I/O는 대기열 쌍(Queue Pair)을 통해 비동기적으로 제출되며 일반적인 실행 흐름은 Linux의 libaio와 완전히 다르지 않습니다.

자세한 내용은 여기를 참조하십시오 .

4. 기타 NVMe 드라이버 구현

  • Linux 커널 NVMe 드라이버: 공식 웹사이트 www.kernel.org 또는 미러로 이동 하여 커널 소스 코드를 다운로드한 다음 include/linux/nvme.h, drivers/nvme를 참고하십시오.
  • NVMeDirect : Computer Systems Laboratory@SKKU에서 시작한 오픈 소스 프로젝트로 SPDK/NVMe 드라이버와 유사하지만 Linux 커널 NVMe 드라이버를 기반으로 하고 있습니다. NVMeDirect는 거인의 어깨 위에 서 있는 사용자 모드 I/O 프레임워크라고 할 수 있습니다.