Спустя чуть более двух лет после последнего крупного обновления для твёрдотельных накопителей была опубликована новая версия спецификации протокола NVM Express. В последние годы орган по стандартизации NVMe использовал другой подход к добавлению новых функций в спецификацию: вместо того, чтобы объединять их в основные обновления спецификаций, которые публикуются годами, новые готовые функции были индивидуально ратифицированы и опубликованы в виде технических предложений (TP), чтобы поставщики могли приступить к внедрению и развёртыванию поддержки для этих функций без задержки и без необходимости ориентироваться на простой проект стандарта. Некоторые из этих функций были реализованы и публично продемонстрированы поставщиками всего через несколько месяцев после публикации спецификации NVMe 1.3.
NVMe 1.4 включает в себя 28 TP, которые строятся поверх NVMe 1.3, а также различные исправления и уточнения, которые вошли в версии 1.3a-1.3d. В целом, NVMe 1.4, похоже, является гораздо большим обновлением, чем 1.3. Несколько разделов теперь содержат более подробные объяснения новых и существующих функций, поэтому спецификацию легче понять, даже если она выросла с 298 страниц для 1.3d до 403 страниц для 1.4. Большинство диаграмм ниже прямо из самой спецификации, и высоко оцениваются.
Как обычно, новые функции не относятся ко всем случаям использования для твёрдотельных накопителей NVMe: некоторые имеют смысл только для встраиваемых систем или развертываний гиперскейлера, в которых интенсивно используется NVMe поверх Fabrics и виртуализации, и в результате большинство новых функций являются необязательными для реализации в SSD. Сопутствующие стандарты NVMe Management Interface и NVMe over Fabrics также развивались: NVMe-MI 1.1 была ратифицирована в декабре, а NVMe over TCP стал третьим транспортным протоколом для NVMeoF, объединяющим транспорт Fibre Channel и RDMA. Некоторые дополнения к базовой спецификации NVMe служат для внесения изменений в эти сопутствующие стандарты.
Новые дополнительные функции требуют в операционных системах обновления как SSD, так и драйверов NVMe ; без поддержки с обеих сторон диски будут использовать только старые наборы функций. Некоторые изменения выше программного стека также потребуются для того, чтобы осмысленно использовать новые возможности; в частности, многим для администрирования хранилищ будет полезно знать о новой информации и возможностях, предоставляемых твёрдотельными накопителями. Эти обновления программного обеспечения часто занимают больше времени, чем соответствующие изменения встроенного ПО SSD, поэтому поддержка этих новых функций будет обнаруживаться в специализированных средах задолго до того, как они будут использоваться дистрибутивами ОС общего назначения.
Рынок твёрдотельных накопителей NVMe находится в начале периода значительного улучшения производительности, связанного с переходом на PCIe 4.0, но это не требует каких-либо изменений в спецификации NVMe. Спецификация NVMe 1.4 включает в себя некоторую оптимизацию производительности, которая основана на более умном подходе к использованию хранилища и улучшенном взаимодействии между SSD и хост-системой. Другая большая категория новых функций относится к обработке ошибок, особенно к перестройкам RAID. Ниже приведены основные моменты новой спецификации, но это не исчерпывающий список того, что нового, и наш анализ потенциальных вариантов использования может не совпадать с тем, что планируют производители оборудования.
Дополнительные указания по размеру блока и выравниванию
Твёрдотельные накопители NVMe ведут себя как обычные блочные устройства с размерами секторов, которые обычно составляют 512 байт или 4 кБ. Современная флэш-память NAND имеет собственные размеры страниц, превышающие 4 КБ, и размеры стираемых блоков измеряются в мегабайтах. Это несоответствие является источником большой сложности на уровне флэш-трансляции, реализованной в каждом SSD. FTL позволяет программному обеспечению продолжать правильно функционировать, заставляя SSD думать, что их хранилище имеет небольшие размеры блоков, но некоторая осведомленность о реальных размерах блоков и страниц может позволить операционной системе или приложениям упростить работу SSD и обеспечить более высокую производительность. В спецификации NVMe 1.3 была представлена функция «Оптимальная граница ввода-вывода пространства имён», позволяющая твёрдотельным накопителям информировать хост-систему об основных требованиях к выравниванию для наилучшего выполнения команд чтения и записи. Мы видели случаи с дисками, которые допускают доступ небольшого размера блока, но имеют очень низкую производительность для передач размером менее 4 КБ:
В худшем случае накопители на самом деле должны просто отказаться от поддержки секторов 512B и использовать по умолчанию секторы 4kB, но там, где требуется совместимость со старыми системами, могут помочь подсказки о том, какие шаблоны доступа работают хорошо. NVMe 1.4 даёт твердотельным накопителям возможность передавать гораздо более подробную информацию, чтобы команды записи и освобождения (TRIM) могли соответствовать размерам страниц и стирать блоки.
Теперь SSD могут сообщать о значениях предпочтительного выравнивания пространства имён и предпочтительной записи пространства имён, которые минимизируют циклы чтения-изменения-записи, возникающие в результате записи только части страницы NAND. Аналогично, предпочтительное выравнивание выделенного пространства имён и гранулярность предпочтительного выделенного пространства пространства применяются к командам освобождения NVMe, аналогично команде ATA TRIM. Твёрдотельные накопители трудно обрабатывать, используя команды деаллокации/TRIM, которые охватывают малые диапазоны данных или большие, но имеют смещённые диапазоны, не увеличивая усиление записи, что в первую очередь лишает цели использования явных команд освобождения.
Вверху: для записи с меньшим размером может потребоваться, чтобы SSD выполнил операцию чтения-изменения-записи.
Ниже: Оптимальные по размеру, но смещённые записи также снижают производительность и увеличивают усиление записи.
SSD, которые поддерживают функцию потоков NVMe 1.3, могут также предоставлять подсказки для предпочтительной степени детализации записи и освобождения при использовании потоков, и эти значения обычно кратны указанным выше подсказкам.
Ответственность за правильное использование этих советов в основном ложится на ОС и файловую систему. Размеры полосы RAID и размеры блоков файловой системы могут быть установлены на основе этой информации, и приложения, такие как базы данных, которые пытаются оптимизировать производительность хранилища, минуя большую часть стека хранения ОС, также должны уделять внимание.
Более быстрое обнаружение и восстановление ошибок
NVMe 1.4 представляет несколько новых функций, помогающих обрабатывать неисправимые ошибки чтения и повреждённые данные, особенно в RAID и аналогичных сценариях, где хост-система может быстрее восстанавливать данные, просто извлекая их из другого места.
Функция Read Recovery Level позволяет хост-системе настроить, насколько сильно SSD должен пытаться восстановить повреждённые данные. SSD обычно имеют несколько уровней коррекции ошибок, каждый из которых более устойчив, но работает медленнее и требует больше энергии, чем предыдущий. В RAID-1 или аналогичном сценарии хост-система обычно предпочитает быстро получать сообщение об ошибке, поэтому она может попытаться прочитать те же данные с другой стороны зеркала, а не ждать, пока диск попытается повторить чтение и выполнить откат к более медленным уровням ECC. NVMe уже поддерживает Time-Limited Error Recovery (TLER), но это только позволяет хост-системе ограничивать время обработки ошибок с шагом 100 мс. Чтение уровней восстановления позволяет накопителям предоставлять до 16 различных уровней стратегий обработки ошибок, но накопители, реализующие эту функцию, требуются только для реализации как минимум двух разных режимов. Эта функция настраивается на уровне набора NVM.
Для упреждающего избежания неисправимых ошибок чтения NVMe 1.4 добавляет команды Verify и Get LBA Status. Команда Verify простая: она делает всё, что делает обычная команда чтения, за исключением возврата данных в хост-систему. Если команда чтения выдаст ошибку, команда проверки вернёт ту же ошибку. Если команда чтения будет успешной, команда проверки также будет успешной. Это позволяет выполнять низкоуровневую очистку хранимых данных без ограничения пропускной способности интерфейса хоста. Некоторые твёрдотельные накопители будут реагировать на исправляемую ошибку ECC, перемещая или перезаписывая повреждённые данные, и команда проверки должна вызывать такое же поведение. В целом, это должно уменьшить необходимость очистки/проверки контрольной суммы на уровне файловой системы. Каждая команда Verify помечена битом, указывающим, должен ли твёрдотельный накопитель быстро выходить из строя или стараться восстановить данные, аналогично, но переопределяет вышеуказанный параметр Read Recovery Level.
Функция Get LBA Status позволяет накопителю предоставить хосту список блоков, которые, вероятно, приведут к неисправимой ошибке чтения, если попытаться выполнить команду чтения или проверки. SSD, возможно, уже обнаружил ошибки ECC во время автоматического фонового сканирования, или в серьёзных случаях он может сообщить, какие LBA затронуты отказом всего кристалла NAND или канала. Также может быть использована функция «Получить состояние LBA», чтобы попросить накопитель выполнить сканирование выбранных диапазонов данных перед возвратом списка вероятных неисправимых блоков.
Когда хост-система узнает о повреждённых или утерянных данных либо с помощью функции – получить статус LBA, либо с помощью команд чтения или проверки и получения ошибки в ответ, она может перезаписать эти данные в те же LBA, используя копию, полученную в другом месте (резервные копии), или восстановление RAID), а затем продолжать использовать эти логические блоки в обычном режиме, в то время как SSD удалит повреждённые физические блоки при необходимости.
Постоянная область памяти
Большинство твёрдотельных накопителей NVMe имеют большое количество DRAM в дополнение к флэш-памяти. Основная цель этой DRAM состоит в том, чтобы служить кешем для таблиц уровня флэш-трансляции, которые отслеживают сопоставление адресов логических блоков и адресов физической флэш-памяти. Но NVMe изучает другие способы использования этой DRAM. В спецификации 1.2 был представлен буфер памяти контроллера, благодаря которому некоторые DRAM-устройства SSD напрямую доступны через адресное пространство PCI. Это позволяет очередям отправки и завершения команд ввода-вывода находиться в памяти SSD, а не в памяти ЦП хоста, что может уменьшить задержку на стороне отправки и может обрезать ненужное копирование в ситуациях когда NVMe поверх Fabrics, когда одноранговый DMA между SSD и сетевая карта позволяют данным полностью обходить DRAM хоста. Новая функция постоянной области памяти (PMR) в NVMe 1.4 работает аналогично – хост-система может читать или записывать в эту память напрямую, используя базовые передачи PCIe, без каких-либо накладных расходов на очереди команд. На практике буфер памяти контроллера обычно предназначен для поддержки нормальной работы NVMe, но PMR не будет вовлечён ни во что из этого. Вместо этого это блок памяти общего назначения, который становится постоянным благодаря тем же конденсаторам защиты от потери мощности, которые позволяют безопасно очищать внутренние кэши типичного корпоративного твёрдотельного накопителя в случае неожиданной потери питания хоста. Содержимое PMR будет автоматически записано на флэш-память, и когда хост-система снова включится, она может попросить SSD перезагрузить содержимое PMR.
Производительность и ёмкость PMR не приблизятся к возможностям NVDIMM, но PMR предоставляет некоторые из тех же преимуществ. Доступ к PMR намного проще и быстрее, чем создание команды ввода-вывода NVMe и ожидание её завершения. Типичная реализация функции PMR будет способна принимать очень большой объём записи без изнашивания какой-либо флэш-памяти, поскольку её содержимое необходимо сохранять только на флэш-памяти в случае сбоя питания. Это делает PMR отличным местом для хранения базы данных или журнала файловой системы, который видит постоянные записи и может легко стать узким местом.
Lite-On реализовал аналогичную функцию в одном из своих твердотельных накопителей ЦОД, выставляя часть своей защищённой конденсатором DRAM в качестве дополнительного пространства имен NVMe наряду с обычным пространством имён флэш-памяти. Это обеспечивает схожую производительность с PMR и не требует любое приложение или драйвер которые нужно изменять для поддержки, но исходная производительность не может быть такой высокой, как PMR.