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

Для многих из нас nvme означает, что мы купили новый компьютер или ультрабук. Жёсткий диск, подключённый напрямую к шине PCIE, позволяет существенно снизить задержки передачи данных и ускорить любую систему. NVME — это ключ к загрузке любой системы за 3 секунды.

Но, на самом деле сам по себе NVME — это не стандарт для жёстких дисков. NVME расшифровывается как NVM Express. NVM, в свою очередь, означает Non-volatile memory, И в первую очередь — это спецификация протокола, который позволяет производить эффективный доступ к данным, хранящимся в энергонезависимой памяти.

А как мы хорошо знаем, протоколы можно запускать на разных носителях. В этой статье мы будем издеваться над моим лэптопом с Ubuntu Linux 21 на борту, подключая его жёсткий диск к разным серверам. Вы можете посетовать, что всё это игрушки, но хороший администратор со свитчем, позволяющим поддерживать скорости более 10 гигабит в секунду, должен взять это на заметку. Вы можете получить удалённый доступ к вашим nvme жёстким дискам через tcp/ip без уловок и мошенства.

Поехали.

▍ Краткое введение


Итак, давайте начнём с небольшого погружения в инструкции. В этой публикации от 2013 года вы можете почитать о том, что такое протокол NVME, и узнать, зачем он создавался. Этот документ вполне реально прочитать. В нём всего пять страниц текста. Остальные мануалы на nvmexpress.org не настолько щадящие. Там вам придётся прорываться через 500 страничные талмуды. Так что можете окунуться, если вас не смущает английский язык.

Для тех, кому лень читать, вот основные идеи в этом протоколе:

  • Поддержка 64 тысяч очередей для ввода-вывода команд, где каждая очередь поддерживает до 64 тысяч инструкций.
  • Вся информация, необходимая для прочтения блока в 4 килобайте содержится в самой 64-х битной команде. Это означает, что случайное чтение маленьких блоков может происходить очень быстро.
  • Поддержка пространств имён.
  • Поддержка SR-IOV (Single Root I/O Virtualization) — технологии, которая позволяет виртуализировать устройства для ввода-вывода информации.

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

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

Посему начнём.

▍ Подготовка системы


Для начала вам нужно будет установить свежее ядро для вашего линукса. Debian 11 и Ubuntu 21.10 поддерживают nvme “из коробки”. Возможно, у вас возникнут проблемы, если вы работаете с CentOS.

Если вдруг у вас в руках Gentoo или вы заходите собрать ядро сами, то включите следующие флаги при сборке ядра:

CONFIG_NVME_TCP=m
CONFIG_NVME_TARGET_TCP=m

Далее, нам нужно будет установить nvme-cli для того, чтобы работать с самими дисками. По этой ссылке вы сможете раскопать более подробную инструкцию о том, как пользоваться этой программой. nvmexpress.org/open-source-nvme-management-utility-nvme-command-line-interface-nvme-cli

apt install nvme-cli

Теперь можно загружать модули ядра. Для клиента нам нужно будет подключать модуль nvme. На моём лаптопе он постоянно загружен, так как он работает с nvme. Для того чтобы “расшарить” nvme диск вам понадобятся два других модуля.

modprobe nvmet
modprobe nvmet-tcp

▍ Сетевой стек


nvmet означает nmve-transport. Это драйвер транспортного протокола. Драйвер существует для нескольких типов протоколов передачи информации. Loop для передачи данных на одном хосте и tcp и fabrics для сетевой передачи данных. Fabrics предназначен для работы с fibre channel системами и не является особо доступным для малого бизнеса. Но к счастью для нас, у нас в руках есть TCP.



Хочу оговориться, что на самом деле, сам протокол не использует TCP/IP сокеты для передачи данных. Посмотрите на знаменитую картинку, слитую с сайта Oracle. Если соединение будет происходить через стэк TCP/IP, то передача данных будет осуществляться контроллером напрямую. Фактически, порт, к которому вы будете подключать устройство, будет отдан на растерзание драйверу, и после установки соединения вам не нужно будет беспокоиться о том, что что-то может остановить 6 гигабит в секунду. Вы полностью обходите Socket API для передачи информации.

Хорошо, загрузили драйверы.

▍ Подсистемы (subsystems)


Идём дальше. Конфигурацию можно производить из nvme-cli или путём создания и изменения файлов в /sys/kernel/config/. Туда и отправимся.

Для начала нам нужно будет создать подсистему (subsystem). В документации подсистема описана как набор информации о том, какой контроллер, порт и пространства имён нужно использовать для установки соединения. (It's a set of all information of what controller, port, namespace and device to use for a connection).

Посему заходим в

cd /sys/kernel/config/nvmet/subsystems

И создаём там папку с названием нашей подсистемы. Название может быть произвольным, но учтите, что вам придётся его использовать как на клиенте, так и на сервере. Так что не нужно писать что-то очень сложное.

mkdir test

После захода в эту директорию мы можем осмотреться. На данном этапе нас интересует один фаил — attr_allow_any_host.

cat attr_allow_any_host
#0

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

echo -n 1 > attr_allow_any_host 

(Учтите, система очень придирчива к чтению конфигурации и ненужные /n могут натворить проблем. Поэтому придётся не забывать флаг -n во всех echo командах).

▍ Пространства имён (namespaces)


После этого забираемся в папку namespaces и начинаем создавать пространства имён.

mkdir 1

Это создаст пространство имён #1.

В отличие от подсистем, пространства имён называются по номерам. Заходим и осматриваемся

 ls -lah
total 0
-rw-r--r-- 1 root root 4.0K Jan  3 09:31 ana_grpid
-rw-r--r-- 1 root root 4.0K Jan  3 09:31 buffered_io
-rw-r--r-- 1 root root 4.0K Jan  3 09:31 device_nguid
-rw-r--r-- 1 root root 4.0K Jan  2 17:36 device_path
-rw-r--r-- 1 root root 4.0K Jan  3 09:31 device_uuid
-rw-r--r-- 1 root root 4.0K Jan  2 17:36 enable
--w------- 1 root root 4.0K Jan  3 09:31 revalidate_size

Здесь мы можем произвести определённые настройки конкретного пространства имён.

Давайте отвлечёмся на секунду и посмотрим на жёсткий диск на моём лаптопе.

ls /dev/nvme* -lah
crw------- 1 root root 238, 0 Jan  2 17:31 /dev/nvme0
brw-rw---- 1 root disk 259, 0 Jan  2 17:31 /dev/nvme0n1
brw-rw---- 1 root disk 259, 1 Jan  2 17:31 /dev/nvme0n1p1
brw-rw---- 1 root disk 259, 2 Jan  2 17:31 /dev/nvme0n1p2
brw-rw---- 1 root disk 259, 3 Jan  2 17:31 /dev/nvme0n1p3
brw-rw---- 1 root disk 259, 4 Jan  2 17:31 /dev/nvme0n1p4
brw-rw---- 1 root disk 259, 5 Jan  2 17:31 /dev/nvme0n1p5
brw-rw---- 1 root disk 259, 6 Jan  2 17:31 /dev/nvme0n1p6

Никогда не замечали, что в NVME диски называются совсем не так, как привычные нам block устройства, sda, sdb и так далее. Уж слишком много циферок в этих nvme.

Первая цифра означает номер устройства. Диска. Это как раз и есть subsystem.

Вторая цифра (n) это namespace, в данном случае, на моём лаптопе все диски идут под одним пространством имён.

Третья цифра (p) обозначает уже привычные нам partitions, разделы.

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

echo -n /dev/nvme0 > device_path

Теперь можно попробовать включить это пространство имён. Делаем

echo -n 1 > enabled

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

dmesg | grep nvmet

Там же вы можете прочитать настоящие сообщения об ошибках, если таковые имеются.

[  845.255544] nvmet: creating controller 1 for subsystem c413bb88-69e7-4d38-8d4c-081bce31ca47 for NQN nqn.2014-08.org.nvmexpress:uuid:d6d1a339-34d4-4ae0-be29-4375c2eeaf2c.
[  912.892151] nvmet: adding nsid 2 to subsystem c413bb88-69e7-4d38-8d4c-081bce31ca47
[  950.873917] nvmet: creating controller 1 for subsystem c413bb88-69e7-4d38-8d4c-081bce31ca47 for NQN nqn.2014-08.org.nvmexpress:uuid:d6d1a339-34d4-4ae0-be29-4375c2eeaf2c.
[ 1323.410291] nvmet: adding nsid 3 to subsystem c413bb88-69e7-4d38-8d4c-081bce31ca47

В данном случае я насоздавал 3 разных пространства имён. (Для названия подсистемы я использовал guid, так что не обращайте внимания на этот длинный c4… Это просто часть имени подсистемы.

▍ Порты (Ports)


Всё выглядит неплохо. Теперь мы можем сконфигурировать порт и подключить нашу подсистему к этому порту. Возвращаемся назад в /sys/kernel/config/nvmet/ и идём в ports.

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

mkdir 1

После этого — осматриваемся

# ls -lah
total 0
-rw-r--r-- 1 root root 4.0K Jan  2 17:38 addr_adrfam
-rw-r--r-- 1 root root 4.0K Jan  2 17:37 addr_traddr
-rw-r--r-- 1 root root 4.0K Jan  3 10:07 addr_treq
-rw-r--r-- 1 root root 4.0K Jan  2 17:37 addr_trsvcid
-rw-r--r-- 1 root root 4.0K Jan  2 17:41 addr_trtype
drwxr-xr-x 3 root root    0 Jan  2 17:36 ana_groups
-rw-r--r-- 1 root root 4.0K Jan  3 10:07 param_inline_data_size
-rw-r--r-- 1 root root 4.0K Jan  3 10:07 param_pi_enable
drwxr-xr-x 2 root root    0 Jan  2 17:36 referrals
drwxr-xr-x 2 root root    0 Jan  2 17:45 subsystems

Конфигурация такая же, как и в подсистемах. С помощью echo выгружаем следующие параметры в файлы:

addr_taddr — адрес, на который надо биндиться.
addr_trsvcid — порт, к которому присоединяемся. Обычно это 4420.
addr_trtype — тип протокола. В нашем случае это будет tcp
addr_adrfam — тип адреса — ipv4

Так, теперь у нас есть настроенный порт, пора подключать нашу подсистему к хосту. Для этого в настройках порта заходим в папку subsystems и создаём ссылку на подсистему, которую мы создали ранее.

ln -s ../../../subsystems/test .

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

В моём случае получается следующее:

# ls -lah
lrwxrwxrwx 1 root root 0 Jan  2 17:45 c413bb88-69e7-4d38-8d4c-081bce31ca47 -> ../../../../nvmet/subsystems/c413bb88-69e7-4d38-8d4c-081bce31ca47

Ок, хорошо. Осталось проверить, что всё запустилось. При этом в dmesg вы увидите что-то вроде:

[  570.105916] nvmet_tcp: enabling port 1 (10.10.1.42:4420)

Отлично! Всё работает. Если не работает, то вы увидите причину ошибки, идите и исправляйте файлы конфигурации. Они обычно очевидные. Не тот тип протокола или неправильный адрес.

▍ Клиент


(Не забудьте сделать modprobe nvme и modprobe nvme-tcp на клиенте, или положите их в /etc/modules)

Осталось подключиться к жёсткому диску на клиенте. На клиенте, кстати, у меня запущен Debian 11, в котором я ничего не перенастраивал, и единственное, что я сделал, была установка nvme-cli

Запускаем команду

nvme connect -t tcp -n test -a 10.10.1.42 -s 4420

И проверяем наши жёсткие диски в системе.

# nvme list
Node             SN                   Model                                    Namespace Usage                      Format           FW Rev  
---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
/dev/nvme0n1     76b9b4aeef600ece     Linux                                    1           521.00  GB /   521.00  GB    512   B +  0 B   5.13.0-2

Ок, всё работает. Клиент видит диск. Делаем

ls /dev/nvme* -lah
crw------- 1 root root 238, 0 Jan  2 17:31 /dev/nvme0
brw-rw---- 1 root disk 259, 0 Jan  2 17:31 /dev/nvme0n1
brw-rw---- 1 root disk 259, 1 Jan  2 17:31 /dev/nvme0n1p1
brw-rw---- 1 root disk 259, 2 Jan  2 17:31 /dev/nvme0n1p2
brw-rw---- 1 root disk 259, 3 Jan  2 17:31 /dev/nvme0n1p3
brw-rw---- 1 root disk 259, 4 Jan  2 17:31 /dev/nvme0n1p4
brw-rw---- 1 root disk 259, 5 Jan  2 17:31 /dev/nvme0n1p5
brw-rw---- 1 root disk 259, 6 Jan  2 17:31 /dev/nvme0n1p6

И — о чудо! Весь жёсткий диск просто “перекочевал” на клиент.

▍ Аккуратнее!


И вот тут я совершил свою первую ошибку. Шестой раздел моего ноутбука был примонтирован как корневая файловая система моего линукса. Я решил рискнуть и примонтировать его как файловую систему на клиенте.

И знаете что? Мне это удалось!

Без проблем. Просто mount отлично сработал и я получил доступ к файловой системе.

Я проверил скорость работы диска, и у меня вышло реальных 20 мегабайт в секунду. Неплохо, учитывая то, что всё это делается по Wi-Fi.

После этого мой лэптоп начал шалить. Естественно, всё было весело, до тех пор, пока я не посмотрел на корневую систему с моего устройства и не выяснил, что она была заботливо перемонтирована с флагом RO.

Попытка отмонтировать эту систему на удалённом хосте не увенчалась успехом. Device busy, и всё. Попытка перемонтировать систему на локальном хосте была неудачной, и пришлось перезагрузиться. Ну как, пришлось начать перезагрузку, ведь закончить её не удалось, потому что система отказалась грузиться.

После небольшого количества fsck мне удалось всё поднять. Я решил больше не издеваться над самой файловой системой моего основного диска.

Вывод был следующим:
Использование утилит для работы с дисками, таких как fdiks, gparted и lvm — вполне возможно на двух хостах сразу. Вы можете создать новый раздел на удалённом хосте или вообще записать на него новую таблицу разделов. Это вполне законно. Главное, не пытаться монтировать эти разделы.

Монтирование ext4 разделов на двух хостах одновременно создаёт большое количество проблем.

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

Хорошо, разобравшись с тем, что делать можно и чего нельзя, я взялся за дополнительное тестирование.

И вот тут я открыл для себя странную возможность NVMET. Я подумал, что играться с единственным жёстким диском в системе на основном компьютере — это не кайф. Под рукой ничего подходящего не было, так что я взял 32х гигабайтную флешку, разрезал её на десяток разделов и начал эксперименты.

С точки зрения самой системы, это не запрещено — вы можете использовать NVME для доступа к любым устройствам хранения данных. Проблема в том, что NVME заточен для работы с NVM устройствами, а старые добрые крутящиеся жёсткие диски таковыми не являются. Это как если бы вы использовали танкер для перевозки одного чемодана. В принципе вы правы.

Я вернулся в настройки своего пространства имён и подключил различные разделы на своей флешке, как пространства имён в настройках NVME… И всё заработало!

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

Вот пример того, что получилось сделать:

На “сервере”:
lsblk
sdb                 8:16   1  29.3G  0 disk
├─sdb1              8:17   1   1.9G  0 part
├─sdb2              8:18   1   1.9G  0 part
├─sdb3              8:19   1   1.9G  0 part
├─sdb4              8:20   1   1.9G  0 part
├─sdb5              8:21   1   1.9G  0 part
└─sdb6              8:22   1   1.8G  0 part

У нас есть большой диск с разделами по 2 гигабайта.

Создаём namespace в настройках nvme и в device_path указываем следующее:

# cat device_path
/dev/sdb1

После чего монтируем этот диск по сети и смотрим, что примонтировалось на “клиенте”

lsblk
nvme0n1         259:6    0   1.9G  0 disk
nvme0n2         259:21   0   1.9G  0 disk
nvme0n3         259:23   0   1.9G  0 disk 

Наша обыкновенная глупая флешка, подключённая по usb 2.0 представлена как NVME диск на удалённом хосте. Причём она представляет собою три разных диска, так как я создал 3 разных пространства имён.

После этого давайте поупражняемся немного с LVM и создадим новый том на одном из этих дисков на “клиенте”

nvme0n1         259:6    0   1.9G  0 disk
└─egdisk1-lvol0 253:0    0   1.9G  0 lvm  
nvme0n2         259:21   0   1.9G  0 disk
nvme0n3         259:23   0   1.9G  0 disk

А теперь, внимание, без перемонтирования или чего-либо ещё, идём и смотрим на флешку с точки зрения сервера:

sdb                 8:16   1  29.3G  0 disk
├─sdb1              8:17   1   1.9G  0 part
│ └─egdisk1-lvol0 253:0    0   1.9G  0 lvm  
├─sdb2              8:18   1   1.9G  0 part
├─sdb3              8:19   1   1.9G  0 part
├─sdb4              8:20   1   1.9G  0 part
├─sdb5              8:21   1   1.9G  0 part
└─sdb6              8:22   1   1.8G  0 part

Бум! ОС распознаёт разделы! Всё работает более чем правильно.

Но погодите! Это ещё не всё.

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

Но, как оказалось на практике, делать этого не нужно.

Вы можете пойти в настройки подсистемы и создать новые пространства имён прямо на ходу. При этом “клиент” автоматически “увидит” изменения в настройках диска и добавит тома в /dev/nvme*.

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



Посему я закупил четыре серверных NVME на 512 гигабайт (CL SN720, которые, судя по документации, позиционируются как серверные NVME диски.), десять SAS SSDs, и 10Gbps сетевые адаптеры. Всё это готовится к работе, и в скором времени я выложу отчёт о производительности. Задача — измерение производительности дисковых устройств при работе с TCP/IP. Ждите новой статьи через неделю.

Адаптеры с адаптерами на адаптере.



Диски в адаптере. Внимание! Не используйте в настоящих серверах! Для этого есть форм-факторы получше.

Комментарии (59)


  1. amarao
    10.01.2022 12:43
    +10

    Поправка, Fabrics для nvme не имеет никакого отношения к FC (fiber channel). Это просто внешняя шина PCI-E через специальные PCI-E коммутаторы. А вот про nvme over tcp через ядро я не знал, спасибо.

    https://www.dolphinics.com/solutions/nvme_over_pcie_fabrics.html


    1. Nurked Автор
      10.01.2022 14:13

      О, спасибо! Возьму на заметку.


    1. wigneddoom
      10.01.2022 15:51
      +2

      C fiber channel/RDMA тоже часто называют NVMe over Fabrics: https://nvmexpress.org/wp-content/uploads/NVMe_Over_Fabrics.pdf


      1. amarao
        10.01.2022 16:37
        +1

        В этом документе, его называют FC-NVMe, и это совершенно отдельная история.


    1. creker
      11.01.2022 01:11
      +3

      Это просто внешняя шина PCI-E через специальные PCI-E коммутаторы

      Pcie это один из транспортов. Есть отдельная спека nvme-of https://nvmexpress.org/wp-content/uploads/NVMe-over-Fabrics-1.1a-2021.07.12-Ratified.pdf Согласно этой спеке фабрикой для nvme-of может быть все перечисленное - fiber channel, RDMA, TCP. Появится какой-то новый транспорт и его добавят спеку - он тоже будет фабрикой.

      То, что у вас на скрине и по ссылке, это довольно специализированные и кастомные решения, которые пытаются вытащить pcie наружу и сделать какое-то подобие сетевой фабрики из него (с учетом, что pcie пакетный и поддерживает свитчи прямо по спеке, ложится неплохо). Nvme об этом ничего не знает. Для него это не фабрика, а такой же pcie как на материнке в сервере. Вся идея той же компании liquid, свитч которой на скрине, это предоставить composable infrastructure минимальными изменениями стека. Это значит можно воткнуть в такой свитч видеокарту или ссд, и они будут работать. И система на другом конце тоже ничего подозрительного не заметит.


      1. igrblkv
        11.01.2022 11:29
        +1

        О! Коммутатор для видеокарт?


  1. dlinyj
    10.01.2022 14:26
    +12

    Какая чудесная хабратортная статья. Исследования, инженерный подход, уважаю!


    1. Nurked Автор
      10.01.2022 14:31
      +11

      На самом деле, самый торт начнётся примерно через 12 часов. Я жду, когда приедет федекс с двумя серверами. Dell R710 и Dell R730. Плюс десятигигабитный свитч. Все это дело будет установлено в эти сервера, и я буду тестировать во всех возможных комбинациях Raid. Плюс проверим, что быстрее через nvmet: M.2 или SSD.


      1. dlinyj
        10.01.2022 14:45
        +3

        Ждём с нетерпением!


        1. vladimirad
          10.01.2022 16:00
          -2

          А Иван так же искренне восхищается вашими статьями?


      1. Punk_Joker
        10.01.2022 22:08
        +3

        Будет круто почитать. Еще бы сравнение такого удаленного диска с каким-то NFS. И сценарий, где он всетаки будет шарится между несколькими машинами.


        1. Nurked Автор
          10.01.2022 23:16
          +3

          Вот как раз это и проверю. Ждите большого экселя.

          Сам сижу, жду, когда федекс приедет. Буквально с минуты на минуту должен здесь быть.


        1. Aytuar
          12.01.2022 22:42
          +1

          @Nurked

          Хм, а если на одной из сторон примонтировать раздел в RW, а другой в RO, то по идее ничего сломаться на файловой системе не должно. Например один клиент пишет другие читают.


          1. Nurked Автор
            12.01.2022 22:45

            Да, в принципе так должно работать. Собственно говоря, как я написал в статье, когда я примонтировал раздел удалённо, он автоматически перемонтировался на хосте в -RO режиме. И продолжал жить нормально, несмотря ни на что.

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

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


  1. nikweter
    10.01.2022 15:42
    +4

    Читал подобные статьи раньше. У самого руки не доходили пока проверить. А вот любопытство мучает — как там с автоматическим восстановлением подключения после перезагрузки сервера и клиента? Как с этим работает multipath?
    Сможете осветить эти вопросы в будущей статье?


    1. Nurked Автор
      10.01.2022 16:08
      +1

      Конечно. Оставляйте заявки, называлось дело :-)


    1. ultimate_darkness
      10.01.2022 16:28
      +3

      Из интересного, у nvme инициатора в современных ядрах есть свой multipath драйвер, который никак не связан с dm-multipath, и не требует multipathd.


      1. Nurked Автор
        10.01.2022 20:36

        Хм. Это очень интересно!

        Я, признаться честно, про multipath даже и не знал. Я на самом деле работаю по следующей системе: Прочитал доки, попробовал на живой системе, написал статью. До multipath даже не добрался.

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

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


      1. creker
        11.01.2022 01:14
        +1

        И уже есть платформы, которые умеют двухпортовые nvme диски. У тех же супермикро такие есть. Можно строить отказоустойчивую двухголовую хранилку.


        1. Nurked Автор
          11.01.2022 08:04

          Пардон, а поподробнее можно? Как она становится отказоустойчивой, если у неё две головы?


          1. creker
            11.01.2022 12:01
            +1

            У супермикро есть линейка платформ storage bridge bay с двумя контроллерами и двух портовыми дисками. Вот например модельки чисто под nvme

            https://www.supermicro.com/en/products/system/2U/2028/SSG-2028R-DN2R24L.cfm

            https://www.supermicro.com/en/products/system/2U/2028/SSG-2028R-DN2R48L.cfm

            Как она становится отказоустойчивой, если у неё две головы?

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

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


            1. Nurked Автор
              11.01.2022 16:37

              А, вот вы о чём. Я бы больше боялся бы что отвалится диск.


              1. creker
                11.01.2022 16:39
                +1

                Ну, это вещи тривиальные и давно решенные.


                1. Nurked Автор
                  11.01.2022 16:45

                  А как? Вот сейчас у меня диски стоят в этой плате-расширителе. Если диск вылетит, то мне нужно будет останавливать сервер и вынимать плату.

                  А решения для вставки nvmr через sas порты выглядят очень проприетарно


                  1. creker
                    11.01.2022 18:24
                    +1

                    Если говорить о платформе выше, то там нормальный nvme бэкплейн с поддержкой горячей замены.


                  1. DaemonGloom
                    12.01.2022 14:32
                    +1

                    Это классический U.2, который глупым переходником можно преобразовать в M.2 (обратное тоже справедливо). Есть у кучи разных производителей.


  1. ultimate_darkness
    10.01.2022 16:27
    +4

    nvmet означает nmve-transport

    nvmet - это nvme target. Драйвер содержит общий код реализции nvme таргета, а протоколо-специфичные вещи лежат, соответственно в nvmet-tcp, nvmet-rdma и т.д.


    1. Nurked Автор
      10.01.2022 17:31
      +1

      Спасибо за данные. Поправлью в следующей статье.


  1. Nnnnoooo
    10.01.2022 17:01
    +2

    Просто торт!


    1. Nurked Автор
      10.01.2022 18:50
      +1

      Ещё какой. И это — только первый кусок. Добавки ждём скорее всего на следующей неделе.

      Знаете, вы меня надоумили, я сменил КДПВ 8-)


    1. Nurked Автор
      10.01.2022 19:01


  1. DarkTiger
    10.01.2022 22:29
    +1

    NVME — это ключ к загрузке любой системы за 3 секунды

    А можно сюда выхлоп systemd-analyze blame с Вашей системы?
    Наверное, на системе с coreboot и тщательно вылизанной загрузкой можно и за 3, но попотеть придется.


    1. Nurked Автор
      10.01.2022 23:23

      Держите.
      6.125s NetworkManager-wait-online.service
      2.523s fwupd.service
      2.166s plymouth-quit-wait.service
      1.646s systemd-udev-settle.service
      1.580s snap-core18-2246.mount
      1.488s snap-core18-2253.mount
      1.409s snap-snap\x2dstore-547.mount
      1.310s snap-telegram\x2ddesktop-3544.mount
      1.239s snap-slack-48.mount
      1.138s snap-xmind-11.mount
      1.103s systemd-backlight@backlight:intel_backlight.service
      1.088s snap-gnome\x2d3\x2d34\x2d1804-72.mount
      1.019s mysql.service
       992ms snap-gnome\x2d3\x2d38\x2d2004-76.mount
       936ms snap-kde\x2dframeworks\x2d5\x2dcore18-32.mount
       883ms snap-firefox-777.mount
       835ms snap-core20-1242.mount
       778ms snap-kdiskmark-59.mount
       709ms plymouth-read-write.service
       676ms snap-firefox-767.mount
       659ms snap-telegram\x2ddesktop-3530.mount
       582ms snap-core-11743.mount
       514ms snapd.service
       512ms snap-youtube\x2ddl-4572.mount
       472ms snap-shotcut-571.mount
       424ms snap-gnome\x2d3\x2d38\x2d2004-87.mount
       395ms dev-nvme0n1p6.device
       374ms snap-gnome\x2d3\x2d34\x2d1804-77.mount
       329ms snap-shotcut-568.mount
       286ms snap-vlc-2344.mount
       281ms upower.service
       232ms snap-snap\x2dstore-558.mount
       202ms cups.service
       193ms udisks2.service
       190ms snap-slack-49.mount
       176ms networkd-dispatcher.service
       169ms accounts-daemon.service
       135ms snap-core20-1270.mount
       129ms systemd-resolved.service
       125ms RepetierServer.service
       115ms snap-gtk\x2dcommon\x2dthemes-1519.mount
       114ms snap-dbeaver\x2dce-149.mount
       109ms ModemManager.service
       105ms NetworkManager.service
       105ms bluetooth.service
       104ms avahi-daemon.service
       104ms systemd-rfkill.service
       100ms apparmor.service
        97ms systemd-timesyncd.service
        97ms ua-timer.service
        95ms systemd-logind.service
        92ms user@1000.service
        89ms iio-sensor-proxy.service
        89ms lvm2-monitor.service
        89ms libvirtd.service
        88ms snap-core-11993.mount
        86ms polkit.service
        84ms e2scrub_reap.service
        82ms snap-jami-227.mount
        82ms power-profiles-daemon.service
        81ms apport.service
        76ms systemd-udev-trigger.service
        76ms update-notifier-download.service
        73ms switcheroo-control.service
        73ms systemd-journal-flush.service
        70ms snapd.apparmor.service
        69ms gpu-manager.service
        61ms thermald.service
        60ms snap-gnome\x2d3\x2d28\x2d1804-161.mount
        60ms systemd-machined.service
        57ms wpa_supplicant.service
        57ms secureboot-db.service
        57ms systemd-udevd.service
        55ms grub-common.service
        51ms open-fprintd.service
        51ms qemu-kvm.service
        45ms snap-caprine-48.mount
        43ms swapfile.swap
        42ms gdm.service
        41ms keyboard-setup.service
        39ms systemd-journald.service
        38ms rsyslog.service
        34ms bolt.service
        32ms systemd-tmpfiles-setup.service
        30ms colord.service
        29ms run-qemu.mount
        28ms snap-bare-5.mount
        24ms multipathd.service
        24ms systemd-modules-load.service
        23ms libvirt-guests.service
        21ms binfmt-support.service
        21ms systemd-random-seed.service
        20ms snapd.seeded.service
        20ms packagekit.service
        20ms systemd-fsck@dev-disk-by\x2duuid-56CF\x2d31C2.service
        20ms systemd-tmpfiles-clean.service
        18ms run-rpc_pipefs.mount
        15ms plymouth-start.service
        14ms alsa-restore.service
        13ms modprobe@drm.service
        13ms grub-initrd-fallback.service
        11ms systemd-tmpfiles-setup-dev.service
        11ms systemd-sysctl.service
        10ms rtkit-daemon.service
        10ms dev-hugepages.mount
         9ms dev-mqueue.mount
         9ms systemd-backlight@leds:platform::kbd_backlight.service
         9ms systemd-sysusers.service
         9ms sys-kernel-debug.mount
         8ms sys-kernel-tracing.mount
         8ms motd-news.service
         8ms proc-sys-fs-binfmt_misc.mount
         7ms kerneloops.service
         7ms systemd-remount-fs.service
         6ms kmod-static-nodes.service
         6ms console-setup.service
         6ms modprobe@configfs.service
         5ms finalrd.service
         5ms modprobe@fuse.service
         5ms dev-loop6.device
         5ms user-runtime-dir@1000.service
         4ms nfs-config.service
         4ms systemd-update-utmp.service
         4ms dev-loop1.device
         4ms systemd-user-sessions.service
         4ms dev-loop3.device
         4ms boot-efi.mount
         4ms dev-loop5.device
         3ms dev-loop4.device
         3ms systemd-update-utmp-runlevel.service
         3ms dev-loop2.device
         3ms dev-loop12.device
         3ms dev-loop14.device
         3ms dev-loop11.device
         3ms dev-loop8.device
         3ms dev-loop15.device
         3ms dev-loop13.device
         3ms dev-loop17.device
         3ms dev-loop24.device
         3ms openvpn.service
         3ms dev-loop10.device
         3ms dev-loop25.device
         3ms dev-loop21.device
         2ms sys-fs-fuse-connections.mount
         2ms rpcbind.service
         2ms libvirtd.socket
         2ms ufw.service
         2ms dev-loop18.device
         2ms sys-kernel-config.mount
         2ms dev-loop27.device
         1ms dev-loop9.device
         1ms dev-loop16.device
         1ms snapd.socket
         1ms dev-loop23.device
         1ms dev-loop7.device
         1ms dev-loop0.device
         1ms dev-loop26.device
         1ms dev-loop28.device
         1ms dev-loop19.device
         1ms dev-loop30.device
         1ms dev-loop22.device
         1ms setvtrgb.service
       580us dev-loop20.device
       573us dev-loop29.device
        25us blk-availability.service

      Система, кстати, Lenovo Yoga C940. Не знаю, что там последний сервис, который за шесть секунд стартует, но система становится доступной буквально за 3. Кстати, интересное дело, приличная часть всех этих стартов — это Снаповские пакеты. Может мне из посносить?


      1. garwall
        11.01.2022 09:58
        +1

        он ожидает, пока сетевые интерфейсы поднимутся и получат ip-адрес.


        1. Nurked Автор
          11.01.2022 09:59
          +1

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


      1. DarkTiger
        11.01.2022 23:19
        +1

        До включения логгера много всего происходит, включая UEFI. Вы же считаете 3 сек. не от момента нажатия кнопки питания, а от появления первой строки вывода ядра или экрана GRUB, так? У Вас неплохо сбалансирована загрузка, кстати. Система совсем свежая?
        А снапы... Сами смотрите, они Вам реально нужны? Не хочу давать советов, не зная задач. Наверное, лучше почитать вот это и решить самому.
        Реально оно не сильно тормозит систему, грузясь в бэкграунде. Если бы надо было систему после включения в жесткий реалтайм вводить как можно быстрее, например, для выдачи данных с камеры заднего вида в авто - стоило бы, а так...


  1. Zalechi
    11.01.2022 01:04
    +1

    А как шо по секьюрности? Так же получается любой "дурак" с nvmet-cli на борту, доступом к сети и знаниями куда подключаться, может это сделать?


    1. Nurked Автор
      11.01.2022 01:11
      +1

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


      1. Zalechi
        11.01.2022 01:14
        +2

        Это лайк! Я почему спрашиваю - просто нафиг та samba нужна(условно), если есть шо-то модное, современное, молодежное.


        1. creker
          11.01.2022 01:22
          +3

          Самбу и nfs это не заменит в любом случае. Скорее iscsi. В спеке есть только аутентификация, чтобы чисто защитить от подключения любого "дурака" снаружи. Если TCP, то естественно все это можно обернуть в TLS, но не более того. Никакой авторизации, разграничения прав, ничего этого нет и вряд ли будет. Это низкоуровневый интерфейс для блочных устройств. Авторизация это уже дело систем выше уровнем. По сути, это все делается для облачных провайдеров, которые имеют полный контроль над фабрикой, а клиент видит только то, что у него в системе новое устройство появилось.


          1. Zalechi
            11.01.2022 01:30

            Вот это ояень важно, поэтому и спросил. По идее на сервере мы же задаем права пользователей к разделам, папкам. Получается эти заданные права реплицируются на клиента nvmet? Думаю этого достаточно для секретности. Хотя я говорю мыслю, как чайник, поэтому поправьте, если что..

            Короче да, хотелось бы сравнения с samba-й и nfs-ом до кучи.


            1. creker
              11.01.2022 01:36
              +5

              Дык, nvme это блочное устройство. Какие там на нем права и разделы, и есть ли они вообще там, nvme до этого нет никакого дела. Его дело предоставить клиенту доступ к чему-то по nvme протоколу. На той стороне ведь может даже не диск быть, а все что угодно, хоть флоппи дисковод. Nvme это просто протокол, ему это все ортогонально. Ему сказали дай мне 4к блок по вот такому LBA, он его и выдаст.


              1. Zalechi
                11.01.2022 02:11

                Согласен. Но что-то же выдает права rw-x - все эти.. Ядро не ядро. Я хз, кто этим занимается.


                1. creker
                  11.01.2022 02:48
                  +2

                  Их выдает драйвер файловой системы, что находится несколькими уровнями выше nvme протокола. Вот, например, исходник ext4 и где у него в inode лежат те самые права https://github.com/torvalds/linux/blob/master/fs/ext4/ext4.h#L784

                  nvme дает блочное устройство, на этом уровне нет ни прав, ни файлов, ни файловой системы. Есть блоки, в которых лежат рандомные байты. Кто и как их трактовать будет nvme пофиг. Это все равно, что задаваться вопросом, где мои HTTP куки для авторизации пользователя, когда мы обсуждаем ethernet протокол. Поэтому и сравнение с самбой и нфс тут не провести - это просто совершенно разные вещи.


                  1. Zalechi
                    11.01.2022 13:37
                    +1

                    Угу, понял эту абстракцию, или слой.


                1. mayorovp
                  11.01.2022 11:20
                  +2

                  Правильный вопрос не кто "выдаёт", а кто проверяет. Так вот, при подключении диска по сети как блочного устройства права на файлы проверять будет клиент, а не сервер.


                  Я думаю, не надо пояснять почему проверка прав на клиенте в общем случае — плохая идея?


                  1. Zalechi
                    11.01.2022 13:38
                    +3

                    Естественно, тем более в пространстве без доверия. Ятут с вами всеми, скоро степень по блокам получу.


        1. Nurked Автор
          11.01.2022 01:44

          Да, тут, как нижу объяснили, и как я.сказал в статье - это не распределённая файловая система. Тут писать может только один клиент в один отрезок времени. Тут мы даже далеко от самой концепции фс.


  1. Alew
    11.01.2022 15:49
    +1

    Можете разврнуть вот эту мысль "Диски в адаптере. Внимание! Не используйте в настоящих серверах! Для этого есть форм-факторы получше" ? у меня как раз сервер и я планировал поставить в него такую конструкцию AOC-SLG3-2M2 | Add-on Cards | Accessories | Products - Super Micro Computer, Inc.


    1. Nurked Автор
      11.01.2022 16:49
      +1

      Зависит от того, как вы будете обслуживать сервер. Если эти nvme у вас для кеша, и один из них умрёт, то вам пофиг. Останавливаете сервер и меняете диск.

      M.2 порты не поддерживают горячую замену. А жаль. Есть еще U.2 порты. Я их щас изучаю. Проблема в том, что U.2 совместимые диски стоят в три раза дороже серверных M.2


      1. Alexsey
        12.01.2022 02:34
        +1

        Проблема в том, что U.2 совместимые диски стоят в три раза дороже серверных M.2

        Плохо как-то смотрите, у микрона они стоят плюс-минус одинаково.

        https://www.kns.ru/product/ssd-disk-micron-7300-pro-1-92tb-mtfdhbe1t9tdf/

        https://www.kns.ru/product/ssd-disk-micron-7300-pro-1-92tb-mtfdhbg1t9tdf/


        1. Nurked Автор
          12.01.2022 02:48

          Хм. Интересно. Я буду здесь искать. У меня нет доступа к Московским магазинам. Но, спасибо за наводку.

          Тут ещё есть прикол в том, что U.2 идёт с существенно более дорогим контроллером. Нужен S140, с другой стороны M.2 вообще ничего не требует. Соответственно, здесь нужно включать оценку по принципу цена/быстрота/скорость восстановления от сбоев.


          1. IsNoGood
            12.01.2022 21:00
            +1

            U.2 требует тоже самое что m.2, подключение к шине pcie, как вы это сделаете ему без разницы, это просто другой форм фактор.


            1. Nurked Автор
              12.01.2022 21:01

              В общем вы правы. Я просто не знаю, как эта шина подводится от процессора к дискам?


              1. creker
                12.01.2022 21:54
                +1

                Как правило, оба подключены напрямую к процессору. U.2 так уж точно, т.к. здесь речь о high-end дисках. Обычно от бекплейна идут кабели в oculink порты. m.2 бывает подключаются к чипсету на интел платформах, но это все равно полноценные линии pcie, которые в конечном итоге упираются в процессор.

                https://polyworks.kz/wp-content/uploads/2017/09/Supermicro-X11SPH-nCTF-Block-Diagram.jpg


          1. creker
            12.01.2022 23:12
            +1

            Нужен S140

            Это какие-то приколы делл? Зачем нужна эта безделушка? Почитал, какая-то плата с контроллером, но при этом рейд софтварный и требует драйвера в винде (для линукса вроде умеет прикидываться mdraid и линукс ничего про этот контроллер не знает). Зачем оно нужно? Что винда, что линукс умеют без сторонних средств делать зеркало для загрузочного раздела. На остальных дисках это чудо тем более не нужно, рейд можно чем угодно настроить.

            Я конечно понимаю, прикольно, когда рейд настраивается из под UEFI и логотип делл красуется, но какая-то пустая трата денег в нынешние времена. Я бы понял, если бы рейд там аппаратный был, но для U.2 это было бы вообще кощунство.


            1. Nurked Автор
              12.01.2022 23:16

              Если честно, я просто не совсем в теме. Сижу и с удовольствием записываю всё, что вы тут говорите. Конечно, с самими дисками без контроллеров работать проще и дешевле. Я просто понятия не имею, как правильно собрать сервер с nvme ssd. А с этим было-бы интересно разобраться.


              1. creker
                13.01.2022 01:29
                +1

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

                Я бы собирал очень просто. Взял бы любую платформу, где U.2 бекплейн имеет прямое подключение к процессору для каждого диска, минуя даже pcie свитчи. Если не хочется с NUMA бодаться, то взять однопроцессорную.

                Вот пример топовый топ https://www.supermicro.com/en/Aplus/system/2U/2124/AS-2124US-TNRP.cfm 24 диска, 96 pcie 4.0 линий, напрямую идущих из процессора. Тут конечно ретаймеры понадобились, но для 4.0 похоже по-другому уже никак.


                1. Nurked Автор
                  13.01.2022 02:18

                  Красиво, но уж очень дорого. Тут ещё есть вопрос в гигабайтах диска по гигабиту сети.