Как работает SSD - устройство, для чего нужен контроллер

Давайте сегодня поговорим об SSD, но не в плане рассмотрения той или иной модели или сравнения оных между собой с целью выявления оптимальной покупки. Цель – узнать, что такое твердотельный накопитель как таковой, из каких частей состоит и как эти самые части работают сами по себе, как общаются между собой, ибо подозреваю, что и сам имею некоторые пробелы в знаниях по этой теме. Возможно, имеет смысл разбить это на несколько статей, и сегодня попытаемся чуть глубже ответить на вопрос: как работает SSD – что такое контроллер и для чего он нужен.

Блок-схема SSD накопителя

«―Тигр, в основном, состоит из трех частей».

К/ф «Полосатый рейс»

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

На приведенном рисунке можно выделить три основных компонента:

  • Контроллер.
  • Массив NAND памяти.
  • Микросхема DRAM в качестве кэша (опционально).
  • Интерфейс для связи с хостом (компьютер или иное устройство).
  • SSD_parts

Если обратиться к реальному SSD, то на фото все эти части выделены. Интерфейсный разъем в данном случае объединяет физическую и логическую составляющие интерфейса.

При этом неважно, что это за накопитель. Это может быть обычный SSD форм-фактора 2.5 дюйма, или более скоростной, использующий шину PCIe M.2 SSD, или даже флешка или SD карта памяти.

Думаю, постепенно мы рассмотрим все составляющие, но сегодня давайте ограничимся контроллером.

Архитектура контроллера SSD

«―Я тут нарисовал... начертил вам тигра. Конечно, как мог. В разрезе».

К/ф «Полосатый рейс»

Давайте посмотрим на блок-схему.

SSD_Controller_Diagram

На ней представлены основные части типичного контроллера SSD. Заодно схематически нарисована и NAND память, с которой у контроллера имеется устойчивая и непосредственная связь.

Данную блок-схему не следует воспринимать как догму. В зависимости от конкретной реализации контроллера в ней могут быть изменения. Так, популярные в бюджетных SSD (например, Crucial BX500) контроллеры, которые не используют внешнюю микросхему DRAM в качестве кэша, не имеют блока, отвечающего за работу с этим чипом.

Кратко опишу назначение блоков:

  • Host Interface. Отвечает за взаимодействие с хостом, используя тот или иной интерфейс. Наиболее часто используются сейчас SATA, PCIe, USB, SD.
  • SMART (Self-Monitoring, Analysis and Reporting Technology). Система мониторинга состояния накопителя, отображающая информацию по нему. С ее помощью можно определить текущие параметры SSD (например, температуру), количество записанной информации, наличие ошибок и т. п. У разных производителей набор показываемых параметров разный.
  • Wear Leveling. Блок, отвечающий за «выравнивание износа» – механизм, позволяющий следить за выполнением циклов записи/стирания ячеек для равномерного износа ячеек.
  • Read & Program Disturb. Программный или аппаратный блок, отвечающий за предотвращение случайного изменения значений ячеек NAND.
  • Encrypt & Decrypt Engine. Блок, отвечающий за шифрование данных. В большинстве случаев используется алгоритм AES с длиной ключа 128 или 256 бит.
  • Buffer/Cache. Блок, отвечающий за работу с внешней микросхемой DRAM, используемой в качестве кэша.
  • CPU/RISC Processor. Собственно, основа контроллера, процессор, который может иметь одно или несколько ядер. Производительность накопителя в большой степени зависит именно от количества и быстродействия процессорных ядер.
  • ECC Engine. Внутренняя система коррекции ошибок.
  • Write Abort. Механизм, контролирующий исчезновение питающего напряжения в момент записи данных или обновления служебной информации. Это может привести к потере данных и нарушениям в работе накопителя. Обычно используется в SSD корпоративного класса.
  • NAND Memory Interface. Блок, отвечающий за обмен данными с чипами NAND памяти. В зависимости от контроллера может иметь несколько каналов.
  • Defect (Bad Block) Management. Блок, отвечающий за мониторинг состояния ячеек, определение ошибок, за замену вышедших из строя ячеек резервными.

Интерфейс между контроллером и NAND

Теперь имеет смысл остановиться на некоторых функциональных узлах контроллера несколько подробнее. Думаю, вполне логично начать с того, каким образом происходит основная работа – общение контроллера с флэш-памятью.

Наиболее распространенный, в силу разных причин, тип энергонезависимой памяти – NAND, т. е. с блочным доступом к хранимой информации. Доступа к отдельному биту, как в случае с типом памяти NOR, тут нет.

Для ускорения операций чтения/записи используется многоканальный доступ к чипам флэш-памяти, да и сама NAND может быть сгруппирована в несколько банков. В бюджетных моделях накопителей обычно есть 2-4 канала, в более производительных SSD используется 8 каналов, а то и больше.

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

Для увеличения производительности и емкости микросхем каждая из них может содержать в одном корпусе несколько кристаллов NAND, для ускорения доступа к которым используется функция чередования (interleaving). Мало того, в одном корпусе вполне могут уживаться контроллер и чипы NAND, как это сделано, например, в SSD Toshiba BG4.

Функции контроллера

«―А как же вы их не боитесь?

―У-укрощены. Вот хотите верьте, товарищи, хотите нет, укрощены лично... мною.»

к/ф «Полосатый рейс»

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

Выравнивание износа (Wear Leveling)

Всем известно, что NAND память, в отличие от оперативной, имеет ограниченный срок службы. Определяется он количеством циклов записи/стирания ячеек. В зависимости от типа флэш памяти (SLC, MLC, TLC и проч.) это значение составляет от нескольких тысяч до десятков или сотни тысяч циклов.

Сначала определимся с понятием «цикл». Он считается только при наличии операции стирания, т. е. чтение не является причиной деградаций ячеек флэш-памяти, как и самая первая операция записи в ячейку. В дальнейшем запись будет сопровождаться предварительным стиранием блока данных, а, значит, увеличивать счетчик циклов «запись/стирание» на 1.

Давайте посмотрим, как общается контроллер с памятью. Рассмотрим простой пример. Для простоты предположим, что размер данных составляет 4 КБ, что соответствует блоку NAND.

Хост, например, компьютер, посылает запрос к накопителю на чтение или запись информации, причем указывается Logical Block Address (LBA), из которого требуется считать или куда необходимо записать данные.

Wear_Leveling_Sequential

На иллюстрации показана ситуация, когда контроллер получил команду на запись 256 КБ данных. Он располагает их в 64-х последовательных физических (Physical Block Addresses) блоках в NAND, каждый блок может вместить 4 КБ информации. При этом график справа показывает, что в каждый блок информация записана один раз, и у всех у них цикл увеличился на единицу.

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

Wear_Leveling_Non_Sequential

К сожалению, реальность совсем иная. Рассмотрим другую ситуацию, более приближенную к реальной жизни, представленную на иллюстрации. Имеем блоки NAND, в которых записана некая информация, причем только в первых двух из них с той или иной периодичностью данные изменяются, а в других блоках информация используется только для чтения. Это вполне типично, например, для файлов операционной системы, многие из которых практически никогда не изменяются.

Что имеем в этом случае? Те блоки, в которых данные регулярно обновляются, активно расходуют ресурс, а в блоках, в которых лежат неизменяемые файлы, никакой «движухи» не происходит, т. е. часть ячеек практически "нецелованная", а часть изношена "в хлам".

Плохо? Конечно, но, к счастью, разработчики контроллеров знают о такой проблеме и используют механизм выравнивания износа. Суть в следующем. Зная ресурс ячеек, запись производится в разные ячейки таким образом, чтобы у них было одинаковым количество операций стирания, а те данные, которые изменяются редко, перемещаются в другие блоки.

Например, хост регулярно обновляет информацию в файле, расположенном в указанных Logical Block Address (LBA), но контроллер постоянно меняет физическое расположение блоков, сопоставляя их с указанным LBA. Для этого существует Translation Table, в которой хранится информация о том, какому логическому блоку LBA соответствует в данный момент физический блок.

Wear_Leveling_Logical_to_Physical_Translation

Таким образом, для хоста местоположение файла остается неизменным, и доступ к нему осуществляется по известному LBA, но вот физически файл регулярно оказывается в разных блоках. Контроллер по заданному алгоритму перемещает такие статические («холодные») данные между блоками для того, чтобы позволить ячейкам NAND равномерно подвергаться операциям записи/стирания, т. е. расходовать свой ресурс одинаково.

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

Сборка мусора (Garbage Collection)

В отличие от жестких дисков, для того, чтобы записать данные в блок NAND, необходимо его сначала очистить, т. е. выполнить операцию стирания. Недостаточно просто пометить его как неиспользуемый, как это делается в обычных HDD.

Давайте все опять рассмотрим на примере. Предположим, имеем два блока памяти, состоящих из страниц емкостью 4 КБ каждая. В каждом блоке по 32 страницы, т. е. общая емкость блока составляет 128 КБ.

Garbage_Collection1_Fresh_Pages

Теперь посмотрим, какие процессы происходят при работе накопителя.

Изначально все ячейки являются стертыми и готовыми записывать информацию.

Garbage_Collection2_Write10Pages

Давайте запишем на него файл, размер которого соответствует 10 страницам, т. е. 40 КБ. Тут все просто. Т. к. изначально накопитель пуст, и блоки помечены как пустые и «готовые к употреблению», первое стирание не требуется (оно уже выполнено). Процесс записи прост и выполняется линейно, фактически, на максимальной скорости.

Garbage_Collection3_Updating10Pages

Следующая задача – изменить записанные данные. Для такой операции информация считывается с накопителя, изменяется, и записывается обратно, но не на то же самое место, а в новые страницы блока данных. При этом первоначально использованные страницы помечаются как «нечитаемые», «грязные» (dirty), и в таком состоянии запись в них производиться не может.

Для того, чтобы опять «вернуть к жизни» эти страницы, их надо стереть, но проблема в том, что выполнить это можно только на целом блоке, а он у нас частично занят данными. Таким образом получается, что 10 страниц у нас хранят информацию, 10 ждут стирания, и остальные страницы готовы к принятию новых файлов.

Garbage_Collection4_FilingNANDBlock

Следующий этап – записываем новые данные. При этом происходит заполнение остатка блока – 12 страниц. (Это условный пример, а в действительности может требоваться больше места, но важным сейчас является то, что рассматриваемый блок заполняется полностью, а уж в какие блоки дописывается остаток файла - в данном случае без разницы.)

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

Garbage_Collection5_ChangingNANDBlocks

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

Дабы не снижать производительность, а наоборот, способствовать ей, «сборка мусора» обычно выполняется в момент простоя накопителя, т. е. тогда, когда обращений к нему нет. Это еще один механизм, позволяющий поддерживать быстродействие и способствовать долговечности SSD.

Команда TRIM

Эта команда непосредственно связана с вышеописанной функцией сборки мусора. Необходимость ее объясняется тем, что операционная система хоста оперирует файлами, а вот у контроллера накопителя свой «взгляд на данные», и он оперирует блоками, страницами. Возникает ситуация, когда после удаления файла в ОС контроллер накопителя не знает, какие блоки действительно используются, а какие уже можно использовать повторно.

TRIM_Without_TRIM

Здесь ярко проявляется разграничение полномочий, когда ОС ничего не знает о физическом расположении файлов, а SSD (читай – контроллер), знает, что в таких-то блоках есть актуальные данные, такие-то блоки чистые, и какое-то их количество ждет очистки. А вот когда операционная система удаляет файл из таблицы файлов, оказывается, что контроллер накопителя не очень то «в курсе», какая информация уже перестала быть актуальной и какие блоки можно затирать.

TRIM_With_TRIM

Для того чтобы привести все в порядок, используется команда TRIM, посылаемая ОС в накопитель, после чего его контроллер узнает о блоках, в которых информация перестала быть актуальной и которые можно пометить как «грязные», чтобы функция «уборки мусора» могла очистить эту часть ячеек и вернуть их в список готовых к записи.

Over-Provisioning

Под этим понятием подразумевают некую резервную область, которая недоступна пользователю, но используется контроллером SSD для выполнения операция сборки мусора, замещения вышедших из строя ячеек NAND и т. п. Как правило, размер этой области занимает 7% от емкости накопителя, ориентированного на массовый рынок, и 28% для SSD корпоративного уровня.

В действительности, можно отдать под Over-Provisioning бОльший объем, просто оставив неразмеченной часть накопителя, что позволит контроллеру использовать это место под выполнение своих служебных действий, но я не думаю, что есть смысл этим заниматься.

Изначально SSD уже имеет необходимый размер Over-Provisioning, к тому же, если есть большое желание несколько упростить жизнь контроллеру, обеспечить его достаточным объемом для эффективной работы, например, сборщика мусора, то вполне достаточно не заполнять накопитель «под завязку», а оставлять свободной порядка 20% от общей емкости, и SSD будет работать должным образом.

Bad Block Management

Как бы ни были эффективны механизмы выравнивания износа, сборки мусора и прочих хитрых и умных действий, ячейки изнашиваются, и с этим ничего не поделать. Мало того, они склонны «умирать», выработав свой ресурс. Для того, чтобы следить за этим процессом и своевременно заменить безвременно ушедшую ячейку на резервную, используется система мониторинга за плохими блоками.

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

Для пользователя SSD наличие дефектных и остаток резервных блоков – «информация к размышлению», ибо появление и активное расходование ячеек, предназначенных для замены вышедших из строя – серьезный повод забеспокоиться о сохранности данных и о поиске нового накопителя на замену.

Buffer/Cache

В SSD может применяться микросхема DRAM в качестве кэша. Отнюдь не во всех накопителях она есть, и, соответственно, ряд моделей контроллеров не имеют блока для работы с внешней микросхемой памяти. Отсутствие этого чипа – верный признак бюджетного накопителя, т. к. в таком случае удается сэкономить некоторую сумму и предложить SSD по более низкой цене.

kak-rabotaet-ssd

Зачем вообще нужна эта DRAM, тем более, что среди всего этого энергонезависимого царства NAND вдруг появляется обычная микросхема динамической памяти, аналогичная той, которая используется в качестве ОЗУ?

Для начала давайте вспомним про быстродействие NAND и DRAM и признаем, что последняя намного быстрее читает и пишет. Разве что воды отключения электропитания боится. Также следует вспомнить и то, что ОС не работает с файлами на физическом уровне, я имею в виду то, что операционная система не знает где реально, в каких конкретно блоках конкретного SSD находятся файлы. Единственное что известно – это что с такого-то логического блока начинается такой-то файл.

Учитывая, что контроллер накопителя регулярно перемещает данные благодаря работе сборщика мусора и функции выравнивания износа, необходимо точно знать, где в данный момент находятся файлы. Соответствующая таблица размещения файлов в накопителе может корректироваться в ячейках NAND, но тут вылезает один из недостатков этого типа памяти – скорость работы, которая гораздо ниже, чем у DRAM, особенно при операции записи.

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

Для операций линейного чтения наличие или отсутствие кэширующей микросхемы большого значения, может, и не имеет, а вот при случайных чтении/записи поиск нужных блоков данных будет выполняться быстрее.

Заключение. Как работает SSD – контроллер наше все, ну почти…

Как видим, приватная жизнь SSD накопителей весьма насыщенная, и «за кулисами» происходит весьма активная работа. Я не упомянул еще такие моменты, как внутреннюю систему коррекции ошибок (ECC), систему контроля за питающим напряжением и еще что-то. Часть этого вполне заслуживает отдельного разговора, и, возможно, к этому мы еще вернемся.

При использовании SSD приходится менять некоторые привычки, которые, возможно, уже успели выработаться после использования классических жестких дисков. Например, многие знают, что случайно удаленный файл, даже если его нет в «корзине» ОС Windows – это еще совсем не приговор, и если о том, что данный файл был крайне нужен, вспомнили не спустя дни/недели/месяцы, а сразу же, то с очень большой долей вероятности его можно восстановить.

В случае с SSD это не так. Одно неловкое движение, сработавший «сборщик мусора» (а о том, когда он срабатывает мы, в общем то, и не знаем) и прочие характерные для твердотельных накопителей технологии – и случайно удаленная информация пропадает безвозвратно. То, что осознание своей ошибки пришло сразу же, жизнь облегчает мало.

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

Итак, сегодняшняя цель была – познакомиться более внимательно с устройством твердотельного накопителя, разобраться, как работает SSD, рассмотреть «механику» функционирования этого лишенного каких-либо движущихся механических частей устройства для хранения данных.

Надеюсь, ничего не перепутал, а если все же где-то ошибся - распутаемся вместе.

Вас также может заинтересовать...

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *