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-контроллер. Помимо этого, в своей памяти он хранит метаданные о себе и внутреннем устройстве информации: серийный номер, модель, всевозможные настройки диска, пространств, закрепленных за ним, формат данных и так далее.
Предлагаю рассмотреть их под микроскопом. Для этого я отправил контроллеру специальную команду, в ответ на которую он вернул метаданные. Позже я объясню, как это сделать, а сейчас взгляните на них. Так как данных достаточно много, я не стал вставлять их целиком, но вы обязаны знать, что те параметры, о которых я буду говорить далее, на самом деле существуют:
Метаданные хранятся в контроллере в виде последовательности байтов в порядке от старшего к младшему, поэтому далее я буду придерживаться следующего формата записи:
[интервал в байтах (формата 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»).
Параметры NVMe-пространств
Теперь рассмотрим метаданные NVMe-пространств:
[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] — поддержка тонкого распределения.
- [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] — указывает на наличие защиты данных и ее тип.
- [7:1]— зарезервированы;
- [0:0]— значение 1 указывает на то, что данное пространство является публичным (public namespace) и может связываться с несколькими контроллерами, а значение 0 — на то, что пространство является приватным (private namespace) и привязывается только к одному.
Публичные и приватные пространства
В статье уже упоминались такие термины, как публичные пространства и приватные пространства. Но я не вносил ясности в их значение, поэтому считаю нужным уделить им немного времени.
Одним из этапов создания пространства является его закрепление за 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 — удалить зашифрованные данные.
Применение
Возможных вариантов использования пространств много. В основном они используются для увеличения производительности, резервирования и применяются в СХД, однако есть и более приземленные варианты использования.
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.
Полезные источники
- SSD: устройство, компоненты и принципы работы
- A Quick Tour of NVM Express
- NVMe 1.4 Specification
- NVMe Namespaces
- Base NVM Express — Part One
- NVMe Command Line Interface (NVMe-CLI)
- NVMe Over Fabrics
- Также по теме
Amin ‘s Blog
Постоянные читатели моего блога наверняка могли заметить, что я могу быть довольно консервативен в плане апгрейдов компьютерного железа, а сменить систему почти 10-и летней давности меня смогла сподвигнуть только сдохшая видеокарта.
Аналогичный подход я практиковал и к накопителям, используя долгое время классические жёсткие диски (с блинами и двигателем). SSD, конечно, очень радовали характеристиками, но у меня были сомнения насчёт их надёжности в силу ограниченности ресурса перезаписи.
Однако собрав множество отзывов и статистики, в том числе на работе, и посмотрев на гарантийные сроки, я решил два года назад купить небольшой, но шустрый SSD чисто под систему и некоторые профили тяжелых приложений.
Прошло два года, и опыт использования SSD оказался очень и очень позитивным.
Впрочем, накопитель M6e использует внутренний SATA-3 интерфейс, виден как /dev/sdd, да и его скоростные показатели хоть и позитивны — 770 Мб/сек чтение + 96K IOPS, но всё же ещё не самое «вау» из того, что есть, хотя для комфортного использования операционки более чем хватает.
Мне же захотелось устранить одно из последних узких мест в домашнем компе — скорость чтения/записи на диск для домашнего каталога. Ну, чтобы тестовые стенды с тяжёлыми виртуальными машинами и всякие красивые игрушки запускались существенно быстрее, да и меньше выжигали мои нервные клетки долгим запуском.
Но поскольку длинные PCI-E порты у меня кончились, я решил заюзать M.2 порт, раз уж он у меня появился после апгрейда платформы.
После чтения мануалов и средней длительности поединка с собственной жабой нашел такой девайс, как PLEXTOR PX-1TM8PeG.
Видится он уже как NVMe, а не как SATA. Поскольку у плекстора есть свой контроллер, и в отличие от M6e, тут нет эмуляции SATA, то схема устройств на системе будет такая:
/dev/nvme0 - контроллер NVMe /dev/nvme0n1 - SSD-накопитель на NVMe /dev/nvme0n1p1 - 1-й раздел на SSD-накопителе
Тут /dev/nvme0n1 — обычное блочное устройство, разделы создаём на нём с помощью привычных утилит fdisk, gparted или подобных.
Перенос данных прост, как мычание — создаём раздел, подключаем, копируем все нужные каталоги, правим fstab, ребутимся, прогоняем restorecon -R /home.
smartctl
Работает также, как и с обычными дисками, показывает местный SSD-шный SMART
# smartctl -a /dev/nvme0 smartctl 6.5 2016-05-07 r4318 [x86_64-linux-4.13.11-100.fc25.x86_64] (local build) Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org === START OF INFORMATION SECTION === Model Number: PLEXTOR PX-1TM8PeG Serial Number: P0xxx Firmware Version: 1.04 PCI Vendor ID: 0x14a4 PCI Vendor Subsystem ID: 0x1b4b IEEE OUI Identifier: 0x002303 Total NVM Capacity: 1 024 209 543 168 [1,02 TB] Unallocated NVM Capacity: 0 Controller ID: 1 Number of Namespaces: 1 Namespace 1 Size/Capacity: 1 024 209 543 168 [1,02 TB] Namespace 1 Utilization: 0 Namespace 1 Formatted LBA Size: 512 Local Time is: Sat Nov 11 23:25:28 2017 MSK Firmware Updates (0x14): 2 Slots, no Reset required Optional Admin Commands (0x001f): Security Format Frmw_DL NS_Mngmt *Other* Optional NVM Commands (0x001f): Comp Wr_Unc DS_Mngmt Wr_Zero Sav/Sel_Feat Maximum Data Transfer Size: 32 Pages Warning Comp. Temp. Threshold: 85 Celsius Critical Comp. Temp. Threshold: 95 Celsius .
Все смарт-атрибуты цитировать смысла нет.
hdparm
А вот эта тулза с NVMe не работает, это не ATA!
Писать будет что-то такое:
# hdparm /dev/nvme0 /dev/nvme0: HDIO_DRIVE_CMD(identify) failed: Inappropriate ioctl for device BLKROGET failed: Inappropriate ioctl for device BLKRAGET failed: Inappropriate ioctl for device BLKGETSIZE failed: Inappropriate ioctl for device # hdparm /dev/nvme0n1 /dev/nvme0n1: HDIO_DRIVE_CMD(identify) failed: Inappropriate ioctl for device readonly = 0 (off) readahead = 256 (on) geometry = 976762/64/32, sectors = 2000409264, start = 0
Так что оставим hdparm для дисков c интерфейсами IDE/SATA/SAS/SCSI.
nvme-cli
Для мониторинга и управления NVMe-устройствами в федоре есть пакет nvme-cli. Ставим его. ВАЖНО! Многие команды там опасны и потенциально деструктивны, внимательно читаем маны и хелпы ( nvme —help ) !
Список наших NVMe:
# nvme list Node SN Model Namespace Usage Format FW Rev ---- -- ----- --------- ----- ------ -- --- /dev/nvme0n1 P0xxx PLEXTOR PX-1TM8PeG 1 0,00B/1,02TB 512B+0B 1.04
Смарт-лог читаем и понятен:
# nvme smart-log /dev/nvme0 Smart Log for NVME device:nvme0 namespace-id:ffffffff critical_warning : 0 temperature : 44 C available_spare : 100% available_spare_threshold : 0% percentage_used : 0% data_units_read : 136 692 data_units_written : 382 341 host_read_commands : 766 300 host_write_commands : 1 557 905 controller_busy_time : 61 power_cycles : 1 power_on_hours : 1 unsafe_shutdowns : 1 media_errors : 0 num_err_log_entries : 0 Warning Temperature Time : 0 Critical Composite Temperature Time : 0 Temperature Sensor 1 : 44 C Temperature Sensor 2 : 0 C Temperature Sensor 3 : 0 C Temperature Sensor 4 : 0 C Temperature Sensor 5 : 0 C Temperature Sensor 6 : 0 C Temperature Sensor 7 : 0 C Temperature Sensor 8 : 0 C
Лог ошибок пуст:
# nvme error-log /dev/nvme0 Error Log Entries for device:nvme0 entries:64 . Entry[ 0] . error_count : 0 sqid : 0 cmdid : 0 status_field : 0(SUCCESS) parm_err_loc : 0 lba : 0 nsid : 0 vs : 0 .
В принципе, если за 5 лет гарантии что и навернётся — бэкапы наше всё.
Бенч.
Заявленные 240K IOPS и 2500 Мб/сек на чтение + 1400 Мб/сек на запись в пике — это ОЧЕНЬ зверство, а из устройств, способных принять такие потоки данных, у меня мало чего есть, да и настолько жирных файлов немного. Тут надо понимать, что маркетологи любят указывать максимальные значения, достижимые лишь в каких-то особых условиях на особо хитрых тестах, а конкретно на вашей машине и с вашей задачей результаты могут отличаться, иногда весьма сильно от максимума. Вот и проверим.
1). Копирование в tmpfs миднайт-коммандером:
2). Первое копирование крупного файла с помощью dd в /dev/null/, чтобы не завязываться на работу механизмов tmpfs, но без параметра bs (размер блока). Для этого в одной вкладке приготовимся запустить вот такую команду:
$ dd if=./MicroWin7.vmdk of=/dev/null
А в соседней вкладке быстро выполним в процессе этого копирования
$ ps axfu | grep ‘ dd ‘
$ kill -USR1
Это позволит получить от dd данные о текущей скорости. Вуаля:
$ dd if=./MicroWin7.vmdk of=/dev/null
30219922+0 записей получено
30219921+0 записей отправлено
15472599552 байт (15 GB, 14 GiB) скопирован, 10,6856 s, 1,4 GB/s
51956736+0 записей получено
51956736+0 записей отправлено
26601848832 байт (27 GB, 25 GiB) скопирован, 18,3505 s, 1,4 GB/s
3). Попробуем другой файл, но укажем зверский размер блока:
$ dd if=./Fedora\ 26\ x64-disk001.vmdk of=/dev/null bs=4G
0+4 записей получено
0+4 записей отправлено
7416250368 байт (7,4 GB, 6,9 GiB) скопирован, 4,77266 s, 1,6 GB/s
4). Повторим ранее читавшийся файл + укажем опцию читать крупным блоком, выполним пару раз:
$ dd if=./MicroWin7.vmdk of=/dev/null bs=4G
0+11 записей получено
0+11 записей отправлено
23622275072 байт (24 GB, 22 GiB) скопирован, 9,64067 s, 2,5 GB/s
$ dd if=./MicroWin7.vmdk of=/dev/null bs=4G
0+13 записей получено
0+13 записей отправлено
26601848832 байт (27 GB, 25 GiB) скопирован, 3,9037 s, 6,8 GB/s
Кэш он такой, да.
5). Ну и финальный тест — одновременный запуск 18 виртуалок. На обычном диске — это выстрел в голову и ощутимо тупящая несколько минут система, насилующая жесткий диск со страшным скрежетом, пока все виртуалки не стартанут =)
На NVMe SSD это плавный одновременный старт всех ВМ и уже через 10-15 секунд почти все они будут полностью загруженные, и это с учётом POST-процедур самого виртуалбокса и таймаутов! Очень позитивно. ВМ у меня не самые злые в плане аппетитов на оперативку, там много всяких мелких линуксов, в 10 Гб оперативки влезло.
Гамы тоже стартовать начинают очень бодренько, IOPS-ы рулят.
Не знаю, как насчёт 2500, но 1400-1600 при чтении есть стабильно в любых вариантах. 2500 видимо достигаются только в каких-то хитрых условиях, при использовании оптимизированных драйверов (у меня девайс запустился на встроенных модулях ядра nvme_core / nvme из 4.13, возможно, в текущем ядре этот модуль недостаточно оптимизирован и это пофиксят в будущем) или при использовании особой маркетингово-синтетической магии. Буду рад, если кто разъяснит.
А вот на запись никаких странностей нет — файл из tmpfs пишется примерно с той скоростью, какая указана в характеристиках.
Всем приятных апгрейдов.
Реанимация NVMe диска в Linux
Имеется сервер с операционной системой Oracle Linux. В сервере два NVME диска Samsung, которые объединены в зеркальный RAID1 массив.
Один из NVMe дисков на сервере перестал работать. Диск пропал из ОС и из RAID, но после перезагрузки стал виден. Посмотреть информацию об NVMe дисках можно с помощью утилиты nvme из пакета nvme-cli:
yum install nvme-cli или apt install nvme-cli nvme list -o json
Информация о диске выводится, это уже хорошо, значит, контроллер диска ещё работает. Но все партиции пропали, диск недоступен для записи.
При попытке считать SMART лог получаем ошибку:
nvme smart-log /dev/nvme0n1
NVME Status:NS_NOT_READY: The namespace is not ready to be accessed as a result of a condition other than a condition that is reported as an Asymmetric Namespace Access condition
Понятно, что при обращении к namespace диска произошла какая-то ошибка. При этом SMART лог второго такого же диска прекрасно читается:
nvme smart-log /dev/nvme1n1
Пробую получить информацию о namespace проблемного диска:
nvme id-ns /dev/nvme0n1
Информация выводится корректно. Получается, что контроллер диска работает, namespace есть, но почему-то не работает. Попробуем отформатировать NVMe диск. Речь идёт не о форматировании файловой системы, а о форматировании пространства (namespace).
nvme format [--namespace-id= | -n ] [--lbaf= | -l ] [--ses= | -s ] [--pil= | -p ] [--pi= | -i ] [--ms= | -m ] [--reset | -r ] [--timeout= | -t ]
Форматирую пространство с параметрами по умолчанию:
nvme format /dev/nvme0n1
Success formatting namespace:1
Снова пробую считать SMART лог проблемного диска:
nvme smart-log /dev/nvme0n1
Теперь лог читается. Диск успешно реанимирован, правда, он пуст.
Нужно заново создать раздел и добавить его в RAID1 массив как SPARE диск. RAID массив начнёт восстанавливаться.
Через 1031 минуту целостность массива была восстановлена. Оба NVMe диска в строю.
P.S. Размышления.
Если вы видите NVMe диск в Linux как /dev/nvme0n1, то это уже кое о чём говорит. Первая часть названия диска «nvme0. » это нулевой контроллер, вторая часть названия «. n1» это первый namespace. Так что уже из названия диска было понятно, что контроллер жив и пространство существует. Можно было сходу форматнуть.
Использование инструментов командной строки NVMe для проверки работоспособности флэш-памяти NVMe
Использование инструментов командной строки NVMe для проверки работоспособности флэш-памяти NVMe
В этом сообщении блога я рассмотрю типы информации о состоянии флэш-памяти NVMe, которую вы можете получить с помощью инструментов командной строки NVMe.
Проверить работоспособность диска SATA очень просто. Будь то твердотельный накопитель или более старый вращающийся накопитель, вы можете использовать команду smartctl, чтобы получить обширную информацию о производительности и состоянии устройства. В качестве примера:
root@blinky:/var/lib/mysql# smartctl -A /dev/sda smartctl 6.5 2016-01-24 r4214 [x86_64-linux-4.4.0-62-generic] (local build) Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org === START OF READ SMART DATA SECTION === SMART Attributes Data Structure revision number: 16 Vendor Specific SMART Attributes with Thresholds: ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE 1 Raw_Read_Error_Rate 0x002f 100 100 000 Pre-fail Always - 0 5 Reallocated_Sector_Ct 0x0032 100 100 010 Old_age Always - 0 9 Power_On_Hours 0x0032 100 100 000 Old_age Always - 41 12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 2 171 Unknown_Attribute 0x0032 100 100 000 Old_age Always - 0 172 Unknown_Attribute 0x0032 100 100 000 Old_age Always - 0 173 Unknown_Attribute 0x0032 100 100 000 Old_age Always - 1 174 Unknown_Attribute 0x0032 100 100 000 Old_age Always - 0 183 Runtime_Bad_Block 0x0032 100 100 000 Old_age Always - 0 184 End-to-End_Error 0x0032 100 100 000 Old_age Always - 0 187 Reported_Uncorrect 0x0032 100 100 000 Old_age Always - 0 194 Temperature_Celsius 0x0022 065 059 000 Old_age Always - 35 (Min/Max 21/41) 196 Reallocated_Event_Count 0x0032 100 100 000 Old_age Always - 0 197 Current_Pending_Sector 0x0032 100 100 000 Old_age Always - 0 198 Offline_Uncorrectable 0x0030 100 100 000 Old_age Offline - 0 199 UDMA_CRC_Error_Count 0x0032 100 100 000 Old_age Always - 0 202 Unknown_SSD_Attribute 0x0030 100 100 001 Old_age Offline - 0 206 Unknown_SSD_Attribute 0x000e 100 100 000 Old_age Always - 0 246 Unknown_Attribute 0x0032 100 100 000 Old_age Always - 145599393 247 Unknown_Attribute 0x0032 100 100 000 Old_age Always - 4550280 248 Unknown_Attribute 0x0032 100 100 000 Old_age Always - 582524 180 Unused_Rsvd_Blk_Cnt_Tot 0x0033 000 000 000 Pre-fail Always - 1260 210 Unknown_Attribute 0x0032 100 100 000 Old_age Always - 0
Хотя smartctl может не знать всех интеллектуальных значений, зависящих от поставщика, обычно вы можете Google модель диска вместе с «интеллектуальными атрибутами» и найти такие документы, как this , чтобы получить дополнительные сведения.
Проверка работоспособности флэш-памяти NVMe
Если вы перейдете на флеш-хранилище нового поколения на базе NVMe, smartctl больше не будет работать — по крайней мере, он не будет работать для пакетов, доступных для Ubuntu 16.04 (то, что я использую). Похоже, скоро появится поддержка NVMe в Smartmontools , и было бы здорово получить единый инструмент, поддерживающий как SATA, так и NVMe флеш-хранилище.
А пока вы можете использовать инструмент nvme , доступный в пакете nvme-cli. Он предоставляет некоторую базовую информацию для устройств NVMe.
Чтобы получить информацию об установленных устройствах NVMe:
root@alex:~# nvme list Node SN Model Version Namespace Usage Format FW Rev ---------------- -------------------- ---------------------------------------- -------- --------- -------------------------- ---------------- -------- /dev/nvme0n1 S3EVNCAHB01861F Samsung SSD 960 PRO 1TB 1.2 1 689.63 GB / 1.02 TB 512 B + 0 B 1B6QCXP7
Чтобы получить информацию SMART:
root@alex:~# nvme smart-log /dev/nvme0 Smart Log for NVME device:nvme0 namespace-id:ffffffff critical_warning : 0 temperature : 34 C available_spare : 100% available_spare_threshold : 10% percentage_used : 0% data_units_read : 3,465,389 data_units_written : 9,014,689 host_read_commands : 89,719,366 host_write_commands : 134,671,295 controller_busy_time : 310 power_cycles : 11 power_on_hours : 21 unsafe_shutdowns : 8 media_errors : 0 num_err_log_entries : 1 Warning Temperature Time : 0 Critical Composite Temperature Time : 0 Temperature Sensor 1 : 34 C Temperature Sensor 2 : 47 C Temperature Sensor 3 : 0 C Temperature Sensor 4 : 0 C Temperature Sensor 5 : 0 C Temperature Sensor 6 : 0 C
Для получения дополнительной информации SMART (не все устройства ее поддерживают):
root@ts140i:/home/pz/workloads/1m# nvme smart-log-add /dev/nvme0 Additional Smart Log for NVME device:nvme0 namespace-id:ffffffff key normalized raw program_fail_count : 100% 0 erase_fail_count : 100% 0 wear_leveling : 62% min: 1114, max: 1161, avg: 1134 end_to_end_error_detection_count: 100% 0 crc_error_count : 100% 0 timed_workload_media_wear : 100% 37.941% timed_workload_host_reads : 100% 51% timed_workload_timer : 100% 446008 min thermal_throttle_status : 100% 0%, cnt: 0 retry_buffer_overflow_count : 100% 0 pll_lock_loss_count : 100% 0 nand_bytes_written : 100% sectors: 16185227 host_bytes_written : 100% sectors: 6405605
Часть этой информации говорит сама за себя, а часть — нет. Посмотрев документ спецификации NVMe, я прочитал некоторые данные:
Доступные запасные части . Содержит нормализованный процент (от 0 до 100%) оставшейся доступной свободной емкости.
Доступный запасной порог . Когда доступная резервная мощность падает ниже порога, указанного в этом поле, может произойти асинхронное завершение события. Значение указывается в виде нормализованного процента (от 0 до 100%). (Примечание: я не совсем уверен, в чем практический смысл «асинхронного завершения события», но похоже, что этого следует избегать!)
Используемый процент . Содержит определенную поставщиком оценку процента срока службы подсистемы NVM, основанную на фактическом использовании и прогнозах производителя относительно срока службы NVM. (Примечание: число может быть больше 100%, если вы используете хранилище дольше запланированного срока.)
Считанные единицы данных / Записанные единицы данных . Это количество 512-байтовых блоков данных, которые читаются / записываются, но измеряется необычным способом. Первое значение соответствует 1000 из 512-байтовых блоков. Таким образом, вы можете умножить это значение на 512000, чтобы получить значение в байтах. Он не включает доступ к метаданным.
Команды чтения / записи хоста . Количество выданных команд соответствующего типа. Используя это значение, а также значение ниже, вы можете вычислить средний размер ввода-вывода для «физических» операций чтения и записи..
Время загрузки контроллера . Время в минутах, когда контроллер был занят обслуживанием команд. Это можно использовать для измерения долгосрочных тенденций загрузки хранилища..
Небезопасные выключения. Сколько раз произошло отключение питания без отправки уведомления об отключении. В зависимости от используемого устройства NVMe небезопасное завершение работы может привести к повреждению пользовательских данных..
Время предупреждения о температуре / Время критической температуры . Время в минутах, когда устройство сработало при превышении допустимой или критической температуры. Должны быть нули.
Wear_Leveling . Это показывает, сколько из расчетного срока службы ячейки было использовано, а также минимальное / максимальное / среднее количество записей для разных ячеек. В этом случае, похоже, что ячейки рассчитаны на 1800 операций записи, и в среднем было использовано около 1100
Изнашивание носителя при временной нагрузке . Носитель изнашивается текущей «рабочей нагрузкой». Это устройство позволяет измерять некоторую статистику с момента их сброса (так называемая «рабочая нагрузка») в дополнение к отображению значений срока службы устройства..
Узел синхронизированной рабочей нагрузки читает . Процент операций ввода-вывода, которые были прочитаны (с момента сброса таймера рабочей нагрузки).
Состояние теплового дросселя . Это показывает, было ли дросселирование устройства из-за перегрева, и когда в прошлом были события дросселирования..
Записано байтов NAND. Байты, записанные в ячейки NAND. Для этого устройства единица измерения отображается в значениях 32 МБ. Для других устройств может быть иначе.
Записано байтов хоста . Байты, записанные в хранилище NVMe из системы. Это устройство также имеет размер 32 МБ. Масштаб этих значений не очень важен, поскольку они наиболее полезны для определения увеличения записи вашей рабочей нагрузки. Это соотношение измеряется при записи в NAND и записи в HOST. В этом примере коэффициент усиления записи (WAF) равен 16185227/6405605 = 2,53 .
Как видите, инструменты командной строки NVMe предоставляют много полезной информации для понимания состояния и производительности устройств NVMe. Вам не нужно использовать инструменты, зависящие от поставщика (например, isdct).