NVM Express

07.02.2021

NVM Express (NVMe, NVMHCI — от англ. Non-Volatile Memory Host Controller Interface Specification) — спецификация на протоколы доступа к твердотельным накопителям (SSD), подключённым по шине PCI Express. «NVM» в названии спецификации обозначает энергонезависимую память, в качестве которой в SSD повсеместно используется флеш-память типа NAND. Логический интерфейс NVM Express был разработан с нуля, основные цели — получение низких задержек и эффективное использование высокого параллелизма твердотельных накопителей за счёт применения нового набора команд и механизма обработки очередей, оптимизированного для работы с современными многоядерными процессорами.

Накопители, использующие NVM Express, могут представлять собой платы расширения PCI Express либо накопители форм-фактора 2.5″, использующие для подключения две или четыре линии PCI Express через разъём U.2 (SFF-8639). Накопители SATA Express и компактные внутренние накопители форм-фактора M.2 (NGFF) при использовании PCIe также поддерживают NVM Express в качестве одного из логических интерфейсов.

Предпосылки появления

Ранние твердотельные накопители использовали для подключения параллельный SCSI и использовались в серверах и высокопроизводительных рабочих станциях. Проникновение SSD на массовый рынок пришлось на середину 2000-х и совпало по времени с вытеснением параллельного SCSI интерфейсами SATA и SAS. Со временем дальнейшему наращиванию производительности SSD стали мешать ограничения интерфейсов SATA и SAS, ориентированных в первую очередь на подключение традиционных механических жёстких дисков. Например, в отличие от жёстких дисков, скорость последовательного чтения для большинства современных SSD ограничивается пропускной способностью интерфейса SATA.

Высокопроизводительные SSD с подключением к шине PCI Express производились до NVMe, но либо использовали уникальные закрытые стандарты и технологии оптимизации работы с флеш-памятью, либо представляли собой SATA- или SAS-контроллер и несколько SSD с интерфейсами SATA/SAS, размещёнными на одной плате. Переход на NVMe позволяет стандартизировать интерфейс PCIe SSD — производителям больше не нужно тратить ресурсы на разработку уникальных драйверов, разъёмов и форм-факторов. Подобным образом принятие спецификаций USB mass storage позволило создать большое разнообразие USB-флеш-накопителей, которые смогли работать с любыми компьютерами, не требуя оригинальных драйверов для каждой модели.

Для эффективного использования накопителей NVMe в сетях хранения данных разрабатываются различные стандарты передачи команд NVMe через RDMA (поверх InfiniBand или Ethernet — RoCE и iWARP) и Fibre Channel без трансляции в SCSI под общим названием NVMe over Fabrics.

История

Работа над спецификацией

Первые подробности о новом стандарте доступа к энергонезависимой памяти появились на Intel Developer Forum в 2007 году, где был представлен NVMHCI (Non-Volatile Memory Host Controller Interface) — предполагаемый вариант нового интерфейса коммуникации между хостом и контроллером NAND. В том же году была сформирована рабочая группа для проработки NVMHCI во главе с Intel. Первая спецификация NVMHCI 1.0 была закончена в апреле 2008 года и размещена на сайте Intel.

Техническая проработка NVMe началась во второй половине 2009 года. Спецификации NVMe были разработаны рабочей группой «NVM Express Workgroup», в которую входило более 90 компаний, председателем группы была Эмбер Хаффмен из Intel. Первая версия спецификации NVMe была представлена 1 марта 2011 года. При работе над версией 1.1, появившейся 11 октября 2012 года, разработчики сфокусировались на добавлении функциональных возможностей для устройств корпоративного класса. В новом стандарте были добавлены многопутевой ввод-вывод с разделяемым доступом к пространствам имён NVMe и поддержка векторного ввода-вывода (англ. arbitrary-length scatter-gather I/O).

В дальнейшем работа над новыми версиями спецификации NVMe была продолжена:

  • NVMe 1.1b — 2 июля 2014 года;
  • NVMe 1.2 — 3 ноября 2014 года; для устройств потребительского класса: расширенное управление питанием и поддержка накопителей без динамической памяти; для устройств корпоративного класса: возможность обновления прошивки без остановки работы накопителя, снижение задержек в топологиях с большим количеством NVMe-накопителей и коммутаторами PCIe.
  • NVMe 1.2a — 23 ноября 2015 года.
  • NVMe 1.3c — 24 мая 2018 года.

Первые контроллеры и готовые накопители

Первые контроллеры SSD с поддержкой NVMe и эталонный дизайн флеш-накопителей в форм-факторе полнопрофильной платы PCIe были выпущены компанией Integrated Device Technology в августе 2012 года.

Первый серверный NVMe-накопитель Samsung XS1715 в форм-факторе U.2 (2.5", разъём SFF-8639) был анонсирован в июле 2013 года. Основой для накопителя послужил контроллер, разработанный PMC-Sierra. Заявленные характеристики составили 3 ГБайт/с при последовательном чтении и 740000 IOPS при случайном доступе блоками 4 КиБ.

В июне 2014 года свои первые линейки серверных NVMe-накопителей представила компания Intel. Линейки DC P3700, DC P3600, DC P3500, различающиеся между собой производительностью и ресурсом, выпускаются в форм-факторе U.2 и в виде низкопрофильных плат PCIe. В 2015 году Intel выпустила основанный на P3500 накопитель потребительского класса — Intel 750.

В июне 2015 года появился один из первых NVMe-накопителей потребительского класса в компактном форм-факторе M.2 — Samsung SM951-NVMe.

Появившиеся в сентябре 2015 года смартфоны Apple iPhone 6s и iPhone 6s Plus стали первыми мобильными устройствами, оснащёнными встроенными NVMe-накопителями.

Технические особенности и инфраструктура

Сравнение с AHCI

Протокол NVMe разрабатывался с нуля, при этом основными целями являлись получение низких задержек и обеспечение параллельного доступа к твёрдотельным накопителям с учётом параллелизма современных платформ, использующих многоядерные процессоры. Основными преимуществами NVMe перед AHCI является оптимизированный механизм работы с очередями и обработкой прерываний, что позволяет обеспечить более высокий уровень производительности.

Устройство AHCI ограничено одной очередью глубиной 32, в то время как NVMe поддерживает 64 К (65536) очередей с глубиной 65536 каждая. Набор команд NVMe существенно упрощён в сравнении с ATA и SCSI, спецификацией определяется всего 13 обязательных команд, что, в первую очередь, существенно упрощает разработку устройств.

Форм-факторы накопителей

  • Платы расширения PCI Express. Большая часть выпускаемых по состоянию на начало 2016 года плат NVMe-накопителей выполнена в форм-факторе половинной высоты/половинной длины с интерфейсом PCI Express x4.
  • U.2 (SFF-8639) — накопители форм-фактора 2,5" высотой 15 мм с разъёмом SFF-8639. Используются, в основном, в серверах. Преимуществами в сравнении с обычной платой расширения являются поддержка горячей замены накопителей и более компактное исполнение, позволяющее разместить большее количество накопителей в корпусе сервера или системы хранения данных. Разъём SFF-8639 обратно совместим с SFF-8482, бэкплейн с разъёмом SFF-8639 при подключении к нему соответствующего контроллера поддерживает подключение накопителей с интерфейсами SATA и SAS.
Не все накопители форм-фактора U.2 являются NVMe-совместимыми. В начале 2013 года компания Dell выпустила новое поколение серверов с возможностью подключения до четырёх накопителей Micron P320h. Они были выполнены в совместимом с U.2 форм-факторе, подключались через четыре линии PCIe, но не использовали NVMe в качестве логического интерфейса. Для подключения бэкплейнов с поддержкой накопителей U.2 к шине PCI Express используются кабели с разъёмами OCuLink или SFF-8643, обеспечивающий подключение четырёх линий PCI Express. Кабель может подключаться к специальному разъёму на системной плате, в обычный слот расширения PCI Express через плату-ретаймер или к разъёму M.2 через переходник.
  • U.3
  • M.2 (NGFF) — бескорпусные накопители в компактном форм-факторе. Предназначены для использования в ноутбуках и стационарных ПК. Накопители формата M.2 могут подключаться либо непосредственно к соответствующему разъёму системной платы, либо устанавливаться в слот PCI Express через переходник.
  • Intel Ruler SSD (EDSFF) — форм-фактор для серверных накопителей с поддержкой горячей замены. Был анонсирован компанией Intel в 2017 году на Flash Memory Summit. Форм-фактор U.2 обеспечивал механическую совместимость с корпусами, предназначенными для установки дисков 2,5", но не очень хорошо подходил для твердотельных накопителей — ограниченные габариты усложняли наращивание объёма накопителей и затрудняли охлаждение. Размеры накопителей EDSFF составляют 325,35×9,5×38,6 мм, поддерживается подключение через 4 или 8 линий PCIe (в перспективе — до 16). Примерами готовых продуктов, использующих форм-фактор EDSFF являются серверы и JBOF-системы производства Supermicro, позволяющие разместить до 32 накопителей в корпусе высотой 1U.
  • Samsung NGSFF — форм-фактор для серверных накопителей с поддержкой горячей замены. Как и EDSFF, разработан в качестве альтернативы U.2. Имеет меньшие габариты в сравнении с EDSFF — 110×4,38×30,5 мм, что позволяет установить большее количество накопителей (36 в 1U) и использовать корпуса меньшей глубины.

NVMe over Fabrics

На протяжении последних лет ведутся разработки устройств и протоколов, позволяющих использовать накопители NVMe не только локально, в пределах одного сервера, но и строить сети хранения данных с использованием преимуществ NVMe. Подключение систем на базе накопителей NVMe к традиционным сетям хранения данных приводит к потере основного преимущества NVMe в виде сниженных за счёт отказа от SCSI задержек, так как в Fibre Channel и iSCSI предусмотрена инкапсуляция только команд SCSI.

Работы по устранению этого недостатка ведутся в двух направлениях:

  • Сохранение шины PCI Express в качестве транспорта и вынос её за пределы одиночного сервера. Компании Microsemi и Broadcom (подразделение PLX) разрабатывают коммутаторы PCI Express. Существуют прототипы готовых коммутаторов с внешними портами, обеспечивающих подключение нескольких хостов и устройств PCI Express.
  • Собственно NVMe over Fabrics — добавление в Fibre Channel и протоколы передачи данных блочного уровня, использующие RDMA, поддержки команд NVMe вместо SCSI. При этом обеспечивается уровень дополнительных задержек не более 10 мкс. Первая версия официальной спецификации NVMe over Fabrics была опубликована 9 июня 2016 года.

Поддержка операционными системами

Windows

Работа над первой версией драйвера Microsoft для Windows велась сформированной по инициативе «OpenFabrics Alliance» рабочей группой «NVMe Windows Working Group» и была завершена в 2012 году.

Компания Microsoft интегрировала драйвер NVMe в Windows 8.1 и Windows Server 2012 R2. Драйвер Microsoft для Windows 7 и Windows Server 2008 R2 был выпущен в виде обновлений. Samsung предлагает собственный драйвер NVMe, который обеспечивает более высокую производительность.

Linux

Первоначальная разработка драйвера для Linux велась компанией Intel. Драйвер был включён в ветку 3.3 ядра Linux 19 марта 2012 года.

В процессе разработки драйвера NVMe были выявлены недостатки архитектуры блочного ввода-вывода в ядре Linux, затруднявшие масштабирование производительности свыше 1 миллиона IOPS на устройство. При участии инженеров Fusion-io был разработан масштабируемый слой блочного ввода-вывода для высокопроизводительных твердотельных накопителей, известный как blk-multiqueue или blk-mq, и добавлен в ядро версии 3.13 19 января 2014 года. Другое направление в области оптимизации блочного-ввода вывода относится к уменьшению задержек, связанных с обработкой прерываний.

macOS

В macOS драйвер NVMe содержится в составе системы начиная с версии 10.13, вышедшей 25 сентября 2017 года.

ОС семейства BSD

Разработка драйвера NVMe для 9-й ветки FreeBSD велась при поддержке Intel. Начиная с FreeBSD версии 10.2 драйверы nvd(4) и nvme(4) включены в конфигурацию ядра по умолчанию.

Драйвер NVMe для DragonFly был написан с нуля Мэттом Диллоном. Первый официальный релиз с поддержкой NVMe — 4.6.

Разработка NVMe-драйвера для OpenBSD была начата в апреле 2014 года разработчиком, ранее развивавшим драйвера USB 2.0 и AHCI. Первый релиз драйвера появился в OpenBSD 6.0.

Поддержка NVMe в NetBSD появилась в выпуске 8.0.

Solaris

Solaris получила поддержку NVMe с версии Oracle Solaris 11.2.

Haiku

Полная поддержка NVMe доступна в Haiku с ревизии 54102.

QEMU

Для отладки драйверов и другого ПО в QEMU начиная с версии 1.6 появилась эмуляция NVMe-устройств (август 2013 года).

UEFI

Драйвер NVMe для загрузочного окружения UEFI доступен на SourceForge (проект edk2).