А пока мои коллеги пытаются разобраться с проблемами серверных 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
И — о чудо! Весь жёсткий диск просто “перекочевал” на клиент.
▍ Аккуратнее!
И вот тут я совершил свою первую ошибку. Шестой раздел моего ноутбука был примонтирован как корневая файловая система моего линукса. Я решил рискнуть и примонтировать его как файловую систему на клиенте.
И знаете что? Мне это удалось!
Я проверил скорость работы диска, и у меня вышло реальных 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)
dlinyj
10.01.2022 14:26+12Какая чудесная хабратортная статья. Исследования, инженерный подход, уважаю!
Nurked Автор
10.01.2022 14:31+11На самом деле, самый торт начнётся примерно через 12 часов. Я жду, когда приедет федекс с двумя серверами. Dell R710 и Dell R730. Плюс десятигигабитный свитч. Все это дело будет установлено в эти сервера, и я буду тестировать во всех возможных комбинациях Raid. Плюс проверим, что быстрее через nvmet: M.2 или SSD.
Punk_Joker
10.01.2022 22:08+3Будет круто почитать. Еще бы сравнение такого удаленного диска с каким-то NFS. И сценарий, где он всетаки будет шарится между несколькими машинами.
Nurked Автор
10.01.2022 23:16+3Вот как раз это и проверю. Ждите большого экселя.
Сам сижу, жду, когда федекс приедет. Буквально с минуты на минуту должен здесь быть.
Aytuar
12.01.2022 22:42+1Хм, а если на одной из сторон примонтировать раздел в RW, а другой в RO, то по идее ничего сломаться на файловой системе не должно. Например один клиент пишет другие читают.
Nurked Автор
12.01.2022 22:45Да, в принципе так должно работать. Собственно говоря, как я написал в статье, когда я примонтировал раздел удалённо, он автоматически перемонтировался на хосте в -RO режиме. И продолжал жить нормально, несмотря ни на что.
У меня были проблемы с его размонтированием на клиенте после того, как упало соединение между компьютерами.
Но, собственно говоря, я щас как раз сижу перед двумя серверами и пытаюсь это решить.
nikweter
10.01.2022 15:42+4Читал подобные статьи раньше. У самого руки не доходили пока проверить. А вот любопытство мучает — как там с автоматическим восстановлением подключения после перезагрузки сервера и клиента? Как с этим работает multipath?
Сможете осветить эти вопросы в будущей статье?ultimate_darkness
10.01.2022 16:28+3Из интересного, у nvme инициатора в современных ядрах есть свой multipath драйвер, который никак не связан с dm-multipath, и не требует multipathd.
Nurked Автор
10.01.2022 20:36Хм. Это очень интересно!
Я, признаться честно, про multipath даже и не знал. Я на самом деле работаю по следующей системе: Прочитал доки, попробовал на живой системе, написал статью. До multipath даже не добрался.
А это очень интересно. Кажется, можно будет распределять нагрузку между сетевыми картами.
Если вы почитаете оригинальные стати, на которые я ссылаюсь в самом начале — при работе в серверном сегменте очень легко напороться на проблемы и задержки. С ними-то как раз я и буду бороться в следующей статье.
creker
11.01.2022 01:14+1И уже есть платформы, которые умеют двухпортовые nvme диски. У тех же супермикро такие есть. Можно строить отказоустойчивую двухголовую хранилку.
Nurked Автор
11.01.2022 08:04Пардон, а поподробнее можно? Как она становится отказоустойчивой, если у неё две головы?
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 убивать соседа, если он себе плохо ведет.
Nurked Автор
11.01.2022 16:37А, вот вы о чём. Я бы больше боялся бы что отвалится диск.
creker
11.01.2022 16:39+1Ну, это вещи тривиальные и давно решенные.
Nurked Автор
11.01.2022 16:45А как? Вот сейчас у меня диски стоят в этой плате-расширителе. Если диск вылетит, то мне нужно будет останавливать сервер и вынимать плату.
А решения для вставки nvmr через sas порты выглядят очень проприетарно
creker
11.01.2022 18:24+1Если говорить о платформе выше, то там нормальный nvme бэкплейн с поддержкой горячей замены.
DaemonGloom
12.01.2022 14:32+1Это классический U.2, который глупым переходником можно преобразовать в M.2 (обратное тоже справедливо). Есть у кучи разных производителей.
ultimate_darkness
10.01.2022 16:27+4nvmet означает nmve-transport
nvmet - это nvme target. Драйвер содержит общий код реализции nvme таргета, а протоколо-специфичные вещи лежат, соответственно в nvmet-tcp, nvmet-rdma и т.д.
DarkTiger
10.01.2022 22:29+1NVME — это ключ к загрузке любой системы за 3 секунды
А можно сюда выхлоп systemd-analyze blame с Вашей системы?
Наверное, на системе с coreboot и тщательно вылизанной загрузкой можно и за 3, но попотеть придется.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. Кстати, интересное дело, приличная часть всех этих стартов — это Снаповские пакеты. Может мне из посносить?
DarkTiger
11.01.2022 23:19+1До включения логгера много всего происходит, включая UEFI. Вы же считаете 3 сек. не от момента нажатия кнопки питания, а от появления первой строки вывода ядра или экрана GRUB, так? У Вас неплохо сбалансирована загрузка, кстати. Система совсем свежая?
А снапы... Сами смотрите, они Вам реально нужны? Не хочу давать советов, не зная задач. Наверное, лучше почитать вот это и решить самому.
Реально оно не сильно тормозит систему, грузясь в бэкграунде. Если бы надо было систему после включения в жесткий реалтайм вводить как можно быстрее, например, для выдачи данных с камеры заднего вида в авто - стоило бы, а так...
Zalechi
11.01.2022 01:04+1А как шо по секьюрности? Так же получается любой "дурак" с nvmet-cli на борту, доступом к сети и знаниями куда подключаться, может это сделать?
Nurked Автор
11.01.2022 01:11+1Напишу в следующей публикации. Но, в этой я упомянул - подключение работает только от определённых хостов.
Zalechi
11.01.2022 01:14+2Это лайк! Я почему спрашиваю - просто нафиг та samba нужна(условно), если есть шо-то модное, современное, молодежное.
creker
11.01.2022 01:22+3Самбу и nfs это не заменит в любом случае. Скорее iscsi. В спеке есть только аутентификация, чтобы чисто защитить от подключения любого "дурака" снаружи. Если TCP, то естественно все это можно обернуть в TLS, но не более того. Никакой авторизации, разграничения прав, ничего этого нет и вряд ли будет. Это низкоуровневый интерфейс для блочных устройств. Авторизация это уже дело систем выше уровнем. По сути, это все делается для облачных провайдеров, которые имеют полный контроль над фабрикой, а клиент видит только то, что у него в системе новое устройство появилось.
Zalechi
11.01.2022 01:30Вот это ояень важно, поэтому и спросил. По идее на сервере мы же задаем права пользователей к разделам, папкам. Получается эти заданные права реплицируются на клиента nvmet? Думаю этого достаточно для секретности. Хотя я говорю мыслю, как чайник, поэтому поправьте, если что..
Короче да, хотелось бы сравнения с samba-й и nfs-ом до кучи.
creker
11.01.2022 01:36+5Дык, nvme это блочное устройство. Какие там на нем права и разделы, и есть ли они вообще там, nvme до этого нет никакого дела. Его дело предоставить клиенту доступ к чему-то по nvme протоколу. На той стороне ведь может даже не диск быть, а все что угодно, хоть флоппи дисковод. Nvme это просто протокол, ему это все ортогонально. Ему сказали дай мне 4к блок по вот такому LBA, он его и выдаст.
Zalechi
11.01.2022 02:11Согласен. Но что-то же выдает права rw-x - все эти.. Ядро не ядро. Я хз, кто этим занимается.
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 протокол. Поэтому и сравнение с самбой и нфс тут не провести - это просто совершенно разные вещи.
mayorovp
11.01.2022 11:20+2Правильный вопрос не кто "выдаёт", а кто проверяет. Так вот, при подключении диска по сети как блочного устройства права на файлы проверять будет клиент, а не сервер.
Я думаю, не надо пояснять почему проверка прав на клиенте в общем случае — плохая идея?
Zalechi
11.01.2022 13:38+3Естественно, тем более в пространстве без доверия. Ятут с вами всеми, скоро степень по блокам получу.
Nurked Автор
11.01.2022 01:44Да, тут, как нижу объяснили, и как я.сказал в статье - это не распределённая файловая система. Тут писать может только один клиент в один отрезок времени. Тут мы даже далеко от самой концепции фс.
Alew
11.01.2022 15:49+1Можете разврнуть вот эту мысль "Диски в адаптере. Внимание! Не используйте в настоящих серверах! Для этого есть форм-факторы получше" ? у меня как раз сервер и я планировал поставить в него такую конструкцию AOC-SLG3-2M2 | Add-on Cards | Accessories | Products - Super Micro Computer, Inc.
Nurked Автор
11.01.2022 16:49+1Зависит от того, как вы будете обслуживать сервер. Если эти nvme у вас для кеша, и один из них умрёт, то вам пофиг. Останавливаете сервер и меняете диск.
M.2 порты не поддерживают горячую замену. А жаль. Есть еще U.2 порты. Я их щас изучаю. Проблема в том, что U.2 совместимые диски стоят в три раза дороже серверных M.2
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/
Nurked Автор
12.01.2022 02:48Хм. Интересно. Я буду здесь искать. У меня нет доступа к Московским магазинам. Но, спасибо за наводку.
Тут ещё есть прикол в том, что U.2 идёт с существенно более дорогим контроллером. Нужен S140, с другой стороны M.2 вообще ничего не требует. Соответственно, здесь нужно включать оценку по принципу цена/быстрота/скорость восстановления от сбоев.IsNoGood
12.01.2022 21:00+1U.2 требует тоже самое что m.2, подключение к шине pcie, как вы это сделаете ему без разницы, это просто другой форм фактор.
Nurked Автор
12.01.2022 21:01В общем вы правы. Я просто не знаю, как эта шина подводится от процессора к дискам?
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
creker
12.01.2022 23:12+1Нужен S140
Это какие-то приколы делл? Зачем нужна эта безделушка? Почитал, какая-то плата с контроллером, но при этом рейд софтварный и требует драйвера в винде (для линукса вроде умеет прикидываться mdraid и линукс ничего про этот контроллер не знает). Зачем оно нужно? Что винда, что линукс умеют без сторонних средств делать зеркало для загрузочного раздела. На остальных дисках это чудо тем более не нужно, рейд можно чем угодно настроить.
Я конечно понимаю, прикольно, когда рейд настраивается из под UEFI и логотип делл красуется, но какая-то пустая трата денег в нынешние времена. Я бы понял, если бы рейд там аппаратный был, но для U.2 это было бы вообще кощунство.
Nurked Автор
12.01.2022 23:16Если честно, я просто не совсем в теме. Сижу и с удовольствием записываю всё, что вы тут говорите. Конечно, с самими дисками без контроллеров работать проще и дешевле. Я просто понятия не имею, как правильно собрать сервер с nvme ssd. А с этим было-бы интересно разобраться.
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 похоже по-другому уже никак.
Nurked Автор
13.01.2022 02:18Красиво, но уж очень дорого. Тут ещё есть вопрос в гигабайтах диска по гигабиту сети.
amarao
Поправка, Fabrics для nvme не имеет никакого отношения к FC (fiber channel). Это просто внешняя шина PCI-E через специальные PCI-E коммутаторы. А вот про nvme over tcp через ядро я не знал, спасибо.
https://www.dolphinics.com/solutions/nvme_over_pcie_fabrics.html
Nurked Автор
О, спасибо! Возьму на заметку.
wigneddoom
C fiber channel/RDMA тоже часто называют NVMe over Fabrics: https://nvmexpress.org/wp-content/uploads/NVMe_Over_Fabrics.pdf
amarao
В этом документе, его называют FC-NVMe, и это совершенно отдельная история.
creker
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 минимальными изменениями стека. Это значит можно воткнуть в такой свитч видеокарту или ссд, и они будут работать. И система на другом конце тоже ничего подозрительного не заметит.
igrblkv
О! Коммутатор для видеокарт?