company_banner

NVMe Namespaces: возможности и подводные камни


    Уверен, многие слышали про NVM Express, или просто NVMe. Изначально для меня это были просто быстрые диски. Потом я осознал, что это интерфейс для подключения этих дисков. Затем стал понимать NVMe как протокол для передачи данных по PCIe-шине. И не просто протокол, а протокол, разработанный специально для твердотельных накопителей!

    Мало-помалу я пришел к пониманию, что это целая спецификация. И понеслось… Сколько интересных особенностей использования, оказывается, существует у NVMe. Сколько всего придумано… Было даже немного обидно, что мимо меня прошел такой пласт информации.

    Так что же такое NVMe? Рассмотрим подробнее.

    Началось все с SATA-интерфейса. На самом деле до него существовала масса других интерфейсов — SCSI, UltraSCSI, ATA, PATA и прочие, но это уже дела давно минувших дней. В этой статье мы рассмотрим только актуальные сейчас интерфейсы.

    Скорость передачи данных по SATA-интерфейсу достигает 560 Мбайт/с, чего с лихвой хватает для HDD-дисков, производительность которых варьируется от 90 до 235 Мбайт/с (есть отдельные прототипы, скорость которых достигает 480 Мбайт/с). Но вот для SSD-дисков этого недостаточно, уже сейчас их производительность достигает от 3000 до 3500 Мбайт/с. SAS-интерфейс также не подойдет, его максимальная скорость всего лишь 1200 Мбайт/c.

    Для того, чтобы реализовать весь потенциал твердотельных накопителей, великие умы решили использовать PCIe-интерфейс. Сейчас он позволяет передавать данные со скоростью от 8 до 32 Гбайт/c. Чтобы унифицировать подключение SSD к PCIe-интерфейсу, была разработана спецификация NVMe. Точно так же, как в свое время была создана спецификация для подключения USB-Flash-накопителей.

    Полностью разбирать NVMe мы не будем. В этой статье я хочу поделиться с вами сильно заинтересовавшей меня особенностью — NVMe Namespaces, или Пространства имен.

    Надеюсь, среди читателей есть те, кто интересуется изучением этой технологии. Буду рад комментариям опытных пользователей. А если вы, как и я, только начинаете разбираться в теме, рекомендую ознакомиться с циклом статей об истории SSD. В свое время она помогла мне утрамбовать и разложить по полочкам много хлама в моей голове.

    Ближе к NVMe


    NVMe в Linux


    Начну издалека. К изучению и поиску информации о пространствах имен меня побудил вопрос: «Почему NVMe-диски в Linux называются именно так?»

    Все привыкли к обозначению дисков в Linux в виде блочных устройств. Они представляют собой файловые дескрипторы, которые обеспечивают интерфейс для взаимодействия с физическими или виртуальными устройствами. И такие устройства имеют не случайное, а вполне строгое название, содержащее некоторую информацию. Обратимся к следующему выводу из devfs:

    root@thinkpad-e14:~$ ls -l /dev/ | grep -E "nvme"
    crw-------  1 root    root    241,   0 окт 25 22:04 nvme0
    brw-rw----  1 root    disk    259,   0 окт 25 22:04 nvme0n1
    brw-rw----  1 root    disk    259,   1 окт 25 22:04 nvme0n1p1
    brw-rw----  1 root    disk    259,   2 окт 25 22:04 nvme0n1p2
    brw-rw----  1 root    disk    259,   3 окт 25 22:04 nvme0n1p3

    Здесь перечислены все NVMe-устройства, подключенные к рабочей машине. Рассмотрим блочное устройства /dev/nvme0n1p1. Часть nvme, как ни странно, применяется для NVMe-устройств. Число, идущее следом, обозначает порядковый номер контроллера диска, который отвечает за все операции, производимые с накопителем. Заключительная часть p1 указывает на номер раздела на диске. И наконец, часть, которая заслуживает нашего внимания, — n1. Это и есть номер пространства.

    Для простоты можно также провести некоторую аналогию с обыкновенными SSD:

    /dev/sda — аналог /dev/nvme0n1
    /dev/sda1 — аналог /dev/nvme0n1p1

    Обратите внимание на устройство /dev/nvme0. Это NVMe-контроллер. Он является символьным устройством. Таким образом, мы можем обращаться к нему, отправляя определенные команды, чем мы и воспользуемся далее.

    Namespace vs Partition


    У вас может возникнуть вопрос: чем namespace отличается от partition? Отбросим все возможности и преимущества NVMe Namespace. Partition — это раздел диска на уровне хоста. Namespace же является разделом на уровне контроллера. То есть Namespace является неким логическим пространством, с которым хост работает как с блочным устройством.

    Еще один уровень разделов добавляет гибкости в организации системы хранения, что позволяет использовать различные технологии, направленные на увеличение надежности, производительности и безопасности данных. Мы рассмотрим их позже.

    Параметры NVMe-контроллера


    Всеми операциями с данными занимается специальный NVMe-контроллер. Помимо этого, в своей памяти он хранит метаданные о себе и внутреннем устройстве информации: серийный номер, модель, всевозможные настройки диска, пространств, закрепленных за ним, формат данных и так далее.
    Предлагаю рассмотреть их под микроскопом. Для этого я отправил контроллеру специальную команду, в ответ на которую он вернул метаданные. Позже я объясню, как это сделать, а сейчас взгляните на них. Так как данных достаточно много, я не стал вставлять их целиком, но вы обязаны знать, что те параметры, о которых я буду говорить далее, на самом деле существуют:

    {
      "vid" : 5197,
      "ssvid" : 5197,
      "sn" : "00000000000000",
      "mn" : "00000000000000000000000000",
      "fr" : "7L1QFXV7",
      "rab" : 2,
      "ieee" : 9528,
      "cmic" : 0,
      "mdts" : 9,
      "cntlid" : 5,
      "ver" : 66304,
      "rtd3r" : 100000,
      "rtd3e" : 8000000,
      "oaes" : 512,
      "ctratt" : 0,
      "rrls" : 0,
      "crdt1" : 0,
      "crdt2" : 0,
      "crdt3" : 0,
      "oacs" : 23,
      "tnvmcap" : 256060514304,
      "unvmcap" : 0,
      ...
    }

    Метаданные хранятся в контроллере в виде последовательности байтов в порядке от старшего к младшему, поэтому далее я буду придерживаться следующего формата записи:
    [интервал в байтах (формата Big-Endian)] / название параметра / расшифровка.

    Пример для лучшего понимания. Следующая запись означает, что с 71 по 64 байт хранится значение параметра fr, который расшифровывается как firmware revision:

    [71:64] / fr / firmware revision.
    [23:4] / sn / serial number. Содержит серийный номер контроллера.
    [63:24] / mn / model number. Содержит номер модели, или part number.
    [71:64] / fr / firmware revision. Содержит номер ревизии прошивки контроллера.
    [257:256] / oacs / optional admin command support. Указывает на наличие дополнительных команд и функций контроллера. Состоит он из 16 бит, каждый из которых отвечает за определенную команду. Если бит равен 1, то контроллер дает возможность:

    • [15:10] — зарезервированы;
    • [9] — получить статус LBA;
    • [8] — получить доступ к дорбелл буферу («Doorbell Buffer Config»);
    • [7] — управлять виртуализацией («Virtualization Management»);
    • [6] — использовать команды NVMe-Mi Recieve и NVMe-Mi Send («NVMe Management Interface»);
    • [5] — использовать директивы («Directives»);
    • [4] — использовать команды для самопроверки («Self-Test Commands»);
    • [3] — управлять пространствами имен («Namespace Management»);
    • [2] — обновлять прошивку контроллера (команды «Firmware Commit» и «Firmware Download»);
    • [1] — форматировать пространства имен («NVM Format»);
    • [0] — поддержка команд протокола безопасности («Security Send», «Security Receive»).

    В данной статье мы затронем только те функции, которые относятся к пространствам имен, а именно «Namespace Management» и «NVM Format». Если вас интересуют подробности о других функциях, можно обратиться к спецификации NVM Express Revision 1.4.

    Параметры NVMe-пространств


    Теперь рассмотрим метаданные NVMe-пространств:

    {
      "nsze" : 500118192,
      "ncap" : 500118192,
      "nuse" : 233042000,
      "nsfeat" : 0,
      "nlbaf" : 0,
      "flbas" : 0,
      "mc" : 0,
      "dpc" : 0,
      "dps" : 0,
      "nmic" : 0,
      "rescap" : 0,
      ...
      ]
    }

    [7:0] / nsze / namespace size. Это максимальный размер пространства в логических блоках. В данном случае — 500118192 512-байтных блоков, что, кстати, и указано в выводе blockdev:

    root@thinkpad-e14:~$ sudo blockdev --getsz /dev/nvme0n1
    500118192

    [15:8] / ncap / namespace capacity. Это количество логических блоков, выделенных пространству для хранения данных в текущий момент.

    [23:17] / nuse / namespace use. Это количество логических блоков, занятых данными в текущий момент.

    Обратите внимание, что параметры nsze и ncap равны. Какой смысл указывать максимальный объем и объем, который выделен в текущий момент? Значит ли это, что в текущий момент может быть выделено меньше, чем доступно? Да!

    Дело в том, что пространства имен поддерживают технологию Thin Provisioning. Это означает, что пространству выделяется только часть от указанного объема. Другая часть будет оставаться в общем пуле и выделяться этому или другим пространствам по требованию: при заполнении выделенного объема или при достижении критического порога. В общем, эта технология позволяет эффективнее использовать ресурсы для хранения данных. Подробнее и нагляднее с этой технологией можно ознакомиться в этой статье.

    В нашей же ситуации nsze и ncap равны, так как пространство было создано без поддержки тонкого распределения. Выглядеть такое пространство на диске будет так:


    ncap и nsize будут указывать на одно 一 общий объем пространства. В случае с использованием тонкого распределения на диске пространство будет выглядеть так:


    Здесь nsze указывает на максимальный объем, ncap — на выделенный, а nuse в обоих случая показывает только то, что занято. Когда значение nuse достигнет значения ncap, то ncap увеличится, но не больше, чем nsze.

    Стоит отметить, что для поддержки этой технологии необходима соответствующая настройка пространства имен, а также поддержка тонкого распределения со стороны контроллера.

    [24:24] / nsfeat / namespace features. Этот параметр особенно интересен. Он указывает на наличие дополнительных особенностей пространства. Состоит он из 8 бит (перечислены они тоже в Big Endian), каждый из которых отвечает за определенную функцию. Если значение бита равно 1, то функция активна, 0 — нет:

    • [7:5] — зарезервированы;
    • [4:4] — поддержка дополнительных полей для оптимизации ввода-вывода;
    • [3:3] — отключение переиспользования поля NGUID;
    • [2:2] — поддержка делоцированных и незаписанных блоков («Context Attributes»);
    • [1:1] — поддержка дополнительных полей для атомарной записи («Atomic Operations»);
    • [0:0] — поддержка тонкого распределения.

    [26:26] / flbas / formatted lba size. Этот параметр указывает на структуру LBA. Также состоит из 8 бит:

    • [7:5] — зарезервированы;
    • [4:4] — при значении 1: указывает, что метаданные будут храниться в конце блока; при значении 0: метаданные передаются отдельным буфером;
    • [3:0] — позволяет выбрать один из 16 возможных форматов LBA.


    [29:29] / dps / end-to-end data protection type settings. Указывает на тип сквозной защиты данных. Состоит из 8 бит:

    • [7:4] — зарезервированы;
    • [3:3] — указывает на тип передачи метаданных;
    • [2:0] — указывает на наличие защиты данных и ее тип.

    [30:30] / nmic / namespace multi-path and Namespace Sharing Capabilities. Это поле указывает на поддержку функций, связанных с мультидоступом к пространствам имен:

    • [7:1]— зарезервированы;
    • [0:0]— значение 1 указывает на то, что данное пространство является публичным (public namespace) и может связываться с несколькими контроллерами, а значение 0 — на то, что пространство является приватным (private namespace) и привязывается только к одному.

    На этом можно завершить краткий обзор параметров. Их количество огромно, что позволяет очень тонко настроить пространства имен под различные задачи, которые мы рассмотрим в конце статьи. Подробное описание каждого параметра можно изучить в спецификации NVM Express Revision 1.4.

    Публичные и приватные пространства


    В статье уже упоминались такие термины, как публичные пространства и приватные пространства. Но я не вносил ясности в их значение, поэтому считаю нужным уделить им немного времени.

    Одним из этапов создания пространства является его закрепление за NVMe-контроллером. Доступ к пространству и будет осуществляться через тот контроллер, за которым оно закреплено. Но пространство может быть закреплено не только за одним контроллером — приватное, но и за несколькими контроллерами — публичное.

    Если приватное пространство можно назвать обычным, так как из него ничего интересного слепить нельзя, то публичное пространство позволяет использовать такую возможность, как namespace multi-path.

    Взаимодействие с NVMe


    Приступим к вопросу взаимодействия с NVMe-устройствами: как посылать различные команды контроллеру, создавать пространства имен, форматировать их и т. д. Для этого в мире Linux существует утилита — nvme-cli. С ее помощью и можно выполнять данные операции.

    nvme list


    Чтобы вывести список NVMe-устройств, не обязательно обращаться к devfs подобным образом:

    root@thinkpad-e14:~$ ls /dev/ | grep "nvme"
    nvme0
    nvme0n1
    nvme0n1p1
    nvme0n1p2
    nvme0n1p3

    Или использовать lspci, чтобы узнать что же такое подключено к машине:

    root@thinkpad-e14:~$ lspci | grep -E "NVMe|Non-Volatile"
    07:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd Device a809

    Достаточно использовать команду nvme list:

    root@thinkpad-e14:~$ nvme list -o json
    {
      "Devices" : [
        {
          "NameSpace" : 1,
          "DevicePath" : "/dev/nvme0n1",
          "Firmware" : "9L1QFXV7",
          "Index" : 0,
          "ModelNumber" : "SAMSUNG MZALQ256HAJD-000L1",
          "ProductName" : "Non-Volatile memory controller: Samsung Electronics Co Ltd Device 0xa809",
          "SerialNumber" : "00000000000000",
          "UsedBytes" : 38470483968,
          "MaximumLBA" : 500118192,
          "PhysicalSize" : 256060514304,
          "SectorSize" : 512
        }
      ]
    }

    В качестве примера я вывел информацию в формате JSON. Как вы можете наблюдать, здесь выводится не просто список устройств, а еще и различная информация о них. Думаю, что часть атрибутов (например, DevicePath или ModelNumber) в комментариях не нуждаются, поэтому обращаю внимание только на некоторые:

    • Index — номер контроллера;
    • UsedBytes — используемый объем пространства в байтах;
    • PhysicalSize — максимальный объем пространства в байтах;
    • SectorSize — формат LBA, или логического блока, — минимального адресуемого блока данных;
    • MaximumLBA — максимальное количество логических блоков.

    nvme id-ctrl, nvme id-ns


    Ранее в статье, чтобы получить метаданные об устройстве, я отправлял контроллеру команду Identify. Для этого я использовал команду nvme id-ctrl для идентификации контроллера:

    root@thinkpad-e14:~$ nvme id-ctrl /dev/nvme0

    И nvme id-ns для идентификации пространства:
    root@thinkpad-e14:~$ nvme id-ns /dev/nvme0n1

    Обратите внимание, что необходимо указать устройство — контроллер или пространство имен.

    nvme create-ns, nvme delete-ns


    Создание пространств имен проходит в несколько этапов. Сначала его нужно сформировать. Для этого используется команда nvme create-ns:

    root@thinkpad-e14:~$ nvme create-ns /dev/nvme0 --nsze 1875385008 --ncap 1875385008 --flbas 0 --nmic 1 --dps 0
    create-ns: Success, created nsid:1

    Аргументы, которые указываются этой команде, вам уже знакомы. Мы их рассмотрели в разделе «Параметры NVMe-пространств».

    Для удаления пространства используется команда nvme delete-ns:

    root@thinkpad-e14:~$ nvme delete-ns /dev/nvme0n1          
    delete-ns: Success, deleted nsid:1

    nvme attach-ns, nvme detach-ns


    Второй этап создания NVMe-пространств — привязка к контроллеру сформированного пространства. Для этого необходимо использовать команду nvme attach-ns:

    root@thinkpad-e14:~$ nvme attach-ns /dev/nvme0 --namespace-id 1 --controllers 1
    attach-ns: Success, nsid:1

    Данной командой мы привязываем пространство с идентификатором 1 к контроллеру /dev/nvme0. Также обратите внимание на аргумент --controllers. Здесь перечисляются идентификаторы NVMe-контроллеров, к которым можно привязать пространство. Этот аргумент опционален и используется при создании публичных пространств.

    По какой-то причине нумерация контроллеров начинается с 1, то есть контроллер /dev/nvme0 имеет идентификатор 1, который и указывается в аргументе --controllers. Надеюсь, это поможет вам избежать потерю времени на изучении следующей ошибки:

    root@thinkpad-e14:~$ nvme attach-ns /dev/nvme0 --namespace-id 1 --controllers 0                            
    NVMe Status:CONTROLLER_LIST_INVALID: The controller list provided is invalid(211c)

    Чтобы отвязать пространство, используется команда nvme detach-ns:

    root@thinkpad-e14:~$ nvme detach-ns /dev/nvme0n1 --namespace-id 1 --controllers 1
    detach-ns: Success, nsid:1

    После этого пространство исчезает из списка блочных устройств и его становится невозможно использовать. В аргументе --controllers также необходимо указывать только те контроллеры, от которых вы хотите отвязать пространство.

    nvme reset


    После привязки пространства к контроллеру, как правило, его можно использовать для работы. Однако случается так, что контроллер не может увидеть пространства. В таком случае его необходимо перезапустить — использовать команду nvme reset.

    nvme format


    В случае если необходимо изменить формат LBA у пространства, на помощь приходит команда nvme format:

    root@thinkpad-e14:~$ nvme format /dev/nvme0n1 --lbaf 0
    Success formatting namespace:1

    Аргумент --lbaf указывает на формат LBA.

    Однако эту команду также можно использовать и для безопасной затирки данных на NVMe-накопителе:

    root@thinkpad-e14:~$ nvme format /dev/nvme0n1 --ses 1 -r
    Success formatting namespace:1

    Аргумент --ses указывает на уровень затирки:

    • 1 — удалить все данные;
    • 2 — удалить зашифрованные данные.

    Аргумент -r указывает на то, что контроллер будет перезапущен после безопасной затирки.

    Применение


    Возможных вариантов использования пространств много. В основном они используются для увеличения производительности, резервирования и применяются в СХД, однако есть и более приземленные варианты использования.

    Spare Area


    Начнем с довольно обычной практикой использования. Spare Area, или Резервная область, была придумана еще до NVMe. Это специальное пространство на твердотельном накопителе, которое используется самим контроллером для внутренних операций и недоступно хосту.

    Изменяя размер пространств, мы можем изменить и размер резервной области. Дело в том, что весь объем диска равен сумме объемов всех пространств и объема резервной области:


    Соответственно, если мы уменьшим общий объем пространств, то оставшийся объем уйдет в пользу резервной области.

    Если вы хотите узнать больше про резервную область, можете обратиться к этой статье.

    Шифрование и изоляция



    NVMe-диски поддерживают самошифрование по спецификации OPAL. Более того, для каждого пространства имен используются различные ключи шифрования.

    Также контроллер предоставляет возможность защиты от записи. Существует три уровня:

    • только для чтения до следующей перезагрузки;
    • только для чтения до следующей перезагрузки после отключения функции защиты от записи;
    • только для чтения на протяжении всей работы.


    Это часто применяется в стационарных и мобильных ПК. В пространство, доступное только для чтения, можно поместить, например, загрузчик, чтобы избежать его повреждения. Таким же образом можно защитить другие важные данные.

    Multiple Using


    Как упоминалось ранее, пространства являются разделами на уровне контроллера, которые видны конечному хосту как отдельное устройство. А можно ли разделить NVMe-накопитель большого объема не несколько приватных пространств, каждое из которых затем выделить разным хостам? Можно! А с использованием сетевого протокола NVMe-oF (NVMe Over Fabrics) выделить эти пространства можно не только виртуальным хостам, но и физическим.

    При таком использовании накопителя схема разделения будет выглядеть следующим образом:


    NVMe-контроллер позаботится о том, чтобы пространства были изолированы друга от друга: данные будут храниться в отделенных друг от друга областях накопителя, у каждого хоста будет собственная очередь для ввода-вывода. Тем не менее, spare area, или резервные области, по-прежнему будут общими.

    Namespace Multi-path и Namespace Sharing


    Namespace Sharing, или Public Namespaces, подразумевает под собой возможность совместного доступа одного или нескольких хостов к пространству через два и более контроллеров.


    Для чего это необходимо? На рисунке показана схема использования публичных пространств. Да, интересно: мы можем обратиться к пространству NS B через контроллер NVMe Controller 1 и NVMe Controller 2. Но я не вижу в этом какой-то полезности… пока схема не будет выглядеть следующим образом:


    Здесь мы видим, что контроллеры находятся на совершенно разных хостах и у нас есть несколько независимых путей к данным: через хост-контроллеры Host A (синие контроллеры) и Host B (фиолетовые контроллеры). Теперь это можно использовать для резервирования или для наращивания производительности: если синий путь будет сильно нагружен, то мы пойдем по фиолетовому.

    Такой подход позволяет организовать высокопроизводительные и высоконадежные гибкие программно-определяемые СХД из обычных серверных платформ с использованием NVMe-oF.

    Итог


    NVMe Namespaces — это не только ценный мех не просто логическое разделение диска. Это очень интересная и важная технология, которая позволяет строить удобные инфраструктурные решения по хранению данных. Возможности для резервирования, шифрования, увеличения срока службы диска позволяют поддерживать стабильную работу высоконагруженных сервисов.

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

    Послесловие


    При написании статьи я столкнулся с попаболью рядом проблем, мешавших мне завершить работу. Будьте внимательны при выборе дисков для тестирования различных возможностей NVMe. Мне далеко не с первого раза удалось разобраться в проблемах и подобрать себе диск, который бы минимально удовлетворял моим требованиям. Да и производители дисков неохотно делятся такой информацией, а некоторые даже вводят в заблуждение, поэтому пришлось действовать наобум. В частности, я столкнулся с такими проблемами:

    • Диски Samsung 970 EVO/970 EVO Plus с прошивками 2b2qexe7/2b2qexm7 не реализуют команды reset и format;
    • Диски Samsung 970 EVO/970 EVO Plus с прошивками 2b2qexe7/2b2qexm7 не реализуют управление пространствами при помощи команд create-ns, delete-ns, detach-ns, atach-ns;
    • Диски Samsung PM991 с прошивкой 9L1QFXV7 имеют баг, из-за которого перезагрузка контроллера при помощи команды reset приводит к ошибке;
    • Диски Samsung PM991 с прошивкой 9L1QFXV7 имеют баг, из-за которого форматирование пространства при помощи команды format приводит к ошибке;
    • Диски Samsung PM991 с прошивкой 9L1QFXV7 не реализуют управление пространствами при помощи команд create-ns, delete-ns, detach-ns, atach-ns.

    Я уверен, что диски из корпоративного сегмента лишены этих проблем, однако не всем по силам приобрести такие железки, поэтому подробно изучайте диски и мануалы по ним при покупке. А если есть возможность изучить диски до покупки и посмотреть параметры NVMe-контроллера, обязательно воспользуйтесь ею.

    Полезные источники


    1. SSD: устройство, компоненты и принципы работы
    2. A Quick Tour of NVM Express
    3. NVMe 1.4 Specification
    4. NVMe Namespaces
    5. Base NVM Express — Part One
    6. NVMe Command Line Interface (NVMe-CLI)
    7. NVMe Over Fabrics
    8. Также по теме

    Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

    А вы используете NVMe Namespaces на своих серверах?

    • 13,6%Да9
    • 59,1%Нет39
    • 27,3%Не использую NVMe18
    Selectel
    IT-инфраструктура для бизнеса

    Комментарии 30

      +12

      Я не видел ни одной nvme, которая бы умела больше одной ns. И корпоративной тоже. Dell'овые топовые NVME тоже только 1 ns делают. Это нужно какому-то конкретному вендору для каких-то конкретных вопросов.


      В целом, я
      1) Не доверяю управление разделами фирмвари nvme.
      2) Не доверяю шифрование фирмвари nvme
      3) Не доверяю адекватность обработок ошибок thin provision nvme


      Другими словами, я им не доверяю. Я им и байты-то с трудом доверяю, не то, что сложные вопросы.


      Все эти технологии хорошо реализуются в софте. Поддержка нескольких контроллеров и всякие "фабрики nvme" безумно далеки от реального мира, так что вся вот эта красота — она просто для усложнения имени устройства.


      Пользы от неё только в том, что для управления character device появился, вместо магических ioctl'ов во внутрь блочного устройства.


      А из всего полезного в nvme (как утилите управления) — это format (позволяющий поменять размер сектора с 512 до 4к на некоторых моделях), да местный аналог smart'а.

        +1
        Мне удалось создать больше одной NS на Micron 7300 (MTFDHBE960TDF), однако только private и без thin provision.

        А с чем связано такое недоверие? Почему софт для вас софт лучше?
          +13

          Сколько производителей фирмварей для nvme на рынке? Допустим, 500. У нас есть 500 проприетарных прошивок, для которых есть 500, коммерчески ограниченных QA-отделов и программистов для code review шифрования. Как выдумаете, сколько времени уделяется для конкретной прошивки конкретного вендора?


          А теперь сравните с opensource реализацией в ядре. Сколько у нас пользователей для dmcrypt? Вроде, только на Андроиде 2.5 миллиардов. Ещё сервера. Очевидно, что dmcrypt тщательно вычитан и проверен. Это не означает, что в нём нет багов, но объём усилий по qa, объём пользовательской базы и срок жизни кода (кратно больший, чем время жизни фирмвари для конкретного контроллера), все вместе они делают уровень доверия несравнимым.


          Если что, я прямо сейчас изучаю, казалось бы, простую задачу "вайпать диски". У меня в коллекции уже есть диск, который при попытке wipe'а делает power reset (не дотерев), диск, который не может закончить secure erase, диск, который делает blkdiscard, но оставляет данные доступными (что не баг, просто "фича").


          Короче, авторы фирмварей — априори криворуки, и если на стандартные usecase'ы (читать/писать) можно хотя бы частично надеяться (потому что иначе они не смогут продавать устройства долго), то не стоит надеяться на тщательность реализации аппендикса 19 третьей ревизии стандарта, том 4, у которого есть 2.5 пользователя во всём мире.

            +1
            Не могу не согласиться, так как сам сталкиваюсь с различными проблемами с nvme. Пусть и на своем ноутбуке.

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

            Пока искал решение проблемы наткнулся еще на огромное количество различных багов. Один из забавных — вайп данных на Samsung 970 EVO происходит только после того, как переведешь ноутбук в suspend-режим и включишь его обратно.
              +3
              Это не баг, а фича.
              Modern computers will “freeze” the disk at boot. Press the sleep button to overcome this. The computer could be placed into a sleep mode to unfreeze them.

              Состояние frozen предусмотрено стандартом.
              0
              Сколько производителей фирмварей для nvme на рынке? Допустим, 500

              Допускайте сразу миллион, для красоты, чего уж там.
              10 — гораздо более близкое к правде количество

                0

                https://market.yandex.ru/catalog--vnutrennie-tverdotelnye-nakopiteli-ssd/83821/filters?text=ssd&cpa=0&hid=16309373&onstock=0&local-offers-first=0


                Ткните "показать ещё" в вендоры. Моя оценка ближе. Не путайте производителей чипов (их мало) и производителей SSD со своей фирмварей в чужих чипах (их много).

                  +2

                  Вы сами этот список смотрели? Там 69 производителей. ВСЕХ SSD, а не только NVMe. Из них часть — безвестная кетайщина, которая уж точно ничего не пишет сама. Часть — просто перелицованные бренды, которые в фирмвари только информацию о модели меняют. Часть давно уже SSD не выпускает. А бОльшая часть от оставшейся части выпускает только SATA.
                  Ну и где "допустим 500"?
                  Я бы оценивал количество разработчиков по количеству производителей контроллеров (а их сколько актуальных? Штук 5?) умноженному на количество производителей чипов. И то это крайняя оценка. И также никакими пятистами не пахнет.

                    0

                    Почему вы считаете "производителя контроллера" равным "автору прошивки"? Чип контроллера один и тот же, секретный соус (код) у каждого свой. Вероятнее всего, часть использует откровенный whitelabel (тот же Dell использует и не стесняется), но часть пилит своё (на стандартном железе).


                    В целом, моя предвзятость базируется на срачике с отделом разработки одного суперизвестного бренда второго эшелона, когда для ускорения устройства в моих бенчмарках он "посмотрел как сделал самсунг и сделал так же", заменил deterministic discard на non-deterministic. И это для прошивки для устройства в масс-продакшене!


                    Как можно доверять вендорам в таких ситуациях?

                      0
                      секретный соус (код)

                      Как вы говорите соус секретный и поэтому его рецепт не раскрывает, а только дает возможность некоторым образом изменить настройки работы контроллера. То есть сломать ничего нельзя. Код раскрывается лишь единицам, на поддержку которых вендорам не жалко ресурсов.
                        0
                        Почему вы считаете «производителя контроллера» равным «автору прошивки»?
                        А почему я не могу так считать? :)

                        секретный соус (код) у каждого свой
                        Соус (код) чего именно? И почему он должен быть секретным? С большой (хоть и не 100%) уверенностью предполагаю, что с контроллерами производителям передают открытый типа-SDK, в котором нет смысла (хоть и есть возможность) что-то менять кроме конкретных параметров для конкретных чипов памяти.

                        В целом, моя предвзятость базируется на срачике с отделом разработки одного суперизвестного бренда
                        Как можно доверять вендорам в таких ситуациях?

                        Так дискуссия-то не про ваше доверие кому-то, а про то, с чего вдруг количество производителей фирмвари NVMe SSD «допустим 500»?
              +2
              Я не видел ни одной nvme, которая бы умела больше одной ns. И корпоративной тоже. Dell'овые топовые NVME тоже только 1 ns делают. Это нужно какому-то конкретному вендору для каких-то конкретных вопросов.

              Enterprise SSD PE80 серии от Hynix умеют до 128 неймспейсов. Другое дело что заказчик определяет сколько их будет в прошивке.

              В целом, я
              1) Не доверяю управление разделами фирмвари nvme.

              Фирмварь NVMe диска не управляет разделами. NVMe Namespace — это и есть сам диск. И на уровне протокола он выглядит для хоста изолированным устройством, как и обычный HDD. То, что несколько дисков находятся физически на одном устройстве — следствие растущей производительности и емкости NVMe накопителей.

              2) Не доверяю шифрование фирмвари nvme

              Тут я могу ошибаться, но шифрование внутри контроллера защищает данные только от прямого чтения из NAND (плюсом еще вроде как идет более равномерное распределение зарядов внутри чипов, но это уже совсем далеко от моей специализации). Это не отменяет необходимости шифровать ваши данные перед записью. Тем более потому что эта функция тоже может быть отключена по требованию заказчика дисков.

              3) Не доверяю адекватность обработок ошибок thin provision nvme

              Не совсем понимаю о каких ошибках идет речь. Thin Provisioning вообще очень специфичная функция и ее очень мало кто требует.

              Другими словами, я им не доверяю. Я им и байты-то с трудом доверяю, не то, что сложные вопросы.

              Ну по сравнению с «байтами», NamespaceManagement прост как дважды два, лишь только слой логических адресов над пространством накопителя.

              Поддержка нескольких контроллеров и всякие «фабрики nvme» безумно далеки от реального мира, так что вся вот эта красота — она просто для усложнения имени устройства.

              Вся эта красота — для упрощения. Упрощения создания облачных хранилищ, обеспечения безопасности доступа к данными. Один современный NVMe накопитель с несколькими неймспейсами и виртуальными контроллерами уже на уровне протокола позволяет безопасно и изолированно друг от друга хранить данные NN (Number of Namespaces) облачных серверов. Весь NamespaceManagement писался под сервера. И это уже становится востребованным.
                0
                Enterprise SSD PE80 серии от Hynix умеют до 128 неймспейсов. Другое дело что заказчик определяет сколько их будет в прошивке.

                Комментом ниже — тестировал, только на серии PE81.
                  +4

                  Enterprise SSD PE80 серии от Hynix


                  Ура. Мы нашли 1 пользователя namespace'ов. Осталось найти ещё 1.5 штуки и список будет закрыт.


                  namespace в nvme — это партиционирование силами устройства. Это не partition table и не gpt, разумеется, но это партиционирование.


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


                  На нормальном сервере управлять партиционированием устройства удобнее с помощью LVM (который, в отличие от linux-raid, на nvme скорости сильно не роняет).


                  Насчёт того, что это "безопасно и изолировано" — это ваш QA отдел сказал. Один из (условных) 500, каждый из которых уверен, что безопасно и изолировано. А на выходе я сижу и чешу репу, что каждый вендор имеет сломанную фирмварь в очередном новом месте.

                +3
                >>По какой-то причине нумерация контроллеров начинается с 1, то есть контроллер /dev/nvme0 имеет идентификатор 1, который и указывается в аргументе --controllers.
                Потому что nsid=0 зарезервированно для внутренних нужд. Говорю, как разработчик хостовой части фирмвари :)
                В целом по статье — всё отлично. Единственное — доступность более чем одного NS задаётся в прошивке, и это бывает относительно редко. Зависит от требований заказчика. В потребительском сегменте это большая редкость вообще, потому что без этой подсистемы сама прошивка значительно компактнее и проще выходит.
                  0
                  Только, наверное, не nsid, а какой-нибудь ctrlid? Ведь речь идет о нумерации контроллеров)

                  Смысл в том, что в devfs нумерация контроллеров начинается с 0. Например /dev/nvme0, а вот в аргументе нужно указывать 1.
                    +1
                    Да, там чуть иначе. «NSID=NSIDX+1» — примерно так идёт во всей прошивке. Это применимо как к пространствам имён, так и к самим устройствам. Откуда это пошло — я не в курсе, к сожалению. Возможно, это некое наследие больного прошлого…
                      0
                      В любом случае загадка решена!

                      Спасибо за информацию)
                        0
                        Да, там чуть иначе. «NSID=NSIDX+1» — примерно так идёт во всей прошивке.

                        Ну это смотря как писать)

                        Это применимо как к пространствам имён, так и к самим устройствам. Откуда это пошло — я не в курсе, к сожалению. Возможно, это некое наследие больного прошлого…

                        NSID=0 зарезервировано потому что 0 — пустое значение для любого поля в NVMe CommandEntry. Если бы можно было создать нулевой неймспейс, то любая команда от хоста, специфичная для неймспейсов, и содержащая пустой NSID, предназначалась бы для этого злосчастного неймспейса. Ведь порядок назначения NSID для создаваемых неймспейсов определен в стандарте, по возрастанию от наименьшего незанятого значения. А так 0 — это или «команда не использует NSID», или «Invalid NS or Format» если использует.

                        А что касается --controlers=1 у автора, то я не помню что бы CNTID или CNTLID не могли быть равны 0. NVMe 1.3c раздел 7.11:
                          0
                          Возможно, это сделано для того, чтобы логика сохранялась. Или просто зависит от вендора.
                    0
                    Поясните, пожалуйста, доступ к пространству NS B имеют два хоста одновременно?
                      0
                      Именно так. Пример для чего это может быть нужно — шаренное хранилище образов для развертывания виртуальных серверов.
                      При этом можно не только присоединить его «только для чтения», но и на уровне протокола защитить диапазоны адресов от конкурентного доступа (группа команд Reservation в протоколе).
                        0
                        Что из себя представляет механизм конкурентного доступа к одному и тому же полю для записи?
                          0
                          Представим что два хоста одновременно решили обновить один и тот же (или пересекающийся) диапазон LBA. С точки зрения NVMe устройства данные останутся консистентными т.к. оно просто последовательно обработало несколько операций записи в одни и те же LBA. Но с точки зрения одного из хостов, перезаписанные LBA имеют ошибочное значение.
                            0
                            Но с точки зрения одного из хостов, перезаписанные LBA имеют ошибочное значение.

                            И что из этого следует?
                              +1
                              И что из этого следует?

                              Вы серьезно? Изменения не сохранятся, контрольная сумма не сойдется, JSONчик побьется, программа, читающая этот файл, эволюционирует и запустит ядерные ракеты, что угодно.

                              Для безопасной записи в шаренный неймспейс, хост может временно запросить привилегированный доступ на запись или запись и чтение командой Reservation Acquire. По окончании работы, отпустить неймспейс командой Reservation Release. И тогда всем будет хорошо.
                                0
                                В общем то меня вторая часть ответа интересовала. Спасибо.
                      +1
                      Зависит от хотелок. Можно создать публичное пространство и закрепить его за разными NVMe-контроллерами, подключенным к разным хостам. Таким образом, у разных хостов появится возможность использовать это пространство. А можно изолировать NS так, чтобы только один хост его использовал.
                        +3
                        Очень интересно было тестировать у себя такой функционал — требовалось проверить работу 128 виртуальных функций вкупе с управлением пространствами имён. В итоге каждой функции назначил свой NS, за которым был некий кусочек общего пространства диска. Пришлось писать свой модуль для NVME-CLI, но он только для внутреннего использования — сильно специфичен. Заодно пришлось лезть в отладку ядра Linux и узнать много нового о внутренней кухне :)
                          +1
                          Почему ресурс перезаписи (tbw) у NVMe дисков ниже, чем у SATA SSD?

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое