Primary nvme idle timeout что это

Обновлено: 07.07.2024

Компьютер для звука, мой вариант

Довёл до рабочего состояния свою старую задумку - х86 планшет с взрослой виндой.

Планшет потому что не потребляет много(и полностью бесшумен, не тих - бесшумен), выглядит красиво и тач скрин можно тыкать пальцами без мышей и клав, экран сразу в комплекте. Виндовс потому что уже есть драйвера и программы для всего, они работают, проверены и им есть доверие. Виндовс ещё и потому, что под винду есть софт для воспроизведения DVD-Audio, и с тач скрином всё весьма удобно запускать.
х86 даёт возможность запускать всякие спец линупсы. Volumio - удобно и красиво.

  • Отдельный порт зарядки, иначе вся аудиофилия закончится вместе с акумулятором, как обычно в самый неудобный момент.
  • Поддержка карт памяти большого объёма.
  • Нормальный внешний вид.
  • Популярность. Сейчас есть кучи странных нонейм поделий "оттуда", смотрите 4pda, знать что там не так - обязательно. Маразм дошёл до того что бывают настройки биоса которые окирпичивают девайс.
  • Нормальный проц. Атомы на 4ядра уже давно не редкость. А у солидных машин там полноценные Core i3-5 и даже 7!
  • ОЗУ. От 2Гб. Что конечно абсурд, но иначе на виндовсе никак. Систему нужно кормить.


Состоятельные парни, с проводами ванденхуль, возьмут себе Surface. Там и полноценные пни, и много Гб ОЗУ. Или иных трансформеров именитых брендов, благо их очень много.
А я ухватил prestigio visconte v. Который отличился скромным ценником, 2мя полноценными USB-A прямо на корпусе, и отдельным micro-USB для зарядки. И выглядит нормально. Идеально!

Планшет с музыкой на флешке удобно таскать с собой на митинги местных ячеек секты огалтелой аудиофилии. Тут сразу никаких сомнений в источнике.

В виду микроскопического энергопотребления можно придаться аудиофилии и приделать девайсу линейный БП(хотя родной импульсник у меня в комплекте был хороший). Можно угореть ещё и поставить линейные стабы даже внутрю, но это я пока не пробовал.

Offтопик:
андроед и юсб аудио плеер про увы не оправдали доверия - постоянные щелчки при работе на любое USB устройство. Также сложно найти планшет с дыркой зарядки(зарядка акума напрямую смущают ОСь), но тут есть подвижки, появляются много моделей с USB-C

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


Удалим всё что не нужно выделенной аудио машине - автоапдейты, "защитника" и прочие отвлекающие и нагружающие задачи. Тут нам поможет MSMG ToolKit. Произведем захват текущего состояния системы в установочный образ и последующие его редактирование.

Как удалять защитника

Offтопик:
Конечно, можно поставить embeded и обработать его конгфиг десигнером.

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

Потом запускаем автоматическое обновление, и пусть оно ставит всё. В последний раз.

Удаляем руками всё лишние с винта. Все временные папки что винда наделал в корне, всякие $WINDOWS.


Ставим всё нужное, плееры, драйверы и т.п.

Подключаем к системе внешний хард с NTFS или флешку с exFat.


Скачиваем с сайта микрософт ISO образ нашей редакции винды под нашу разрядность. Это удобно делать с помощью их тулзы Media Creator, там просто выбираем "скачать изо" по нашей текущей редакции.


Теперь, нажимаем кнопку перезагрузки с зажатой на клавиатуре клавишей Shift.

Скрытый текст


В консоль пишем

Где D: это буква подключенного носителя.


Полученные файлы тащим на нормальный контупер с вменяемым процом. Там будем редактировать и создавать флешку для установки.

Скачиваем MSMG ToolKit, ему в папку "DVD" распаковывем iso нашей редакции скачанный ранее.

В папке DVD\sources удаляем install.esd, на его место кладем созданный нами install.wim

Теперь можно запускать тулзу, маунтить и резать.

Сначала, 1-1, монтирование boot и recovery отвечаем N.

Потом 4 и там отрываемся от всей души, я удалил просто всё. Но оно отрежет и интернет эксплорер, некоторые программы могут перестать запускаться. Можно ограничиться дефендером.

После цифровой резни делаем пункт 6.

Теперь у нас есть готовый образ. Можно тулзой преобразовать всю эту кучу файлов в ISO(смотрите чтобы install.wim был не более 4Гб или конвертируйте его в esd, тулкит это умеет), а можно и просто кинуть на флешку и грузиться через UEFI файлы.


Грузимся с получвишегося установочного образа, ставимся. После установки всё будет такимже как на момент захвата, даже пользователи сохраняются.


Теперь можно пройтись по задачам шедулера, я удалил опять всё. Зашёл в папку system32\tasks и там всё почикал.


Далее удаляем сервисы, запускаем консоль с правами админа. Пишем

выдаст всё запущено сейчас.

Ну и помаленьку удаляем, я удалил windows update, search, prefetch и прочее.

Пример удаления апдейта

После всех манипуляций свободен гиг ОЗУ. Проц свободен всегда и полностью. Никаких фоновых задач во время "простоя системы", с точки зрения системы, когда я слушаю музыки.


В данной статье мы рассмотрим некоторые нюансы подсистемы ввода-вывода и их влияние на производительность.

Пару недель назад я столкнулся с вопросом, почему NVMe на одном сервере медленнее, чем SATA на другом. Посмотрел в характеристики серверов и понял, что это был вопрос с подвохом: NVMe был из пользовательского сегмента, а SSD — из серверного.

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

Что такое fsync и где он используется

Для ускорения работы с накопителями данные буферизируются, то есть сохраняются в энергозависимой памяти до тех пор, пока не представится удобный случай для сохранения содержимого буфера на накопитель. Критерии «удобного случая» определяются операционной системой и характеристиками накопителя. В случае исчезновения питания все данные в буфере будут утеряны.

Существует ряд задач, в которых необходимо быть уверенным, что изменения в файле записаны на накопитель, а не лежат в промежуточном буфере. Эту уверенность можно получить при использовании POSIX-совместимого системного вызова fsync. Вызов fsync инициирует принудительную запись из буфера на накопитель.

Продемонстрируем влияние буферов искусственным примером в виде короткой программы на языке C.


Комментарии хорошо объясняют последовательность действий в программе. Текст «ответ на главный вопрос жизни, Вселенной и всего такого» будет буферизирован операционной системой, и если перезагрузить сервер нажатием на кнопку Reset во время «вычислений», то файл окажется пуст. В нашем примере потеря текста не является проблемой, поэтому fsync не нужен. Базы данных такого оптимизма не разделяют.

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

На что влияет частое использование fsync

При обычном вводе-выводе операционная система старается оптимизировать общение с дисками, так как в иерархии памяти внешние накопители самые медленные. Поэтому операционная система старается за одно обращение к накопителю записать как можно больше данных.

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

  • Intel® DC SSD S4500 480 GB, подключен по SATA 3.2, 6 Гбит/с;
  • Samsung 970 EVO Plus 500GB, подключен по PCIe 3.0 x4,


Результаты тестов представлены в таблице.

Тест Intel® S4500 Samsung 970 EVO+
Чтение без fsync, МиБ/с 5734.89 9028.86
Запись без fsync, МиБ/с 3823.26 6019.24
Чтение с fsync, МиБ/с 37.76 3.27
Запись с fsync, МиБ/с 25.17 2.18

Нетрудно заметить, что NVMe из клиентского сегмента уверенно лидирует, когда операционная система сама решает, как работать с дисками, и проигрывает, когда используется fsync. Отсюда возникает два вопроса:

  1. Почему в тесте без fsync скорость чтения превышает физическую пропускную способность канала?
  2. Почему SSD из серверного сегмента лучше обрабатывает большое количество запросов fsync?

Если ставить под сомнение все результаты sysbench, то можно воспользоваться fio.

Тест Intel® S4500 Samsung 970 EVO+
Чтение без fsync, МиБ/с 45.5 178
Запись без fsync, МиБ/с 30.4 119
Чтение с fsync, МиБ/с 32.6 20.9
Запись с fsync, МиБ/с 21.7 13.9

Тенденция к просадке производительности у NVMe при использовании fsync хорошо заметна. Можно переходить к ответу на второй вопрос.

Оптимизация или блеф

Ранее мы говорили, что данные хранятся в буфере, но не уточняли в каком именно, так как это было не принципиально. Мы и сейчас не будем углубляться в тонкости операционных систем и выделим два общих вида буферов:

Так как SSD показывает лучшие результаты, то можно сделать два предположения:

  • диск спроектирован под нагрузку подобного плана;
  • диск «блефует» и игнорирует команду.

Данный скрипт требует две физические машины — «сервер» и «клиент». Клиент записывает на тестируемый диск небольшой объем данных, вызывает fsync и отправляет серверу информацию о том, что было записано.


После запуска скрипта необходимо обесточить «клиента» и не возвращать питание в течение нескольких минут. Важно именно отключить тестируемого от электричества, а не просто выполнить жесткое выключение. По прошествии некоторого времени сервер можно подключать и загружать в ОС. После загрузки ОС необходимо снова запустить diskchecker.pl, но с аргументом verify.


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

Наш S4500 не показал ошибок при потере питания, то есть можно утверждать, что он готов к нагрузкам с большим количеством вызовов fsync.

Заключение

При выборе дисков или целых готовых конфигураций следует помнить о специфике задач, которые необходимо решить. На первый взгляд кажется очевидным, что NVMe, то есть SSD с PCIe-интерфейсом, быстрее «классического» SATA SSD. Однако, как мы поняли сегодня, в специфических условиях и с определенными задачами это может быть не так.

А как вы тестируете комплектующие cерверов при аренде у IaaS-провайдера?
Ждем вас в комментариях.

Выбор режима работы SATA (IDE, AHCI, RAID), NVMe

Идеальная сборка — это когда каждый компонент системы работает со 100% отдачей. Казалось бы, такая тривиальная задача, как подключение жесткого диска к материнской плате не должна вызвать особых затруднений. Подключаем HDD к соответствующему разъему, и, вуаля — в системе есть место для развертывания операционки и хранения файлов. Но не все так просто!

Чтобы познать дзен сборки и получить оптимальную по определенным параметрам (быстродействие, надежность и т. д.) систему, нужно обладать определенным пониманием логики работы современных протоколов и алгоритмов передачи данных, знанием режимов работы контроллера HDD на материнке и умениями в области их практического использования.

BIOS и UEFI — разница есть!

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

BIOS-ом называют управляющую программу, «зашитую» в чип материнской платы. Именно она отвечает за слаженную работу всех подключенных к материнке устройств.

Начиная с 2012–2013 годов, большинство материнских плат снабжается UEFI — усовершенствованной управляющей программой, наделенной графическим интерфейсом и поддерживающей работу с мышью. Но, что называется «по старинке», оба варианта, на бытовом уровне, называют BIOS.

Даже неискушенному пользователю понятно, что причиной столь радикальной смены курса при создании UEFI стало не желание производителей «приблизить» интерфейс к конечному пользователю ПК, сделать его более удобным и понятным, а более веские причины.

Таким весомым аргументом стало ограничение на возможность работы с накопителями большого объема в изначальной версии BIOS. Дело в том, что объем диска ограничен значением, приблизительно равным 2,1 ТБ. Взять эту планку без кардинальных изменений управляющего софта было невозможно. К тому же БИОС работает в 16-битном режиме, используя при этом всего 1 МБ памяти, что в комплексе приводит к существенному замедлению процесса опроса (POST-опрос) устройств и началу загрузки из MBR области с установленной «осью».

UEFI лишена вышеперечисленных недостатков. Во-первых, расчетный теоретический порог объема дисковой подсистемы составляет 9,4 ЗБ (1 зеттабайт = 10 21 байт), а во-вторых, для загрузки операционки используется стандарт размещения таблиц разделов (GPT), что существенно ускоряет загрузку операционной системы.

Разметка жестких дисков

Как говорилось ранее, у стандартов BIOS и UEFI — различный подход к разметке области жесткого диска. В BIOS используется так называемая главная загрузочная запись (MBR), которая четко указывает считывающей головке HDD сектор, с которого нужно начать загрузку ОС.

В UEFI это реализовано иначе. В этом стандарте используется информация о физическом расположении таблиц разделов на поверхности HDD.

Как это работает?

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


Для понимания — при использовании MBR, информация о загрузочной области находится только в начале диска, в строго определенном секторе и никак не дублируется, поэтому, при ее повреждении, загрузить операционную систему с такого диска будет невозможно. Систему придется устанавливать заново.

Еще одно существенное отличие — при использовании «старого» BIOS и MBR на диске можно максимально создать четыре логических раздела. В случае необходимости создания их большего количества придется доставать свой шаманский бубен и прибегнуть к определенным действиям на грани магии и «химии». По сути, предстоит проделать трюк с одним из основных разделов. Сначала преобразовать его в расширенный, а затем создать внутри него нужное количество дополнительных разделов. В случае использования стандарта GPT все это становится неактуальным, поскольку изначально в ОС Windows, при использовании новой философии разметки HDD, пользователю доступно создание 128 логических разделов.

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

Оптимальный вариант — иметь в ПК два физических диска. SSD объемом 120–240 ГБ под систему и быстрые игрушки и HDD под документы и файлы мультимедиа необходимого объема.

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

Режимы работы SATA

Покончив с необходимым теоретическим минимумом, следует определиться с выбором режима работы контроллера HDD материнской платы и сферами их применения.


  • IDE — самый простой и безнадежно устаревший вариант, использование которого было актуально лет n-цать назад. Представляет собой эмуляцию работы жесткого диска PATA. Режим находит применение при работе с устаревшим оборудованием или программным обеспечением, требующим устаревших операционных систем. Современные SSD в таком режиме работать не будут!

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

  • AHCI — режим работы современного накопителя, предоставляющий расширенный функционал и дополнительные «плюшки». В первую очередь — возможность «горячей» замены жестких дисков. Для домашнего ПК или офисной машины — это не очень актуально, а вот в случае с серверным оборудованием, такая возможность поможет сэкономить много времени и нервов системного администратора. Во-вторых, наличие реализованного алгоритма аппаратной установки очередности команд (NCQ), существенно ускоряющей работу накопителя и производительность системы в целом. Это достигается за счет грамотного и оптимального алгоритма движения считывающей головки по блину классического HDD или более эффективного использования ячеек памяти в случае SSD накопителя.


  • RAID — возможность организации совместной работы нескольких накопителей в едином дисковом массиве. В зависимости от задач, можно объединить диски в систему повышенной надежности (RAID 1) информация в которой будет дублироваться на каждый из дисков массива, или высокопроизводительную систему (RAID 0 или RAID 5), когда части одного файла одновременно записываются на разные диски, существенно сокращая при этом время обращения к дисковому массиву.
  • NVMe — абсолютно новый стандарт, специально разработанный под SSD-накопители. Поскольку твердотельные диски уже «выросли» из протокола передачи данных SATA-III, и берут новые вершины в передаче данных по интерфейсу PCI-E, обеспечивая при этом наивысшую скорость выполнения операций чтения/записи. При этом по скорости превосходят своих SSD-собратьев, работающих в режиме AHCI, практически вдвое.

К выбору режима работы накопителя следует отнестись ответственно. Выбрать его нужно перед началом установки операционной системы! В противном случае, при его смене на уже установленной операционке, очень велика вероятность получения экрана смерти (BSOD) и отказа ПК работать.


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

Мега-руководство по Non-Volatile Memory Express или NVMe

24 Сентября 2021

NVM Express или NVMe (от англ. Non-Volatile Memory Express) — это спецификация протокола обмена данными через линии PCI Express. Данная технология создана для твердотельных накопителей и ориентирована на достижение максимальной масштабируемости и производительности в последующем. В данной статье мы подробно расскажем про протокол и приведем примеры как использовать NVMe в Linux.

История

Если у вас был компьютер в 90-тых, вы помните что жесткий диск был подключен к материнской плате через широкий кабель (обычно это 40 или 80 контактный разъём) Parallel АТА (он же РАТА). Этот стандарт был основан на стандартах IDE (Integrated Drive Electronics) и АТА (АТ приложение, AT сокращение от Advanced Technology из поколения IBM PC / AT). Через несколько лет для поддержки устройств таких как CD-ROM на том же интерфейсе, был разработан стандарт ATAPI (ATA Packet Interface) вместе с ATA. Стандарт ATA развивался, включая в себя Enhanced IDE (EIDE), Ultra DMA (UDMA) и Ultra ATA в последующие годы.

После 2000 года, был разработан интерфейс Serial ATA (SATA), который и заменил PATA. SATA использует меньший кабель (только 7-ми контактный разъём) и обеспечивает более высокую скорость передачи данных. Так же был разработан режим AHCI для подключения накопителей SATA.

Форм-фактор vs Интерфейс vs Протокол

Давайте разберемся что есть что, перед тем как читать статью далее.

Форм-фактор означает форму и размер устройства. Общие характеристики форм-фактора для устройств хранения:

  • Диск 2,5 или 3,5 дюйма (определен в стандартах SFF)
  • M.2 и PCI Express (определены стандартами PCI-SIG)

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

  • Интерфейс SATA, использует жесткие диски 2,5 и 3,5 дюйма, а также подключенные устройства M.2.
  • Интерфейс PCI Express, используется подключенными устройствами M.2 и устройствами PCIe.
  • Интерфейсы SAS (Serial Attached SCSI) и FC (Fibre Channel), используются исключительно на серверах и дата центрах.

PCI намного быстрее чем SATA. Максимальная скорость SATA III - 6 ГБ/с в то время как M.2 коннектор использует 4 PCIe v3 линии, имеющие максимальную скорость, почти 4Гб/с = 32 Гб/с.

Протокол определяет, как управлять и обмениваться данными с устройством. Общие характиристики протокола:

  • AHCI и ATA для интерфейса SATA. AHCI - это протокол для поддержки дополнительных функций SATA на контроллере.
  • NVMe для интерфейса PCI Express.

Для лучшего понимания нам нужно сделать явное различие между контроллером и запоминающим устройством. На самом деле данные хранятся на устройстве хранения, однако программное обеспечение не взаимодействует с устройством хранения напрямую. Оно взаимодействует с контроллером. Таким образом, в случае SATA устройство хранения может использовать команды ATA, но контроллер используется с AHCI. В случае PCIe, NVMe определяет и то, и другое.

Возможные и распространенные комбинации:

  • Жесткие диски 2.5 или 3.5 подключенные к SATA порту, использование SATA интерфейса и обращение к AHCI/ATA. Это традиционные вращающиеся / магнитные жесткие диски.
  • 2,5-дюймовый SSD (твердотельный накопитель), подключенный к порту SATA с использованием AHCI / ATA, как жесткий диск.
  • M.2 SSD, подключенный к порту M.2, использует интерфейс SATA и взаимодействует с AHCI / ATA.
  • M.2 SSD, подключенный к порту M.2 через интерфейс PCIe и взаимодействующий с NVMe.
  • Устройство PCIe SSD, подключенный к слоту PCIe использует интерфейс PCIe и взаимодействует с NVMe.

NVM Express или откуда он вообще взялся

Интерфейс NVMe разработан, потому что стандарт AHCI и ATA / ATAPI предназначался для традиционных вращающихся / магнитных жестких дисков, которые по своей природе медленные из-за своей физической конструкции по сравнению с устройствами с энергонезависимой памятью (NVM) и с SSD (твердотельный накопитель).

Основное преимущество NVMe перед AHCI / ATA заключается в том, что у NVMe гораздо больше очередей команд (макс. 64 тыс команд) по сравнению с одной в AHCI. А это значит, что возможен параллельный / одновременный ввод-вывод. Также каждая очередь команд может быть очень глубокой (макс. 64 тыс команд) по сравнению с AHCI (только 32).

Таким образом, с несколькими ядрами CPU, когда у вас есть устройство AHCI / ATA, каждое ядро отправляет команды ATA (например, чтение / запись) в одну очередь, и при отправке команд требуется синхронизация и блокировка. С NVMe каждое ядро может иметь свою собственную очередь, и нет необходимости в синхронизации при отправке команд.

На самом деле в NVMe есть два типа очередей: одна для отправки, а другая для завершения. Очереди отправки также могут совместно использовать одну и ту же очередь завершения, поэтому нет необходимости в соответствии 1:1. Очереди находятся в памяти, и каждая запись очереди отправки, команда, обычно имеет размер 64 байта. Завершенная команда идентифицируется по идентификатору очереди отправки и идентификатору команды при отправке.

Два типа команд в NVMe:

  • Команды администратора отправляются в очередь отправки и завершения администратора (из этой пары есть только одна с идентификатором = 0).
  • Команды ввода-вывода (называемые командами NVM) отправляются в очереди ввода-вывода и завершения. Очереди команд ввода-вывода должны управляться явно (создаваться / удаляться и т. д.).

* Резюмируем: команда Администратора или NVMe отправляется в очередь отправки как новая запись. NVMe контроллер читает команду оттуда, выполняет операцию и помещает запись в очередь завершения, таким образом хост/запросчик программного обеспечения понимает завершенную команду (или нет). Если данные читаются, они передаются напрямую в буфер данных, а не в очередь завершения. Очереди большие, но ограниченные по размеру и сформированы как круговые буферы.

NVМe имеет расширенные/корпоративные функции наподобие Multi-Path I/O и совместное использование Namespace. Поскольку они обычно не используются в компьютерах, мы не будем рассказывать о них.

Из спецификации NVMe:

Namespace это «Количество энергонезависимой памяти, которое может быть отформатировано в логические блоки. При форматировании пространство имен размера n представляет собой набор логических блоков с адресами логических блоков от 0 до (n-1) ».

Подытожим теорию

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

Для управления NVMe, команды администратора отправляются в административную очередь отправки Аdmin Submission Queue (ASQ) и результат собирается из ASQ.

Одно и более Namespaces создается и форматируется перед использованием SSD. Это выполняется операционной системой, которую вы используете. Создается минимум одна пара ввода/вывода Command Submission и Completion Queue. Опять же это выполняется операционной системой. Для выполнения ввода/вывода операций, таких как чтение и запись на SSD, операционная система отправляет команды ввода/вывода NVM в очередь (очереди) ввода/вывода и собирает результаты из очередей завершения ввода-вывода.

Теперь рассмотрим некоторые детали в примерах.

NVMе в примерах

Для этой статьи мы используем Samsung M.2 с NVMe SSD (MZVPV512HDGL - SSD SM951 M.2 512 GB PCIe 3.0) и инструменты nvme-cli. Nvme-cli предоставляется дистрибьюторами Linux, но мы рекомендуем взять его с Github, так как там самая последняя версия.

Во-первых, давайте посмотрим есть ли у нас контроллеры NVMe на шине PCI

Есть ли устройства nvme?

Видим одно символьное устройство (nvme0) и четыре блочных устройства

Как вы догадались, nvme0n1 - это диск, другие - это разделы.

Еще один способ узнать, есть ли у нас контроллеры NVMe:

Это формируется из sysfs (например, /sys/class/nvme/)

Давайте отправим команду определение администратора (Identify Admin) на контроллер NVMe. Это возвращает 4096 байт данных, поэтому вывод будет длинным. (-H разрешает битовые поля, делает его удобным для человека)

Некоторые поля являются необязательными и обозначаются как 0. Значения некоторых полей:

  • vid - это идентификатор поставщика PCI (в данном случае Samsung), 0x144d, как в выводе lspci.
  • ssvid - это идентификатор поставщика подсистемы PCI.
  • SN - серийный номер, MN - номер модели, FR - версия прошивки.
  • cmic - это возможности многопутевого ввода-вывода контроллера и совместного использования пространства имен.
  • mdts - это максимальный размер передаваемых данных. Он указывается как степень двойки и в единицах минимального размера страницы памяти. Здесь mdts = 5, поэтому 2⁵ = 32. Мы увидим минимальный размер страницы памяти (MPSMIN) как 4К ниже. Таким образом, MDTS составляет 32 * 4K = 128K.
  • oacs - это необязательная поддержка административных команд.
  • tnvmcap - это общая емкость NVM, и это необязательное поле. Поскольку он отображается как ноль, он не поддерживается.
  • sqes - это (максимальный и обязательный) размер записи очереди передачи (SQE). Ожидается, что он будет 64, но с помощью проприетарных расширений его можно изменить. Здесь значение 0x66.
  • cqes - это (максимальный и обязательный) размер записи очереди завершения (CQE). Подобно вычислению размера SQE, здесь его значение равно 0x44, поэтому максимальный и требуемый размер записи очереди завершения составляет 2⁴ = 16 байт.
  • nn - (максимальное) количество пространств имен, поддерживаемых контроллером. Хотя теоретический максимум высок, здесь он равен 1, поэтому возможно только одно пространство имен.
  • oncs - это дополнительная поддержка команд NVM.

Теперь давайте посмотрим если у нас есть какие нибудь namespace отправив команду Identify List Namespaces:

Есть одно пространство имен с идентификатором 0x1.

Рассмотрим детальнее это пространство имен:

Некоторые поля являются необязательными, как и в разделе «Идентифицировать вывод контроллера».

Значение некоторых команд:

  • nsze, Размер пространства имен (NSZE). Указывает количество логических блоков, 0x3b9e12b0 = 1000215216. Мы можем проверить это, запустив lsblk -b и увидев размер диска как 512110190592, а размер блока равен 512Б, так что это равно NSZE * 512.
  • ncap, Емкость пространства имен (NCAP). Максимальное количество логических блоков, выделенных пространству имен. Если есть тонкое предоставление (если дисковое пространство выделяется по запросу), это значение может быть меньше NSZE. Здесь это не так, поэтому его значение такое же, как NSZE.
  • nuse, использование пространства имен (NUSE). Текущее количество логических блоков, выделенных пространству имен. Если есть тонкое предоставление (если дисковое пространство выделяется по запросу), это значение может быть меньше NSZE. Здесь это не так, поэтому его значение такое же, как NSZE.
  • nsfeat, Возможности пространства имен (NSFEAT).
  • nlbaf, Количество форматов LBA (NLBAF). Указывает количество поддерживаемых комбинаций размера данных LBA и размера метаданных, поддерживаемых пространством имен. Это значение отсчитывается от нуля, и его значение здесь равно 0, поэтому поддерживается только 1 формат.
  • flbas, форматированный размер LBA (FLBAS). Указывает комбинацию размера данных LBA и размера метаданных, с которой было отформатировано это пространство имен. Первые 3 бита = 0 - это индекс, поэтому он отформатирован в формате 0, а бит 4 = 0, что указывает на то, что метаданные для команды передаются отдельно.
  • nguid, глобальный уникальный идентификатор пространства имен (NGUID) и eui64, расширенный уникальный идентификатор IEEE (EUI64) назначаются, когда пространство имен создается и сохраняется во всех операциях пространства имен и контроллера (например, сброс, форматирование).
  • lbaf 0 - это формат LBA 0.

Заполнение LBA формата

  • ms, размер метаданных (Metadata). Поскольку его значение равно 0, метаданные не поддерживаются.
  • ds, размер данных LBA (LBADS). Он выражается в степени двойки, поэтому размер данных LBA составляет 2⁹ = 512 байт.
  • rp, Относительное исполнение (Relevant Performans). Указывает относительную производительность этого формата по сравнению с другими форматами. Значение 0 указывает, что это лучшая производительность. Здесь нет особого смысла, потому что у нас поддерживается только один формат LBA.

Команды администратора NVMe

Команды администратора NVMe с кодами операций:

  • Create and Delete I/O Submission Queue - Создание и удаление очереди отправки ввода-вывода (01ч, 00ч)
  • Get Log Page - Получить страницу журнала (02ч)
  • Create and Delete I/O Completion Queue - Создание и удаление очереди завершения ввода-вывода (05ч, 04ч)
  • Identify - Команда идентификации (контроллера или пространства имен) (06ч)
  • Abort - Прервать (08ч)
  • Get and Set Features - Получить и установить функции (0Ah, 09ч)
  • Asynchronous Event Request - Асинхронный запрос события (0Ch)
  • Namespace Management - Управление пространством имен (0Dh)
  • Firmware Commit and Image Download - Фиксация прошивки и загрузка образа (10ч, 11ч)
  • Device Self-test - Команда самопроверки устройства (14ч)
  • Namespace Attachment - Присоединение пространства имен (15ч)
  • Keep Alive - Поддерживать соединение (18ч)
  • Directive Send and Receive - Указание отправки и получения (19ч, 1Ah)
  • Virtualization Management - Управление виртуализацией (1ч)
  • NVMe-MI Send and Receive - Отправка и получение NVMe-MI (1Dh, 1Eh)
  • Doorbell Buffer Config - Получить доступ к дорбелл буферу (7Ch)
  • Format NVM - Форматирование пространства имен (80ч)
  • Security Send and Receive - поддержка команд протокола безопасности (81ч, 82ч)
  • Sanitize - Безопасная очистка данных (84ч)

Как мы видели из вывода id-ctrl, размер записи очереди отправки (SQE) составляет 64 байта. Что в этих 64-байтах?

  • Команда Dword 0 (CDW0), 4 байта: включает идентификатор команды (2 байта) и код операции (1 байт)
  • Идентификатор пространства имен (NSID), 4 байта. Если он не используется, его следует сбросить до нуля. Если он установлен в 0xFFFFFFFF, это заставляет команду примениться ко всем пространствам имен.
  • Следующие 8 байтов зарезервированы.
  • Указатель метаданных (MPTR), 8 байт.
  • Указатель данных (DPTR), 16 байт.
  • Команда Dword 10 (CDW10), 4 байта
  • Команда Dword 11 (CDW11), 4 байта
  • Команда Dword 12 (CDW12), 4 байта
  • Команда Dword 13 (CDW13), 4 байта
  • Команда Dword 14 (CDW14), 4 байта
  • Команда Dword 15 (CDW15), 4 байта

Теперь давайте напрямую отправим команду Идентифицировать (Identify). Для этого мы используем утилиту nvme admin-passthru.

Команда Identify имеет код операции 06h (— opcode=0x06). Он выводит 4096 байт, поэтому мы устанавливаем длину данных как таковую (- data-len = 4096) и указываем, что команда является командой чтения (-r). Мы не хотим отправлять команду сейчас, поэтому используем пробный запуск (-d), и хотим, чтобы команда была отправлена первой (-s).

Результатом является сводка командных полей. Указатель данных (DPTR) (адрес в выходных данных) устанавливается командой при выделении буферов данных.

NVM команды

Вот команды NVM с кодами операций:

  • Flush - Очистка кэша (00ч)
  • Write and Read - Запись и чтение (01ч, 02ч)
  • Write Uncorrectable - Сообщает о неисправимой ошибке (04ч)
  • Compare - Сравнить (05ч)
  • Write Zeroes - Команда используется для установки диапазона логических блоков в 0. (08ч)
  • Dataset Management - Команда используется хостом для указания атрибутов диапазонов логических блоков. (09ч)
  • Reservation Register and Report - Реестр резервирования, Отчет о резервировании (0Dh, 0Eh)
  • Reservation Acquire and Release - Получение резервирования и Релиз резервирования (11ч, 15ч)

Команды NVM должны отправляться только в том случае, если контроллер готов (на это указывает регистр состояния контроллера CSTS.RDY) и после того, как была создана очередь отправки и завершения ввода-вывода.

Значения некоторых из них:

  • Размер страницы памяти максимум CAP.MPSMAX = 128К и минимум CAP.MPSMIN = 4К
  • Timeout CAP.TO = 30000 мс, наихудшее время ожидания, пока CSTS.RDY меняет состояние с 0 на 1 и 1 на 0.
  • Максимальное количество поддерживаемых записей в очереди (CAP.MQES) = 16K. В каждой очереди отправки ввода/вывода может быть максимум 16К записей.
  • Version (VS) = 1.1, поддерживает контроллер версии спецификации NVMe. Последняя версия это 1.3 от 22.08.2017.
  • Размер страницы памяти (Memory Page Size) (CC.MPS) = 4K.
  • Выбранный набор команд ввода/вывода (CC.CSS) = набору команд NVM.
  • Ready (CSTS.RDY) = 1, контроллер готов принять отправку команд.
  • Размер очереди отправки и завершения администратором (ASQS и ACQS) = 256.

В последнем примере запустим команду чтения (Read) как с помощью помощника , так и в вручную. Мы прочитаем LBA 0 и сравним его с тем, что у нас есть с dd.

Во-первых, сделаем сброс LBA 0 в файл lba.0 с dd:

Во-вторых, прочитаем LBA 0 через утилиту nvme:

В-третьих, прочитаем LBA 0 отправив команду вручную через nvme io passthru:

Read - это код операции 0x02, мы отправляем команду в namespace 0x1, читаем 512 байт, кодовое слово 10 и 11 (cdw10 и cdw11) указывает начало чтения в блоках LBA, поэтому с 0 (оба равны 0), а биты 15:00 кодового слова 12 (cdw12) - это количество блоков для чтения (установлено в 0, чтобы указать, что будет прочитан 1 блок).

Читайте также: