Протокол Non-Volatile Memory Express (NVMe) как шаг к светлому будущему SSD с интерфейсом PCIe

как шаг к светлому будущему SSD с интерфейсом PCIe

Мы уже протестировали далеко не один твердотельный накопитель с интерфейсом PCIe, но все попадавшие к нам в руки устройства старательно эмулировали «традиционные» дисковые устройства. Что, впрочем, не мешало им демонстрировать высокую производительность. Просто потому, что, во-первых, SSD по-определению быстрее «механики», а во-вторых (как следствие), для них уже актуален вопрос пропускной способности интерфейса подключения, в чем несколько линий PCIe однозначно превосходят SATA. Однако нужна ли массиву ячеек памяти способность «прикидываться» априори медлительным блочным устройством, типа винчестера или и вовсе накопителя на оптических дисках? Очевидно, что производительности промежуточные уровни иерархии не добавляют: чем прямее путь, тем выше скорости. Однако с точки зрения совместимости «стандартные» интерфейсы предпочтительны. Но ведь PCIe изначально эту самую совместимость ограничивает, так что как только речь зашла о его использовании, производители сразу же задумались и о соответствующей программной прослойке: чтоб в ней не было ничего лишнего для SSD, зато учитывались все их особенности. Так появился интерфейс NVMe: Non-Volatile Memory Express.

Сейчас постепенно начинается и его продвижение в массовый сектор, причины чего были нами указаны в предыдущей статье цикла: PCIe-накопители наконец-то получили стандарт универсального воплощения, пригодного для широкого класса компьютеров, в виде М.2. Однако есть сомнения, что на этом пути все будет гладко, о чем мы сегодня и поговорим. А также оценим плюсы и минусы NVMe на примере пары устройств корпоративного класса, где эта технология уже применяется где-то с год, благо и проблем внедрения меньше.

От дискет к AHCI

Для начала устроим небольшой экскурс в историю — лет так на 30 назад, во времена появления первых персональных компьютеров. Несмотря на то, что и сегодняшние «монстры» в определенной степени совместимы с тогдашними «мастодонтами», подход к конструкции последних был совсем иным, нежели принят сейчас. Например, оригинальная IBM PC не только не снабжалась винчестером, но и могла работать даже без дисковода — с бытовым магнитофоном. Естественно, стандартизовать тогда интерфейс для подключения быстрых накопителей не было нужды, да и самих таких накопителей особо не водилось в массовом исполнении, ибо стоили слишком дорого (это сейчас флэш-память продается по цене менее доллара за гигабайт, а когда-то килобайт на жестком диске стоил дороже). Впрочем, уже в РС ХТ винчестер появился, а необходимый для него контроллер, как и следовало ожидать, устанавливался в разъем шины расширения на системной плате. Время было такое — все контроллеры именно так и подключались :)

Некоторое время жесткие диски в персональных компьютерах использовали интерфейс ST-506/412, где вся управляющая логика была вынесена на контроллер компьютера, а плата электроники самого винчестера содержала только модули аналоговой обработки и управления шпиндельным двигателем, позиционером и коммутатором головок. Время было такое — торопиться было особо некуда. И много дисков подключать тоже, так что всех устраивало подключение не более двух винчестеров, для чего приходилось использовать аж три кабеля (два в случае одного накопителя). Скорость передачи данных от винчестера к компьютеру по интерфейсу была даже ниже способностей тогдашних тихоходов. В общем, такое вот странноватое решение, тем не менее, работавшее и относительно недорогое.

Однако производительность компьютеров росла, что давало им возможности решать все более широкий круг задач, а это в свою очередь не могло не сказаться на периферийном оборудовании: хотелось подключать большее число более разнообразных устройств, работающих с более высокой скоростью. ST-506/412 такие потребности «не тянул». Результатом чего были попытки разработать улучшенный интерфейс жестких дисков (ESDI) или портировать на персоналки привычный по рабочим станциям интерфейс SCSI, но все кончилось тем, что стандартом стал интерфейс IDE (он же ATA). Общим между всеми перечисленными являлось то, что немалое количество электроники «переехало» на плату винчестера, что позволило последнему полностью инкапсулировать в себе все свои особенности, обмениваясь с компьютером стандартными командами и блоками информации. Различия как всегда крылись в деталях реализации, сложности и цене. Так, например, при создании ESDI производители постарались сделать нечто максимально похожее на ST-506/412 внешне, но более быстрое и не слишком сложное. SCSI изначально поражал своей гибкостью и универсальностью, но стоил слишком дорого (а так оно всегда и бывает). Создатели же АТА делали дешевый и простой интерфейс. Именно поэтому он был очень похож на ST-506/412 программно, но обходился одним кабелем. В отличие от SCSI не был рассчитан на внешние устройства (что сильно упрощало работу и снижало стоимость), а первое время вообще ориентировался только на винчестеры. Позднее появилось расширение ATAPI, представлявшее собой по сути реализацию SCSI-команд поверх физического интерфейса АТА, и… Он надолго стал стандартом для персональных компьютеров, со временем «встроившись» непосредственно в чиспеты.

Спустя несколько лет, впрочем, выяснилось, что АТА «выбрал» все возможности модернизации. За это время пропускная способность интерфейса выросла до 133 МБ/с, однако дальнейшее ее увеличение на параллельном интерфейсе было затруднительным. Кроме того, недостатком АТА можно было считать устаревшую схему подключения двух дисковых устройств на один канал, фактически унаследованную еще от ST-506/412. Справиться с подключением нескольких устройств можно было увеличением числа каналов (что к тому моменту было уже сделано — большинство «чипсетных» АТА-контролеров поддерживало два канала, т.е. до четырех устройств), а вот их взаимное влияние друг на друга и «дележка» пропускной способности оказывались неустранимыми особенностями. Неустранимыми, во всяком случае без изменения концепции. Поэтому пришлось заняться ей и перейти с параллельного АТА на последовательный SATA. Попутно перешли и к звездообразной топологии, когда каждый канал стал независимым от других за пределами контроллера, а также увеличилась пропускная способность интерфейса до 150 МБ/с с возможностью дальнейшего роста.

В принципе, еще во времена параллельного АТА пропускная способность уже стала несколько избыточной для тогдашних устройств, основными из которых продолжали оставаться винчестеры и оптические накопители. Собственно, немудрено, что разработчики озадачились и другими вопросами. В частности, реальную производительность дисковых устройств можно повысить путем грамотной оптимизации запросов — чтобы минимизировать перемещение головок. Но для того, чтобы оптимизировать обращения к диску, надо не спешить их выполнять, а создавать очередь команд, которую потом и переупорядочивать. Такие механизмы появились еще до внедрения SATA, но TCQ стандартом не стала, а вот NCQ — давно уже стандартная функция для всех SATA-контроллеров. Очередь команд обычно имеет небольшую глубину, поскольку все, что нам нужно в случае винчестера — оптимизировать последовательность «перебора» цилиндров, и одна, поскольку никакого внутреннего параллелизма в массовых «механических» накопителях просто нет. Он может появиться только при использовании нескольких дисковых устройств и объединении их в RAID-массив, но этим соответствующие контроллеры и пользуются. Чипсетные, кстати, редко — хотя производительность чтения данных в двухдисковом массиве RAID1 например можно удвоить, используя чередование запросов к дискам, чипсеты Intel это не используют. Но даже их применение в таком качестве не является массовым, а более сложные RAID-контроллеры и вовсе встречаются лишь в специфических нишах. Собственно, именно по этой причине (большинство компьютеров снабжаются лишь одним-двумя «последовательными однозадачными» накопителями) какой-то параллелизм стандартам подключения дисковых устройств был не нужен. А большие «внутренние» задержки при доступе к информации, вызванные работой механики, позволяли не слишком заботиться и о накладных расходах на обеспечение работы интерфейса.

Так AHCI и работает. И, в общем-то долгое время протокол устраивал всех. Однако приход твердотельных накопителей в массовый сегмент заставил производителей задуматься…

Non-Volatile Memory Express: что нового

01.png

Причина этой глубокой задумчивости хорошо видна на картинке. В общем-то наибольший вклад в задержки как давал собственно «носитель данных», так ничего не изменилось, но… Но для механических накопителей средние задержки при выполнении команд составляли порядка 2 мс, а использование флэш-памяти позволяет сократить это время примерно в 20 раз — до 100 мкс. На фоне первого значения 25–30 мкс по вине драйверов и контроллеров просто теряются, но на фоне второго они уже очень заметны. «Устранение» из цепочки SATA-контроллера путем эмуляции его функций собственно контроллером твердотельного накопителя в «AHCI PCIe SSD» экономят более 10 мкс, а прекращение эмуляции AHCI и переход на специализированный программный интерфейс и вовсе сокращают накладные расходы до пяти микросекунд. Повторимся — основным виновником задержек продолжает оставаться собственно флэш-память, но суммарно они сокращаются в полтора раза. Ожидать такого же взрывного эффекта, как от отказа от механики, не стоит — все-таки 20 раз не 1,5. Но и получить на «пустом месте» полуторократное уменьшение задержек тоже хорошо. Тем более, что суммарный эффект оказывается кумулятивным — к нему добавляется и общее увеличение пропускной способности интерфейса, присущее SSD с подключением к PCIe.

На чем еще можно выгадать? На увеличении параллелизма при обработке команд. Как уже было сказано выше, винчестеры обрабатывают команды последовательно, поскольку блок головок в каждый момент времени может находиться только над одним конкретным цилиндром. Все, что дает очередь команд — возможность оптимизировать перемещения головок чтения/записи, что тоже немало, однако слабо применимо к SSD, которые, по сути своей, являются параллельными устройствами. Даже самые простые контроллеры поддерживают четыре канала флэш-памяти, при «традиционном» подходе объединяющиеся в один для полной эмуляции AHCI. Но если последняя нам не нужна, то все каналы можно считать независимыми накопителями. Соответственно, задачей драйвера и контроллера является «раскидывание» запросов по каналам, а дальше каждый из них будет обрабатывать свои команды наиболее эффективным образом. Т.е. очередей должно быть несколько и, желательно, максимально глубоких — это позволит выжать из флэш-памяти все (например, пока одни блоки будут перезаписываться, в идеале из других можно читать данные, не дожидаясь окончания длительных операций). Но AHCI, где очередь команд всего одна на каждое устройство, да еще и глубиной в 32 команды нам здесь ничем не поможет. «Родные» же для NVMe возможности куда серьезнее: до 64К (65536 в «некомпьютерных единицах») очередей и до 64К команд в каждой. Разумеется, сегодня такой простор пока не используется, но запас на будущее внушает оптимизм :)

Конечно, есть в стандарте и другие оптимизации, но главное уже понятно — в отличие от AHCI, который разрабатывался для максимальной совместимости с разными устройствами, уже существовавшими на тот момент, NVMe является специализированной разработкой, во многом нацеленной в будущее. Т.е. не стоит зацикливаться только на флэш-памяти — есть подозрения, что некоторые возможности протокола раскроются при освоении новых стандартов энергонезависимой памяти. В особенности — с низкими собственными задержками. Но пока многообразия твердотельных накопителей на рынке нет, так что NVMe используется именно с устройствами на флэше. Для механических накопителей он, очевидно, не нужен. А есть ли смысл переводить хотя бы все SSD на него? В перспективе — возможно. Прямо сейчас — есть…

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

Вернемся к протоколу AHCI и вспомним — что мы о нем знаем? Во-первых, появился очень давно, так что непосредственно поддерживается не только современными, но и устаревшими операционными системами. Во-вторых, собственно «поддержка» в его случае достаточно проста: в идеале системе вообще не нужно вдаваться в особенности функционирования конкретного устройства, поскольку все инкапсулируется на уровне контроллера. Собственно, для компьютера такой твердотельный накопитель с интерфейсом PCIe это всего лишь очередной дисковый контроллер, работать с которыми «учили» еще DOS и BIOS. Соответственно, даже очень старая система должна легко «переваривать» его добавление, благо и на аппаратном уровне никаких особенностей нет.

Что в этом плане меняет NVMe? Да, практически, все: ведь основной целью его разработки является упразднение промежуточных уровней — как раз привычных и проверенных временем. В частности, придется забыть о загрузке в Legacy-режиме — только UEFI. Также возможны проблемы и с прошивками некоторых системных плат, на которые мы наткнулись, и даже с чипсетами — Intel, например, гарантирует поддержку NVMe для чипсетов «девятого» семейства, а вот с предыдущими возможны варианты. Кроме того, потребуется специальный драйвер. Поддержка NVMe, впрочем, уже встроена в Windows 8.1, Windows Server 2012 R2 и Linux, начиная с версии ядра 3.10, но этими системами список используемых потребителями не ограничивается. А драйверная поддержка более старых систем остается на усмотрение производителя и может быть ограниченной: к примеру, только версии х64 Windows 7, но не х86. В частности, с этим мы столкнулись, получив два SSD корпоративной серии Intel, что привело к невозможности их тестирования по «стандартной методике» для накопителей — на обычно используемом стенде с платой на базе чипсета Z77 они вообще не заработали, да если бы и определились, легче бы от этого не стало: мы используем Windows 7×86, а она на тот момент Intel не поддерживалась. Кстати, есть и еще одна проблема с внедрением стандарта: во-первых контроллеры с поддержкой NVMe рассчитаны в основном на PCIe 3.0, а во-вторых, раз уж речь заходит о минимизации задержек, максимальная производительность достигается при подключении устройства непосредственно к процессору без промежуточных хопов в виде чипсета. Что из этого следует? То, что весь потенциал технологии без проблем может быть раскрыт только на системах с LGA2011–3 (или, в крайнем случае, предыдущей версией этого сокета) — процессоры для этой платформы в избытке снабжены линиями PCIe 3.0. Что же касается массовой LGA1150, то там придется «урезать» по пропускной способности шины видеокарту &m

Полный текст статьи читайте на iXBT