Для большинства рабочих станций и игровых ПК ощущение от NVMe SSD определяют задержка случайного чтения блоками 4K при малой глубине очереди, скорость записи после заполнения SLC-кэша, наличие DRAM или грамотно сделанного HMB и охлаждение, а не пиковая последовательная скорость на коробке. PCIe 5.0 окупается только тогда, когда нагрузка постоянно передает большие файлы, а накопитель стоит в слоте x4, подключенном к процессору. Серверу нужны еще два свойства: ресурс, выраженный в DWPD, и защита от потери питания. Ниже показано, как проверить каждый пункт с помощью fio, smartctl и nvme-cli.
Последовательная скорость и случайные 4K при малой глубине очереди
Последовательную скорость измеряют крупными блоками при глубокой очереди. Она описывает копирование видео, восстановление образа диска или загрузку весов модели. Компиляция кода, запуск приложений и запросы к базе данных, которая не помещается в RAM, наоборот, порождают мелкие чтения, и каждый поток обычно ждет завершения одного чтения, прежде чем отправить следующее. Накопитель в таком случае видит очередь из одной или нескольких команд.
При глубине очереди 1 IOPS равны одной секунде, деленной на среднюю задержку. Если чтение 4 KiB занимает 80 микросекунд, поток получает 12 500 IOPS, то есть около 51 MB/s. Если задержка уменьшится вдвое, эта цифра удвоится, а удвоение пропускной способности PCIe не изменит ничего. Поэтому накопители с очень разной последовательной скоростью на настольном компьютере могут ощущаться одинаково.
Ищите результаты случайного чтения и записи 4K при QD1, а также задержки p99 или p99.9 под смешанной нагрузкой. То, чего производители не публикуют, измерьте заданиями fio, приведенными ниже. Серверу нужны и IOPS при большой глубине очереди, потому что множество клиентов создает реальный параллелизм. Индекс HNSW, который не помещается в память, как в руководстве по гибридному поиску на pgvector, превращает каждый запрос в цепочку зависимых случайных чтений, где хвостовая задержка важнее GB/s.
Поколение PCIe, число линий и подключение слотов M.2
PCIe 3.0, 4.0 и 5.0 работают на скоростях 8, 16 и 32 GT/s на линию с кодированием 128b/130b. Предел в одном направлении равен GT/s × 128/130 ÷ 8 GB/s на линию, поэтому канал x4 дает около 3,9, 7,9 и 15,8 GB/s до учета накладных расходов протокола. Накопитель и слот согласуют наибольшее поколение и ширину, которые поддерживают оба: накопитель PCIe 5.0 в слоте PCIe 4.0 работает на скорости 4.0, а накопитель x4 в слоте x2 получает половину линий.
На настольных платах часть слотов M.2 использует линии процессора, а часть подключена к чипсету. У чипсета один канал к процессору, и его делят USB, SATA, сеть и все остальные слоты чипсета. Платы также разделяют линии: установка накопителя в определенный слот M.2 может отключить порты SATA или перевести графический слот в режим x8. Схема подключения или таблица слотов в руководстве к материнской плате показывает, что куда подключено. Прочитайте ее до покупки.
Системный диск и самый активный проект или базу данных ставьте в слот, подключенный к процессору, а слоты чипсета используйте для игр и архивов. PCIe 5.0 оправдан для видео с высоким битрейтом, копирования наборов данных и загрузки больших файлов моделей, о которой рассказывает руководство по железу для локальных LLM. Для игр и обычной разработки хороший накопитель PCIe 4.0 с низкой задержкой при QD1 обычно оказывается лучшим выбором.
Проверьте согласованный канал
Сравните текущие параметры канала с максимальными в sysfs:
cd /sys/class/nvme/nvme0/device
cat current_link_speed current_link_width max_link_speed max_link_width
Накопитель PCIe 4.0 x4 в подходящем слоте сообщает 16.0 GT/s PCIe и ширину 4. Меньшее значение указывает на разводку слота, принудительно выбранное поколение в настройках прошивки, райзер или разделение линий.
Контроллер, кэш DRAM и HMB
Контроллер сопоставляет логические адреса страницам NAND через слой трансляции флеш-памяти (FTL). Плоской таблице с 4-байтовой записью на каждую страницу 4 KiB нужна 1/1024 емкости. Отсюда и известное соотношение примерно 1 GB DRAM на 1 TB NAND. Накопитель с DRAM держит большую часть таблицы рядом с контроллером, поэтому случайные чтения по большому диапазону адресов остаются быстрыми.
Накопители без DRAM используют Host Memory Buffer (HMB) и занимают часть системной памяти под фрагмент таблицы. Накопитель запрашивает объем в поле hmpre структуры Identify Controller в единицах по 4 KiB, а Linux ограничивает его параметром nvme.max_host_mem_size_mb, по умолчанию 128 MiB на контроллер. HMB подходит для настольных сценариев, которые затрагивают ограниченную часть накопителя. Он помогает меньше, когда случайный ввод-вывод охватывает сотни гигабайт, как у баз данных и образов виртуальных машин.
nvme id-ctrl /dev/nvme0 | grep -E '^(mn|fr|hmpre|hmmin|vwc|wctemp|cctemp) '
cat /sys/module/nvme/parameters/max_host_mem_size_mb
Ненулевое значение hmpre у накопителя без DRAM подтверждает поддержку HMB. Буфер небольшой, но если памяти в системе уже не хватает, подобрать объем поможет руководство по памяти DDR5.
TLC, QLC и SLC-кэш
TLC хранит три бита в ячейке, QLC четыре. Больше битов на ячейку дают больше емкости на кристалл, но запись идет медленнее, а число циклов программирования и стирания меньше. Потребительские накопители скрывают медленную запись SLC-кэшем: входящие данные записываются по одному биту на ячейку и позже переносятся в TLC или QLC.
Кэш конечен и часто динамический, то есть уменьшается по мере заполнения накопителя. Когда длинная запись исчерпывает кэш, скорость падает до уровня после кэша, и у QLC он, как правило, ниже. Рекомендации Ceph по оборудованию называют это эффектом обрыва (cliffing) и предупреждают, что устойчивая производительность после заполнения ограниченного кэша может заметно снизиться.
Ищите в обзорах или спецификациях размер кэша при заданной заполненности и скорость записи после кэша. Если вы часто записываете десятки гигабайт за раз, например при импорте видео, копировании образов ВМ или резервном копировании, выбирайте TLC и оставляйте свободное место. QLC подходит для библиотек, которые в основном читаются: игр, медиафайлов и файлов моделей.
Ресурс: TBW, DWPD и гарантия
TBW — это рейтинг ресурса из JEDEC JESD218: число десятичных терабайт, которое хост может записать при нагрузке, заданной для класса накопителя, пока накопитель сохраняет емкость и соответствует требованиям к частоте ошибок, частоте отказов и хранению данных без питания. DWPD выражает тот же бюджет в перезаписях за день гарантийного срока:
DWPD = TBW / (capacity_TB × 365 × warranty_years)
TBW = DWPD × capacity_TB × 365 × warranty_years
Условный накопитель на 2 TB с рейтингом 1200 TBW и гарантией пять лет дает 1200 / (2 × 365 × 5), примерно 0,33 DWPD. Настольный компьютер, который записывает 50 GB в день, за пять лет израсходует около 91 TB. Базе данных, которая ежедневно перезаписывает весь накопитель, нужно больше, и Ceph советует для нагруженных пулов накопители с рейтингом от 1 DWPD.
Запись хоста не равна записи в NAND. Мелкие случайные записи, заполненный накопитель и отсутствие TRIM повышают коэффициент усиления записи (WAF). Разобранный в материалах JEDEC пример оценивает ресурс как TBW < (capacity × NAND P/E cycles) / (2 × WAF). Оставляйте свободное место, включайте TRIM и для нагрузки с интенсивной записью берите большую емкость.
Многие потребительские гарантии заканчиваются по истечении срока или по достижении заявленного TBW, в зависимости от того, что наступит раньше. JESD218 также задает срок хранения данных без питания для накопителя, выработавшего заявленный ресурс: один год при 30 °C для клиентского класса и три месяца при 40 °C для корпоративного. Обесточенный SSD не является архивом, поэтому следуйте руководству по резервному копированию 3-2-1.
Нагрев, троттлинг и радиаторы
Каждый контроллер публикует в Identify Controller два порога. При WCTEMP он продолжает работу, но ему нужно больше охлаждения или меньше нагрузки. При CCTEMP он может резко снизить производительность, отключиться или потерять данные. Базовая спецификация NVM Express 2.4 задает эти температуры в кельвинах и рекомендует порог предупреждения 343 K, примерно 70 °C.
Накопителям PCIe 5.0 и быстрым PCIe 4.0 под длительной нагрузкой обычно нужен радиатор. Используйте один радиатор, либо крышку M.2 на плате с термопрокладкой, либо собственный радиатор накопителя, и убедитесь, что через него проходит поток воздуха. В ноутбуках и компактных корпусах накопитель с меньшим энергопотреблением может выдать больше устойчивой работы, чем более быстрый, который троттлит. Журнал SMART считает минуты, проведенные на каждом пороге или выше. Если счетчик предупреждений растет при обычной работе, улучшите охлаждение.
Защита от потери питания и корпоративные накопители
Клиентские накопители подтверждают запись, как только данные попадают в энергозависимый буфер, и рассчитывают, что хост сбросит его командой flush до отключения питания. Журнал SMART учитывает внезапные отключения в поле Unexpected Power Losses, которое в прежних редакциях спецификации называлось Unsafe Shutdowns, а сама спецификация предупреждает, что на накопителях без защиты от потери питания возможно повреждение данных.
Корпоративные накопители с защитой от потери питания (PLP) используют конденсаторы, чтобы после пропадания питания записать буферизованные данные и метаданные в NAND. Подтвержденные записи сохраняются, а flush завершается без ожидания NAND. Поэтому программы, которые постоянно вызывают fsync, например базы данных, журналы упреждающей записи, устройства ZFS intent log и Ceph, работают быстрее и предсказуемее, и Ceph рекомендует корпоративные накопители с PLP.
nvme id-ctrl /dev/nvme0 | grep -E '^vwc '
cat /sys/block/nvme0n1/queue/write_cache
Поле vwc показывает, сообщает ли контроллер об энергозависимом кэше записи, а значение write back в write_cache означает, что Linux отправляет накопителю команды flush. Окончательный ответ о наличии PLP дает спецификация накопителя. Никогда не отключайте flush или барьеры файловой системы на клиентском накопителе ради цифр в бенчмарке.
Тестирование нового накопителя с fio
Тестируйте до того, как на накопителе появятся данные, и используйте файлы на его файловой системе, потому что запись на сырое устройство вроде /dev/nvme0n1 уничтожает содержимое. Задания используют прямой ввод-вывод и io_uring. На старых ядрах укажите --ioengine=libaio. fio заранее создает тестовый файл, поэтому чтения попадают на записанные данные.
cd /mnt/newdrive
# Случайное чтение 4K при глубине очереди 1: то, что ощущает настольный ПК
fio --name=qd1-randread --filename=fio.test --size=32G \
--ioengine=io_uring --direct=1 --rw=randread --bs=4k \
--iodepth=1 --time_based --runtime=60 --ramp_time=5 \
--lat_percentiles=1 --percentile_list=50:99:99.9
# Смешанный случайный 4K с параллелизмом: ближе к нагруженному серверу
fio --name=qd32-randrw --filename=fio.test --size=32G \
--ioengine=io_uring --direct=1 --rw=randrw --rwmixread=70 --bs=4k \
--iodepth=32 --numjobs=4 --group_reporting --time_based --runtime=120
# Последовательная запись за пределы SLC-кэша, пропускная способность раз в секунду
fio --name=seqwrite-cliff --filename=fio-big.test --size=300G \
--ioengine=io_uring --direct=1 --rw=write --bs=1M --iodepth=8 \
--write_bw_log=cliff --log_avg_msec=1000
В задании QD1 смотрите на среднюю задержку и p99, а не только на IOPS. В смешанном задании сравнивайте задержку p99.9 у разных накопителей. Объем для задания с обрывом задайте больше ожидаемого кэша, но меньше свободного места. Задание пишет cliff_bw.1.log, по строке в секунду со временем в миллисекундах и пропускной способностью в KiB/s, а график покажет скорость в кэше, обрыв и возможный троттлинг. После теста удалите файлы. Все использованные параметры описаны в документации fio.
Состояние накопителя в smartctl и nvme-cli
smartmontools и nvme-cli читают один и тот же журнал SMART / Health Information:
smartctl -x /dev/nvme0
nvme smart-log /dev/nvme0
В nvme-cli 3.0, вышедшем в сентябре 2026 года, команды переименованы в формы вроде nvme log smart и nvme id ctrl. Использованные здесь имена через дефис остаются устаревшими псевдонимами и работают также в nvme-cli 2.x.
- Critical Warning: любой ненулевой бит требует действий. Биты описывают запас резервных блоков, температуру, надежность и перевод носителя в режим только для чтения.
- Available Spare: оставшийся резерв в процентах. Снижение к Available Spare Threshold означает, что накопитель выводит блоки из работы.
- Percentage Used: оценка израсходованного ресурса от производителя. Значение может превышать 100, и само по себе это не означает отказ.
- Data Units Written: тысячи единиц по 512 байт. Умножьте на 512 000, чтобы получить байты: 10 000 000 единиц равны 5,12 TB. Записывайте значение раз в месяц, чтобы узнать свой реальный DWPD.
- Media and Data Integrity Errors: невосстановленные ошибки. Любой рост означает, что резервные копии нужно проверить немедленно.
Самотестирование и прошивка
smartctl -t short /dev/nvme0
smartctl -l selftest /dev/nvme0
nvme fw-log /dev/nvme0
fwupdmgr get-updates
fwupdmgr update
Самотестирование устройства в спецификации NVMe необязательно, поэтому некоторые накопители его отклоняют. Настройте smartd или систему мониторинга на оповещения по перечисленным полям. Прошивка влияет на производительность, управление питанием и обработку ошибок, поэтому перед обновлением читайте примечания к выпуску и делайте резервную копию. Плагин NVMe в fwupd устанавливает обновления от производителей, которые публикуют их в LVFS, и активирует их при следующей перезагрузке. Для остальных производителей нужна их собственная утилита или nvme fw-download и nvme fw-commit с их образом. В зеркале сначала обновляйте один накопитель. Если накопитель пропадает с шины в Linux, сначала поищите исправление в прошивке; параметр ядра nvme_core.default_ps_max_latency_us=0 отключает автономные переходы между состояниями питания как диагностический шаг.
Выравнивание разделов и TRIM в Linux
fdisk и parted выравнивают разделы по топологии ввода-вывода, которую сообщает устройство, поэтому оставляйте их значения по умолчанию и проверяйте результат:
lsblk -t /dev/nvme0n1
parted /dev/nvme0n1 align-check optimal 1
nvme id-ns -H /dev/nvme0n1 | grep 'LBA Format'
Команда parted align-check сообщает, выровнен ли раздел 1 оптимально. Последняя команда перечисляет поддерживаемые форматы LBA и отмечает активный. Многие накопители поставляются с секторами 512 байт и поддерживают также 4096 байт. nvme format --lbaf=<n> меняет формат, но стирает пространство имен, поэтому решайте до записи данных и после проверки, что загрузчик, слой RAID и гипервизор работают с устройствами 4Kn.
TRIM сообщает накопителю, какие блоки свободны, поэтому сборка мусора не копирует устаревшие страницы, усиление записи снижается, а скорость после кэша держится. Предпочитайте периодический TRIM:
sudo systemctl enable --now fstrim.timer
sudo fstrim -av
lsblk --discard
Руководство fstrim считает еженедельный TRIM достаточным для большинства настольных систем и серверов и предупреждает, что частый TRIM или опция монтирования discard могут сократить срок службы некачественных SSD. Btrfs начиная с ядра 6.2 автоматически включает discard=async на устройствах, которые это поддерживают. Ненулевые значения DISC-GRAN и DISC-MAX в выводе lsblk --discard означают, что запросы discard доходят до устройства. dm-crypt по умолчанию игнорирует discard, поскольку такие запросы могут раскрыть, какие блоки заняты. Включайте их опцией discard в crypttab или флагом --allow-discards только если такая утечка допустима. Оставляйте и свободное место, потому что SLC-кэшу и сборке мусора нужны свободные блоки.
Выбор накопителя под задачу
| Требование | Игровой ПК | Рабочая станция разработчика или автора контента | Сервер БД или виртуализации | Хранилище для чтения |
|---|---|---|---|---|
| Интерфейс | PCIe 4.0, 5.0 по желанию | PCIe 4.0 или 5.0 в слоте процессора | U.2, E1.S, E3.S или M.2 22110 | PCIe 4.0 или 3.0, слот чипсета |
| Случайные 4K при QD1 | Высокий приоритет | Высокий приоритет | Высокий, плюс IOPS при большой очереди и p99.9 | Низкий приоритет |
| DRAM или HMB | HMB допустим | Лучше DRAM | DRAM | HMB допустим |
| NAND | TLC, QLC для библиотеки игр | TLC | Корпоративный TLC | QLC допустим |
| Запись после кэша | Низкий приоритет | Высокий приоритет | Устойчивая скорость по спецификации | Низкий, если импорт небольшой |
| Ресурс | 0,3 DWPD достаточно | Рассчитайте по своей записи | От 1 DWPD | Низкий приоритет |
| Защита от потери питания | Не нужна | Полезна для локальных БД | Обязательна | Не нужна |
| Охлаждение | Радиатор платы | Радиатор и поток воздуха | Обдув корпуса сервера | Радиатор платы |
Чек-лист до и после покупки
- Опишите нагрузку: объем записи в день, самую большую разовую запись, характер доступа и программы, активно вызывающие fsync.
- Проверьте в руководстве к плате, какие слоты M.2 подключены к процессору и что они отключают.
- Для интенсивной случайной нагрузки и записи берите TLC с DRAM, а HMB или QLC оставьте для ролей, где данные в основном читаются.
- Рассчитайте DWPD по TBW и прочитайте условия гарантии.
- Для серверов требуйте PLP, рейтинг DWPD и способ обновления прошивки.
- Установите один радиатор с обдувом и через неделю проверьте температурные счетчики.
- После установки проверьте скорость и ширину канала и запишите версию прошивки.
- Запустите три задания fio и сохраните результаты как базовую линию.
- Включите
fstrim.timer, проверьте выравнивание и определитесь с форматом LBA до записи данных. - Следите за Critical Warning, ошибками носителя, Available Spare и Percentage Used и храните резервные копии на других носителях.