Ошибки NAND памяти и методы борьбы с ними

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

Классификация ошибок

Принято делить ошибки на два основных вида – постоянные (некорректируемые) и временные (корректируемые). К первым относится главным образом износ ячеек по причине исчерпания их ресурса. Серьезные производители часто указывают гарантированный ресурс накопителя, т. е. максимальный объем данных, который можно записать без возникновения ошибок.

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

Так, на момент написания этой статьи у меня тестируются два накопителя – Crucial BX500 с памятью TLC и A-data SU635, в котором установлены чипы NAND типа QLC, способные хранить 4 бита в одной ячейке.

Но вернемся к сегодняшней теме. Второй класс ошибок (временные) можно подразделить на несколько типов, с которыми предлагаю познакомиться немного подробнее.

Read Disturb Error – ошибки чтения

Как следует из названия, эти ошибки никак не связаны с циклами записи/стирания (P/E) ячеек, а причиной возникновения является операция чтения. Почему? Давайте разберемся.

Err_NAND_fets

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

Err_NAND_NAND-vs-NOR-Flash-memory-01

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

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

Err_NAND_fl101_5_Fig1_c

Напряжение считывания (VREAD) изначально выше максимально возможного порогового напряжения, но оно гораздо ниже напряжения, которое необходимо для перепрограммирования ячейки или ее стирания. Казалось бы, в чем может быть проблема?

А проблема в организации NAND памяти. Т. к. мы оперируем не отдельными битами, а блоками данных, то и считывающее напряжение подается на весь блок, из которого потом другим сигналом выбирается нужная нам страница данных. Что при этом происходит?

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

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

Можно найти результаты исследований, в которых приводится такая цифра – происходит искажение одного бита на каждые 105-106 чтений страницы для NAND памяти типа MLC, изготовленной с использованием 16-нм техпроцесса. Следует помнить, что увеличение разрядности ячеек (TLC, QLC) и дальнейшее утончение техпроцесса увеличивают частоту возникновения Read Disturb Error. Оказывает свое влияние и постепенный износ ячеек.

Кстати, на использовании этого эффекта нежелательного изменения значений в ячейках основана хакерская атака на накопитель, цель которой – заставить его выполнять большое количество операций чтения из одних и тех же блоков данных. Это может привести к искажению информации в блоке именно из-за возникновения ошибки Read Disturb.

Как защититься

Как избавиться от ошибки? Есть как минимум два способа. Первый – ошибка будет исправлена «на лету» при помощи используемых алгоритмов коррекции ошибок ECC. Второй —  переписать данные, в которых обнаружена ошибка, в другой блок, а исходный очистить и приготовить к повторному использованию. По сути, выполнить операцию «уборка мусора» в сочетании с механизмом выравнивания износа.

Правда, тут есть своя тонкость. Ресурс ячеек отнюдь не бесконечен. Мало того, довольно скромен. Для NAND TLC принято считать, что нормальное значение — 3 000 циклов записи/стирания, для QLC это значение вообще находится на уровне 1 000. Поэтому часто гонять данные туда-сюда не получится, ибо ячейки будут активно изнашиваться.

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

Program Disturb Error – ошибка при программировании ячейки

Следующая ошибка, которая поддается исправлению — Program Disturb Error, т. е. ошибка, возникающая при программировании ячейки. Выше было упомянуто, что для записи/стирания используется напряжение, заметно большее, чем при чтении. И опять суть проблемы в чем-то схожа с рассмотренной выше.

Err_NAND_fl101_5_Fig3_c

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

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

Этот эффект проявляется тем сильнее, чем тоньше техпроцесс, который использовался для изготовления NAND.

Как защититься

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

Over-Programming Error – ошибка перепрограммирования

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

Err_NAND_fl101_5_Fig2_c

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

Как защититься

На помощь вновь приходит механизм переноса блока данных в новое место, благо ошибка поддается корректировке силами контроллера.

Retention Error – ошибка удержания заряда

Хранящиеся в накопителе данные склонны к повреждению с течением времени. Связано это с падением уровня напряжения в ячейке, точнее, в плавающем затворе транзистора. Хотя он окружен изолирующим оксидным слоем, все же постепенная утечка электронов через этот слой имеет место.

Чем более изношена ячейка, тем активнее идет утечка заряда через изолирующий слой, который постепенно теряет свои физические свойства. Ускорить процесс искажения записанных в NAND память данных могут продолжительное нахождение ячеек в отключенном состоянии, повышенная температура, тип ячеек (MCL, TLC, QLC), использованный для производства чипа техпроцесс, толщина изолирующего оксидного слоя и т. п.

По поводу четырехбитовых ячеек должен сказать, что я провожу эксперимент с имеющимся у меня накопителем Crucial P1, в котором как раз QLC NAND. Он сейчас заполнен наполовину объема файлами, и теперь он просто лежит в коробочке, где проведет не менее полугода (как минимум до сентября этого года), что позволит проверить, случится ли что-то с информацией на накопителе, который длительное время не включался.

Способность держать заряд – одна из важных характеристик любого накопителя. Хотя предполагается, что большинство из них если и обесточивается, то на сравнительно короткое время (часы, максимум несколько дней), все же хочется быть уверенным в том, что спустя более продолжительный период все данные останутся целыми и невредимыми.

Как защититься

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

Механизмы мониторинга и обработки ошибок NAND

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

Error Correction Codes (ECC)

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

Суть метода заключается в добавлении дополнительных бит к битам данных, что позволяет обнаруживать и корректировать ошибку. Так, к m-битам блока данных добавляется k-бит дополнительной информации, в результате чего блок данных становится равным m+k. Количество дополнительных бит зависит от используемого алгоритма ЕСС.

Такой алгоритм кодирует m+k таким образом, что из всех доступных комбинаций 2(m+k) только минимальное количество комбинаций соответствует корректным данным. Если изменится бит в данных, то это сразу станет видно, и ошибка может быть исправлена.

Количество дополнительных бит варьируется не только в зависимости от применяемого алгоритма ECC, но и от типа NAND памяти, используемой в накопителе. Так, для SLC требуется меньшего всего дополнительных бит, чем для TLC, и тем более для QLC. Количество также зависит от количества циклов P/E, т. к. ячейки постепенно изнашиваются и вероятность появления ошибки становится выше.

Err_NAND_hammond

Производители запоминающих устройств, в частности, контроллеров для них, могут использовать различные алгоритмы ECC. Наиболее распространение получили алгоритмы на базе кода Хэмминга, кода Рида-Соломона, низкоплотностный код (Low Density Parity Codes — LDPC) и ряд других.

Например, код Хэмминга способен определять ошибки в двух битах и корректировать один бит, что делает его пригодным для использования с SLC NAND, где потребуется всего один дополнительный проверочный бит.

Wear Leveling – выравнивание износа ячеек

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

Wear Leveling и призвана обеспечить равномерное использование всего объема памяти. Контроллер следит за количеством циклов записи в ячейки и стремится, чтобы количество циклов записи/стирания (P/E) было примерно одинаковым у всех блоков. Различают два метода выравнивания износа:

  • Динамический – для равномерного распределения циклов P/E используется весь доступный свободный объем накопителя, не затрагиваются «холодные» данные, т. е. те, которые не обновляются.
  • Статический – выравнивание износа производится на всем объеме накопителя, включая неизменяемые данные.

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

Bad-Block Management

Назначение этого механизма знакомо по обычным жестким дискам, где также ведется мониторинг состояния поверхности пластин и вышедшие из строя дорожки отправляются в «плохие» (Bad) и заменяются новыми из резервной области.

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

Ошибки NAND памяти

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

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

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

 

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

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

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

сОДЕЛУ.нЕФТЙЛБ