NVMe дома, ня

Posted: 2017-11-11 in Hardware, IT
Метки:,

Всем привет !

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

Аналогичный подход я практиковал и к накопителям, используя долгое время классические жёсткие диски (с блинами и двигателем). SSD, конечно, очень радовали характеристиками, но у меня были сомнения насчёт их надёжности в силу ограниченности ресурса перезаписи.
Однако собрав множество отзывов и статистики, в том числе на работе, и посмотрев на гарантийные сроки, я решил два года назад купить небольшой, но шустрый SSD чисто под систему и некоторые профили тяжелых приложений.

Прошло два года, и опыт использования SSD оказался очень и очень позитивным.
Впрочем, накопитель M6e использует внутренний SATA-3 интерфейс, виден как /dev/sdd, да и его скоростные показатели хоть и позитивны — 770 Мб/сек чтение + 96K IOPS, но всё же ещё не самое «вау» из того, что есть, хотя для комфортного использования операционки более чем хватает.

Мне же захотелось устранить одно из последних узких мест в домашнем компе — скорость чтения/записи на диск для домашнего каталога. Ну, чтобы тестовые стенды с тяжёлыми виртуальными машинами и всякие красивые игрушки запускались существенно быстрее, да и меньше выжигали мои нервные клетки долгим запуском.

Но поскольку длинные PCI-E порты у меня кончились, я решил заюзать M.2 порт, раз уж он у меня появился после апгрейда платформы.

После чтения мануалов и средней длительности поединка с собственной жабой нашел такой девайс, как PLEXTOR PX-1TM8PeG.

Видится он уже как NVMe, а не как SATA. Поскольку у плекстора есть свой контроллер, и в отличие от M6e, тут нет эмуляции SATA, то схема устройств на системе будет такая:

/dev/nvme0     - контроллер NVMe
/dev/nvme0n1   - SSD-накопитель на NVMe
/dev/nvme0n1p1 - 1-й раздел на SSD-накопителе

Тут /dev/nvme0n1 — обычное блочное устройство, разделы создаём на нём с помощью привычных утилит fdisk, gparted или подобных.

фотка Plextor SSD - M6e и M8PeG

Перенос данных прост, как мычание — создаём раздел, подключаем, копируем все нужные каталоги, правим fstab, ребутимся, прогоняем restorecon -R /home.

smartctl

Работает также, как и с обычными дисками, показывает местный SSD-шный SMART

# smartctl -a /dev/nvme0
smartctl 6.5 2016-05-07 r4318 [x86_64-linux-4.13.11-100.fc25.x86_64] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Number:                       PLEXTOR PX-1TM8PeG
Serial Number:                      P0xxx
Firmware Version:                   1.04
PCI Vendor ID:                      0x14a4
PCI Vendor Subsystem ID:            0x1b4b
IEEE OUI Identifier:                0x002303
Total NVM Capacity:                 1 024 209 543 168 [1,02 TB]
Unallocated NVM Capacity:           0
Controller ID:                      1
Number of Namespaces:               1
Namespace 1 Size/Capacity:          1 024 209 543 168 [1,02 TB]
Namespace 1 Utilization:            0
Namespace 1 Formatted LBA Size:     512
Local Time is:                      Sat Nov 11 23:25:28 2017 MSK
Firmware Updates (0x14):            2 Slots, no Reset required
Optional Admin Commands (0x001f):   Security Format Frmw_DL NS_Mngmt *Other*
Optional NVM Commands (0x001f):     Comp Wr_Unc DS_Mngmt Wr_Zero Sav/Sel_Feat
Maximum Data Transfer Size:         32 Pages
Warning  Comp. Temp. Threshold:     85 Celsius
Critical Comp. Temp. Threshold:     95 Celsius
...

Все смарт-атрибуты цитировать смысла нет.

hdparm
А вот эта тулза с NVMe не работает, это не ATA!
Писать будет что-то такое:

# hdparm /dev/nvme0

/dev/nvme0:
 HDIO_DRIVE_CMD(identify) failed: Inappropriate ioctl for device
 BLKROGET failed: Inappropriate ioctl for device
 BLKRAGET failed: Inappropriate ioctl for device
 BLKGETSIZE failed: Inappropriate ioctl for device

# hdparm /dev/nvme0n1

/dev/nvme0n1:
 HDIO_DRIVE_CMD(identify) failed: Inappropriate ioctl for device
 readonly      =  0 (off)
 readahead     = 256 (on)
 geometry      = 976762/64/32, sectors = 2000409264, start = 0

Так что оставим hdparm для дисков c интерфейсами IDE/SATA/SAS/SCSI.

nvme-cli
Для мониторинга и управления NVMe-устройствами в федоре есть пакет nvme-cli. Ставим его. ВАЖНО! Многие команды там опасны и потенциально деструктивны, внимательно читаем маны и хелпы ( nvme —help ) !

Список наших NVMe:

# nvme list
Node  SN  Model Namespace Usage Format FW Rev
----  --  ----- --------- ----- ------ -- ---
/dev/nvme0n1  P0xxx PLEXTOR PX-1TM8PeG  1  0,00B/1,02TB  512B+0B 1.04

Смарт-лог читаем и понятен:

# nvme smart-log /dev/nvme0
Smart Log for NVME device:nvme0 namespace-id:ffffffff
critical_warning                    : 0
temperature                         : 44 C
available_spare                     : 100%
available_spare_threshold           : 0%
percentage_used                     : 0%
data_units_read                     : 136 692
data_units_written                  : 382 341
host_read_commands                  : 766 300
host_write_commands                 : 1 557 905
controller_busy_time                : 61
power_cycles                        : 1
power_on_hours                      : 1
unsafe_shutdowns                    : 1
media_errors                        : 0
num_err_log_entries                 : 0
Warning Temperature Time            : 0
Critical Composite Temperature Time : 0
Temperature Sensor 1                : 44 C
Temperature Sensor 2                : 0 C
Temperature Sensor 3                : 0 C
Temperature Sensor 4                : 0 C
Temperature Sensor 5                : 0 C
Temperature Sensor 6                : 0 C
Temperature Sensor 7                : 0 C
Temperature Sensor 8                : 0 C

Лог ошибок пуст:

# nvme error-log /dev/nvme0     
Error Log Entries for device:nvme0 entries:64
.................
 Entry[ 0]   
.................
error_count  : 0
sqid         : 0
cmdid        : 0
status_field : 0(SUCCESS)
parm_err_loc : 0
lba          : 0
nsid         : 0
vs           : 0
.................

В принципе, если за 5 лет гарантии что и навернётся — бэкапы наше всё.

Бенч.

Заявленные 240K IOPS и 2500 Мб/сек на чтение + 1400 Мб/сек на запись в пике — это ОЧЕНЬ зверство, а из устройств, способных принять такие потоки данных, у меня мало чего есть, да и настолько жирных файлов немного. Тут надо понимать, что маркетологи любят указывать максимальные значения, достижимые лишь в каких-то особых условиях на особо хитрых тестах, а конкретно на вашей машине и с вашей задачей результаты могут отличаться, иногда весьма сильно от максимума. Вот и проверим.

1). Копирование в tmpfs миднайт-коммандером:

2). Первое копирование крупного файла с помощью dd в /dev/null/, чтобы не завязываться на работу механизмов tmpfs, но без параметра bs (размер блока). Для этого в одной вкладке приготовимся запустить вот такую команду:

$ dd if=./MicroWin7.vmdk of=/dev/null

А в соседней вкладке быстро выполним в процессе этого копирования

$ ps axfu | grep ‘ dd ‘
$ kill -USR1

Это позволит получить от dd данные о текущей скорости. Вуаля:

$ dd if=./MicroWin7.vmdk of=/dev/null
30219922+0 записей получено
30219921+0 записей отправлено
15472599552 байт (15 GB, 14 GiB) скопирован, 10,6856 s, 1,4 GB/s
51956736+0 записей получено
51956736+0 записей отправлено
26601848832 байт (27 GB, 25 GiB) скопирован, 18,3505 s, 1,4 GB/s

3). Попробуем другой файл, но укажем зверский размер блока:

$ dd if=./Fedora\ 26\ x64-disk001.vmdk of=/dev/null bs=4G
0+4 записей получено
0+4 записей отправлено
7416250368 байт (7,4 GB, 6,9 GiB) скопирован, 4,77266 s, 1,6 GB/s

4). Повторим ранее читавшийся файл + укажем опцию читать крупным блоком, выполним пару раз:

$ dd if=./MicroWin7.vmdk of=/dev/null bs=4G
0+11 записей получено
0+11 записей отправлено
23622275072 байт (24 GB, 22 GiB) скопирован, 9,64067 s, 2,5 GB/s

$ dd if=./MicroWin7.vmdk of=/dev/null bs=4G
0+13 записей получено
0+13 записей отправлено
26601848832 байт (27 GB, 25 GiB) скопирован, 3,9037 s, 6,8 GB/s

Кэш он такой, да.

5). Ну и финальный тест — одновременный запуск 18 виртуалок. На обычном диске — это выстрел в голову и ощутимо тупящая несколько минут система, насилующая жесткий диск со страшным скрежетом, пока все виртуалки не стартанут =)

На NVMe SSD это плавный одновременный старт всех ВМ и уже через 10-15 секунд почти все они будут полностью загруженные, и это с учётом POST-процедур самого виртуалбокса и таймаутов! Очень позитивно. ВМ у меня не самые злые в плане аппетитов на оперативку, там много всяких мелких линуксов, в 10 Гб оперативки влезло.

Гамы тоже стартовать начинают очень бодренько, IOPS-ы рулят.

Не знаю, как насчёт 2500, но 1400-1600 при чтении есть стабильно в любых вариантах. 2500 видимо достигаются только в каких-то хитрых условиях, при использовании оптимизированных драйверов (у меня девайс запустился на встроенных модулях ядра nvme_core / nvme из 4.13, возможно, в текущем ядре этот модуль недостаточно оптимизирован и это пофиксят в будущем) или при использовании особой маркетингово-синтетической магии. Буду рад, если кто разъяснит.

А вот на запись никаких странностей нет — файл из tmpfs пишется примерно с той скоростью, какая указана в характеристиках.

Всем приятных апгрейдов.

- комментарии