- Solid state drive/NVMe
- Contents
- Installation
- Management
- SMART
- Secure erase
- Firmware update
- Generic
- Intel
- Kingston
- Performance
- Sector size
- Discards
- Airflow
- Testing
- Power Saving (APST)
- Troubleshooting
- Controller failure due to broken APST support
- Устранение проблем с твердотельным накопителем NVME в Linux
- Установить Windows… зачем?
- Отчет об ошибке, ура!
- Решение
- Использование NVME SSD как системного накопителя на компьютерах со старым BIOS и ОС Linux
- Как делать
- Оценка скорости и стоимости
- Замеченные недостатки
- Заключение
- SPDK: ускорение работы с NVMe-дисками
- Зачем нужен NVMe-драйвер, работающий в пользовательском пространстве Linux?
- Предварительные требования и сборка SPDK
- ▍Сборка DPDK (для Linux)
- ▍Сборка SPDK (для Linux)
- ▍Настройка системы перед запуском SPDK-приложения
- Приложение-пример «Hello World»
- ▍Настройка
- ▍Чтение/запись данных
- Другие примеры, включённые в SPDK
- Выводы
Solid state drive/NVMe
NVM Express (NVMe) is a specification for accessing SSDs attached through the PCI Express bus. As a logical device interface, NVM Express has been designed from the ground up, capitalizing on the low latency and parallelism of PCI Express SSDs, and mirroring the parallelism of contemporary CPUs, platforms and applications.
Contents
Installation
The Linux NVMe driver is natively included in the kernel since version 3.3. NVMe devices should show up under /dev/nvme* .
Extra userspace NVMe tools can be found in nvme-cli or nvme-cli-git AUR .
See Solid State Drives for supported filesystems, maximizing performance, minimizing disk reads/writes, etc.
Management
List all the NVMe SSDs attached with name, serial number, size, LBA format and serial:
List information about a drive and features it supports in a human-friendly way:
List information about a namespace and features it supports:
Output the NVMe error log page:
Delete a namespace:
Create a new namespace, e.g creating a smaller size namespace to overprovision an SSD for improved endurance, performance, and latency:
See nvme help and nvme(1) for a list of all commands along with a terse description.
SMART
Output the NVMe SMART log page for health status, temp, endurance, and more:
NVMe support was added to smartmontools in version 6.5 (available since May 2016 in the official repositories).
Currently implemented features (as taken from the wiki):
- Basic information about controller name, firmware, capacity ( smartctl -i )
- Controller and namespace capabilities ( smartctl -c )
- SMART overall-health self-assessment test result and warnings ( smartctl -H )
- NVMe SMART attributes ( smartctl -A )
- NVMe error log ( smartctl -l error[,NUM] )
- Ability to fetch any nvme log ( smartctl -l nvmelog,N,SIZE )
- The smartd daemon tracks health ( -H ), error count ( -l error ) and temperature ( -W DIFF,INFO,CRIT )
See S.M.A.R.T. and the official wiki entry for more information, and see this article for contextual information about the output.
Secure erase
Firmware update
Generic
Firmware can be managed using nvme-cli . To display available slots and check whether Slot 1 is read only:
Download and commit firmware to specified slot. In the example below, firmware is first committed without activation ( -a 0 ). Next, an existing image is activated ( -a 2 ). Refer to the NVMe specification for details on firmware commit action values.
Finally reset the controller to load the new firmware
Intel
«The Intel® Memory and Storage Tool (Intel® MAS) is a drive management tool for Intel® SSDs and Intel® Optane™ Memory devices, supported on Windows*, Linux*, and ESXi*. [. ] Use this tool to manage PCIe*-/NVMe*- and SATA-based Client and Datacenter Intel® SSD devices and update to the latest firmware.»[2]
Install intel-mas-cli-tool AUR and check whether your drive has an update available:
If so, execute the load command as follows:
Kingston
Kingston does not provide separate firmware downloads on their website, instead referring users to a Windows only utility. Firmware files appear to use a predictable naming scheme based on the firmware revision:
Performance
Sector size
Discards
Discards are disabled by default on typical setups that use ext4 and LVM, but other file systems might need discards to be disabled explicitly.
Intel, as one device manufacturer, recommends not to enable discards at the file system level, but suggests the periodic TRIM method, or apply fstrim manually.[3]
Airflow
NVMe SSDs are known to be affected by high operating temperatures and will throttle performance over certain thresholds.[4]
Testing
Raw device performance tests can be run with hdparm :
Power Saving (APST)
To check NVMe power states, install nvme-cli or nvme-cli-git AUR , and run nvme get-feature /dev/nvme4 -f 0x0c -H :
When APST is enabled the output should contain «Autonomous Power State Transition Enable (APSTE): Enabled» and there should be non-zero entries in the table below indicating the idle time before transitioning into each of the available states.
If APST is enabled but no non-zero states appear in the table, the latencies might be too high for any states to be enabled by default. The output of nvme id-ctrl /dev/nvme6 (as the root user) should show the available non-operational power states of the NVME controller. If the total latency of any state (enlat + xlat) is greater than 25000 (25ms) you must pass a value at least that high as parameter default_ps_max_latency_us for the nvme_core kernel module. This should enable APST and make the table in nvme get-feature (as the root user) show the entries.
Troubleshooting
Controller failure due to broken APST support
Some NVMe devices may exhibit issues related to power saving (APST). This is a known issue for Kingston A2000 [5] as of firmware S5Z42105 and has previously been reported on Samsung NVMe drives (Linux v4.10) [6][7]
A failure renders the device unusable until system reset, with kernel logs similar to:
As a workaround, add the kernel parameter nvme_core.default_ps_max_latency_us=0 to completely disable APST, or set a custom threshold to disable specific states.
This article or section is out of date.
Источник
Устранение проблем с твердотельным накопителем NVME в Linux
Главное меню » Linux » Устранение проблем с твердотельным накопителем NVME в Linux
Установить Windows… зачем?
Да, мы тестировали его в Windows 10, и у меня не было проблем с зависанием ОС. Конечно, мы могли бы просто использовать Windows и покончить с этим, но поскольку здесь мы этого не делаем, мне пришлось найти решение этой проблемы, и поэтому начались исследования.
Отчет об ошибке, ура!
Мы нашли этот отчет об ошибке и прочитал кое-что из того, что писали люди, похоже, что это не будет исправлено из-за неоднозначной реакции людей. К счастью, после тестирования некоторых опций GRUB я нашел тот, который работал отлично. Все, что мне нужно было сделать, это добавить строку GRUB_CMDLINE_LINUX и перезагрузить конфигурацию GRUB. Все!
Решение
Откройте терминал и найдите свой файл GRUB, обычно это так /etc/default/grub, но проверьте документацию вашего дистрибутива. Откройте его в текстовом редакторе с правами суперпользователя. Мы будем использовать для этого vim …
Затем в этой части просто добавьте приведенный ниже код в GRUB_CMDLINE_LINUX = “” в его конец.
После того, как вы это сделаете, он должен выглядеть примерно так, не копируйте то, что есть у нас, поскольку ваша система будет отличаться.
Сохраните и выйдите из текстового редактора, затем выполните следующую команду
Если вы хотите проверить, сработала ли команда, вы можете запустить следующую команду, и ожидаемый результат должен быть подобный этому:
Надеюсь, это решит ваши проблемы с NVME.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник
Использование NVME SSD как системного накопителя на компьютерах со старым BIOS и ОС Linux
При соответствующей настройке можно загружаться с накопителя NVME SSD даже на старых системах. Предполагается, что операционная система (ОС) умеет работать с NVME SSD. Рассматриваю именно загрузку ОС, поскольку при имеющихся в ОС драйверах NVME SSD виден в ОС после загрузки и может использоваться. Дополнительного программного обеспечения (ПО) для линукса не требуется. Для ОС семейства BSD и прочих юниксов способ скорее всего тоже подойдёт.
Для загрузки с какого-либо накопителя нужно, чтобы в программе первоначальной загрузки (ППЗ), в BIOS или EFI (UEFI) содержались драйвера для данного устройства. Накопители NVME SSD есть достаточно новые устройства по сравнению с BIOS, и в ППЗ прошивок старых материнских плат таких драйверов нет. В EFI без поддержки NVME SSD можно добавить соответствующий код, и тогда становится возможна полноценная работа с этим устройством — можно установить операционную систему и загрузить её. Для старых систем с т. н. «legacy BIOS» загрузкой ОС так сделать вряд ли получится. Однако это можно обойти.
Как делать
Я использовал openSUSE Leap 15.1. Для других линуксов действия будет примерно те же.
1. Подготовим компьютер для установки операционной системы.
Нужен ПК или сервер со свободным разъёмом PCI-E 4x или более длинным, неважно какой версии, хватит и PCI-E 1.0. Конечно, чем новее версия PCI-E, тем выше будет скорость. Ну и, собственно, NVME SSD с переходником M.2 — PCI-E 4x.
Также нужен какой-либо накопитель с ёмкостью 300 МБ и более, который виден из биоса и с которого можно грузить ОС. Это может быть НЖМД с подключением по IDE, SATA, SCSI. SAS. Или USB флэшка, или карта памяти. На дискету — не влезет. Диск CD-ROM не подойдёт, потребуется перезапись. DVD-RAM — без понятия. Условно назовём эту штуку «legacy BIOS накопитель».
2. Загружаем линукс для установки (с оптического диска или загрузочной флэшки или др.).
3. При размечивании диска распределим ОС по имеющимся накопителям:
3.1. Создадим раздел для загрузчика GRUB в начале «legacy BIOS накопителя» размером 8 МБ. Отмечу, что здесь используется особенность openSUSE — GRUB на отдельном разделе. Для openSUSE по умолчанию используется файловая система (ФС) BTRFS. Если разместить GRUB на разделе с ФС BTRFS, то система не загрузится. Поэтому используется отдельный раздел. Можете разместить GRUB в другом месте, лишь бы грузился.
3.2. После раздела с GRUB создадим раздел с частью системной папки («корня»), а именно с «/boot/», размером 300 МБ.
3.3. Оставшееся добро — остаток системной папки, раздел для свопа, раздел пользователя «/home/» (если таковой вы решили создать) можно разместить на NVME SSD.
После установки система грузит GRUB, который грузит файлы из /boot/, после чего NVME SSD становится доступным, затем идёт загрузка системы с NVME SSD.
На практике я получил существенное ускорение.
Требования по ёмкости «legacy BIOS накопителя»: 8 МБ для раздела GRUB — это по умолчанию, и где-то от 200 МБ для /boot/. 300 МБ я взял с запасом. При обновлении ядра (и при установке новых) линукс будет пополнять раздел /boot/ новыми файлами, при удалении ненужных более ядер — освобождать место. Оставшееся место на «legacy BIOS накопителе» за пределами этих двух разделов можно использовать по своему усмотрению.
Оценка скорости и стоимости
Стоимость NVME SSD 128 ГБ — примерно от 2000 р.
Стоимость переходника M.2 — PCI-E 4x — примерно от 500 р.
Также есть в продаже переходники M.2 — PCI-E 16x на четыре накопителя NVME SSD, ценой где-то от 3000 р. — если это кому надо.
Предельные скорости:
PCI-E 3.0 4x около 3900 МБ/с
PCI-E 2.0 4x 2000 МБ/с
PCI-E 1.0 4x 1000 МБ/с
Накопители с PCI-E 3.0 4x на практике достигают скорости около 3500 МБ/с.
Можно предположить, что достижимая скорость будет такой:
PCI-E 3.0 4x около 3500 МБ/с
PCI-E 2.0 4x около 1800 МБ/с
PCI-E 1.0 4x около 900 МБ/с
Что быстрее, чем SATA 600 МБ/с. Достижимая скорость для SATA 600 МБ/с — около 550 МБ/с.
При этом на старых материнских платах скорость SATA набортного контроллера может быть не 600 МБ/с, а 300 МБ/с или 150 МБ/с. Здесь набортный контроллер = контроллер SATA, встроенный в южный мост чипсета.
Отмечу, что для NVME SSD будет работать NCQ, а у старых набортных контроллеров этого может и не быть.
Я делал расчёты для PCI-E 4x, однако некоторые накопители имеют шину PCI-E 2x. Этого хватает для PCI-E 3.0, но для более старых стандартов PCI-E — 2.0 и 1.0 — такие NVME SSD лучше не брать. Также накопитель с буфером в виде чипа памяти будет быстрее, чем без оного.
Для желающих полностью отказаться от набортного контроллера SATA посоветую использовать контроллер Asmedia ASM 106x (1061 и др.), который предоставляет два порта SATA 600 (внутренних или внешних). Он работает весьма хорошо (после обновления прошивки), в режиме AHCI поддерживает NCQ. Подключается по шине PCI-E 2.0 1x.
Его предельная скорость:
PCI-E 2.0 1x 500 МБ/с
PCI-E 1.0 1x 250 МБ/с
Достижимая скорость будет такой:
PCI-E 2.0 1x 460 МБ/с
PCI-E 1.0 1x 250 МБ/с
Этого хватит на один SATA SSD или два НЖМД.
Замеченные недостатки
1. Не считываются параметры SMART с NVME SSD, есть только общие данные по производителю, серийному номеру и т.д. Возможно, из-за слишком старой материнской платы (мп). Для своих бесчеловечных опытов я использовал самую старую мп, которую смог найти, с чипсетом nForce4.
2. TRIM должен работать, но это надо проверять.
Заключение
Есть ещё другие возможности: купить контроллер SAS с разъёмом PCI-E 4x или 8х (бывают ли 16х или 32х?). Однако они если дешёвые, то поддерживают SAS 600, но SATA только 300, а дорогие будут дороже и медленнее предложенного выше способа.
Для использования с M$ Windows можно установить дополнительное ПО — загрузчик со встроенными драйверами для NVME SSD.
Предлагаю читателю самому оценить, нужно ли ему такое применение NVME SSD, или лучше будет купить новую материнскую плату (+ процессор + память) с имеющимся разъёмом M.2 PCI-E и поддержкой загрузки с NVME SSD в EFI.
Источник
SPDK: ускорение работы с NVMe-дисками
SPDK (Storage Performance Developer Kit) – это набор инструментов и библиотек с открытым исходным кодом, которые призваны содействовать разработке высокопроизводительных масштабируемых приложений, ориентированных на взаимодействие с дисковыми накопителями. В этом материале мы сосредоточимся на имеющемся в SPDK NVMe-драйвере, работающем в пользовательском пространстве Linux, а также рассмотрим реализацию приложения-примера «Hello World» на платформе Intel.
В наших экспериментах задействован сервер на чипсете Intel C610 (степпинг C1, системная шина QPI, 9.6 ГТ/с) с двумя сокетами, в котором установлены 12-ядерные процессоры Intel Xeon E5-2697 (тактовая частота – 2.7 ГГц, 24 логических ядра в режиме HT). Конфигурация ОЗУ – 8×8 Гб (Samsung M393B1G73BH0 DDR3 1866). В системе имеется твердотельный накопитель Intel SSD DC P3700 Series. В качестве ОС использована CentOS 7.2.1511 (ядро 3.10.0).
Зачем нужен NVMe-драйвер, работающий в пользовательском пространстве Linux?
Исторически сложилось так, что дисковые накопители на порядки медленнее других компонентов компьютерных систем, таких, как оперативная память и процессор. Это означает, что операционная система и процессор вынуждены взаимодействовать с дисками, используя механизм прерываний. Например, сеанс подобного взаимодействия может выглядеть так:
- Выполняется запрос к ОС на чтение данных с диска.
- Драйвер обрабатывает этот запрос и связывается с аппаратным обеспечением.
- Пластина диска раскручивается.
- Головка чтения-записи перемещается к нужному участку пластины, готовясь начать считывать данные.
- Данные считываются и записываются в буфер.
- Генерируется прерывание, которое уведомляет процессор о том, что данные готовы к использованию в системе.
- И, наконец, производится чтение данных из буфера.
Модель прерываний создаёт дополнительную нагрузку на систему. Однако обычно эта нагрузка была значительно меньше, чем задержки, характерные для обычных жёстких дисков. В результате на эту дополнительную нагрузку не обращали особого внимания, так как она не могла заметно снизить эффективность работы подсистем хранения данных.
В наши дни SSD-диски и технологии следующего поколения, например, хранилища 3D XPoint, работают значительно быстрее традиционных HDD. В результате узкое место подсистем хранения данных, которым раньше являлось аппаратное обеспечение, переместилось в сферу программных механизмов. Теперь, как можно видеть на нижеприведённом рисунке, задержки, которые вносят в процесс работы с накопителями прерывания и операционная система, в сравнении со скоростью отклика накопителей, выглядят весьма значительными.
SSD-накопители и системы хранения данных на базе технологии 3D XPoint работают значительно быстрее чем традиционные HDD. В результате теперь узким местом подсистем хранения данных стало ПО
Драйвер NVMe, который работает в пользовательском пространстве Linux, решает «проблему прерываний». Вместо ожидания сообщения о завершении операции, он опрашивает устройство хранения данных в ходе чтения или записи. Кроме того, и это очень важно, драйвер NVMe работает внутри пользовательского пространства. Это значит, что приложения могут напрямую взаимодействовать с NVMe-устройством, минуя ядро Linux. Одно из преимуществ такого подхода – избавление от системных вызовов, требующих переключения контекста. Это приводит к дополнительной нагрузке на систему. Архитектура NVMe не предусматривает блокировок, это направлено на то, чтобы не использовать механизмы процессора для синхронизации данных между потоками. Тот же подход предусматривает и параллельное исполнение команд ввода-вывода.
Сравнивая NVMe-драйвер пользовательского пространства из SPDK с подходом, предусматривающим использование ядра Linux, можно обнаружить, что при использовании NVMe-драйвера задержки, вызванные дополнительной нагрузкой на систему, снижаются примерно в 10 раз.
Задержки, в наносекундах, вызываемые при использовании для работы с накопителями механизмов ядра Linux и SPDK
SPDK может, используя одно ядро процессора, обслуживать 8 твердотельных накопителей NVMe, что даёт более 3.5 миллиона IOPs.
Изменение производительности операций ввода-вывода при работе с разным количеством SSD-накопителей с помощью механизмов уровня ядра Linux и SPDK
Предварительные требования и сборка SPDK
SPDK поддерживает работу в таких ОС, как Fedora, CentOS, Ubuntu, Debian, FreeBSD. Полный список пакетов, необходимых для работы SPDK, можно найти здесь.
Прежде чем собирать SPDK, необходимо установить DPDK (Data Plane Development Kit), так как SPDK полагается на возможности по управлению памятью и по работе с очередями, которые уже есть в DPDK. DPDK – зрелая библиотека, которую обычно используют для обработки сетевых пакетов. Она отлично оптимизирована для управления памятью и быстрой работы с очередями данных.
Исходный код SPDK можно клонировать из GitHub-репозитория такой командой:
▍Сборка DPDK (для Linux)
▍Сборка SPDK (для Linux)
После того, как собранный DPDK находится в папке SPDK, нам нужно вернуться к этой директории и собрать SPDK, передав make путь к DPDK.
▍Настройка системы перед запуском SPDK-приложения
Нижеприведённая команда позволяет включить использование больших страниц памяти (hugepages) и отвязать от драйверов ядра любые NVMe и I/OAT-устройства.
Использование больших страниц важно для производительности, так как они имеют размер 2 Мб. Это гораздо больше, чем стандартные страницы по 4 Кб. Благодаря увеличенному размеру страниц памяти уменьшается вероятность промаха в буфере ассоциативной трансляции (Translate Lookaside Buffer, TLB). TLB – это компонент внутри процессора, который отвечает за трансляцию виртуальных адресов в физические адреса памяти. Таким образом, работа со страницами большого размера ведёт к более эффективному использованию TLB.
Приложение-пример «Hello World»
В SPDK включено множество примеров, имеется здесь и качественная документация. Всё это позволяет быстро начать работу. Мы рассмотрим пример, в котором фразу «Hello World» сначала сохраняют на NVMe-устройстве, а потом считывают обратно в буфер.
Прежде чем заняться кодом, стоит поговорить о том, как структурированы NVMe-устройства и привести пример того, как NVMe-драйвер будет использовать эти сведения для обнаружения устройств, записи данных и затем их чтения.
NVMe-устройство (называемое так же NVMe-контроллером) структурировано исходя из следующих соображений:
- В системе может присутствовать одно или несколько NVMe-устройств.
- Каждое NVMe-устройство состоит из некоторого количества пространств имён (оно может быть только одно в данном случае).
- Каждое пространство имён состоит из некоторого количества адресов логических блоков (Logical Block Addresses, LBA).
Теперь приступим к нашему пошаговому примеру.
▍Настройка
- Инициализируем слой абстракции окружения DPDK (Environment Abstraction Layer, EAL). В коде, приведённом ниже, -c – это битовая маска, которая служит для выбора ядер, на которых будет исполняться код. –n – это ID ядра, а —proc-type – это директория, где будет смонтирована файловая система hugetlbfs.
Создадим пул буфера запроса, который используется внутри SPDK для хранения данных каждого запроса ввода-вывода.
Проверим систему на наличие NVMe-устройств.
Перечислим NVMe-устройства, возвращая SPDK логическое значение, указывающее на то, нужно ли присоединить устройство.
Устройство присоединено. Теперь можно запросить данные о количестве пространств имён.
Перечислим пространства имён для того, чтобы получить сведения о них, например, такие как размер.
Создадим пару очередей (queue pair) ввода вывода для отправки пространству имён запроса на чтение/запись.
▍Чтение/запись данных
- Выделим буфер для данных, которые будут прочитаны/записаны.
Скопируем строку «Hello World» в буфер.
Отправим запрос на запись заданному пространству имён, предоставив пару очередей, указатель на буфер, индекс LBA, функцию обратного вызова, которая сработает после записи данных, и указатель на данные, которые должны быть переданы функции обратного вызова.
Функция обратного вызова, после завершения процесса записи, будет вызвана синхронно.
Отправим запрос на чтение заданному пространству имён, предоставив тот же набор служебных данных, который использовался для запроса на запись.
Функция обратного вызова, после завершения процесса чтения, будет вызвана синхронно.
Проверим флаг, который, который указывает на завершение операций чтения и записи. Если запрос всё ещё обрабатывается, мы можем проверить состояние заданной пары очередей. Хотя реальные операции чтения и записи данных выполняются асинхронно, функция spdk_nvme_qpair_process_completions проверяет ход работы и возвращает число завершённых запросов ввода-вывода, и, кроме того, вызывает функции обратного вызова, сигнализирующие о завершении процедур чтения и записи, описанные выше.
Освободим пару очередей и другие ресурсы перед выходом.
Вот полный код разобранного здесь примера, размещённый на GitHub. На сайте spdk.io можно найти документацию по API SPDK NVMe.
После запуска нашего «Hello World» должно быть выведено следующее:
Результаты работы примера «Hello World»
Другие примеры, включённые в SPDK
В SPDK включено множество примеров, которые призваны помочь программистам быстро разобраться с тем, как работает SPDK и начать разработку собственных проектов.
Вот, например, результаты работы примера perf, который тестирует производительность NVMe-диска.
Пример perf, тестирующий производительность NVMe-дисков
Разработчики, которым требуется доступ к сведениям о NVMe-дисках, таким, как функциональные возможности, атрибуты административного набора команд, атрибуты набора команд NVMe, данные об управлении питанием, сведения о техническом состоянии устройства, могут воспользоваться примером identify.
Пример identify, выводящий сведения о NVMe-диске
Выводы
Мы рассказали о том, как использовать SPDK и драйвер, работающий в пользовательском пространстве Linux, для работы с NVMe-дисками. Такой подход позволяет свести к минимуму дополнительные задержки, вызываемые применением механизмов ядра для доступа к устройствам хранения данных, что позволяет повысить скорость передачи данных между накопителем и системой.
Если вас интересует разработка высокопроизводительных приложений, работающих с дисковыми накопителями с использованием SPDK, здесь можно подписаться на рассылку SPDK. А вот и вот — полезные видеоматериалы.
Источник