0,0
рейтинг
25 ноября 2013 в 16:34

Как обуздать усиление записи в SSD?



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

Современные микросхемы флэш-памяти устроены так, что для достижения повышенного быстродействия, в них необходимо читать, писать и стирать данные большими блоками. Причем блок записи по размерам не меньше блока чтения, а блок стирания — всегда больше, чем блок записи. Это вызывает необходимость объединять ячейки памяти в иерархическую структуру, обычно: блоки — сектора — страницы.

Когда у нас на руках девственно-чистый новый SSD, никаких проблем нет. Все его ячейки заполнены нулями и готовы к приему наших данных. Поэтому первая запись на SSD вообще не представляет никаких проблем. Обычно данные записываются блоками по 4-8 КБ, и это происходит действительно быстро.

А теперь допустим, нам нужно поменять пару байт (для драматизма можно даже считать, что один единственный бит, хотя в жизни это бывает редко) в уже записанном файле. В отличии от традиционных жестких дисков, флэш-память не позволяет просто так взять и перезаписать блок данных, его для начала надо стереть. А так как блок стирания по размерам сильно крупней блока записи, то эта операция будет очень неэффективной. Спасибо, Wikipedia, за наглядную иллюстрацию:



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

Очень простая формула позволяет рассчитать коэффициент усиления записи.

Коэффициент Усиления Записи = Данные, записанные на флэш-память / Данные, отправленные на запись хостом

Данное явление было известно с момента появления первых микросхем с NAND памятью, но термин Write Amplification был введен в оборот в 2008 году компаниями Intel и SiliconeSystems.

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

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

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



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

Второй недостаток Write Amplification состоит в ускорении износа SSD. Все мы знаем, что ячейки памяти имеют предел по количеству допустимых операций перезаписи. У SLC дисков он выше, у MLC ниже, но он есть. Для борьбы с этим используется избыточность данных и их проверка с помощью разных контрольных сумм (я уже писал про LDPC в прошлой статье), но избыточность свободного места микросхем памяти — ресурс ограниченный, и усиление записи способствует более быстрому его исчерпанию.

Какие же факторы и как влияют на Write Amplification?

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

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

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

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



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



Из интересной экзотики, стоит отметить попытки некоторых производителей, в первую очередь Samsung, разработать систему сборки мусора, которая бы использовала в работе информацию файловой системы, размещенной на диске. Это позволило бы контроллеру эффективно использовать информацию о недавно удаленных файлах и нераспределенном пространстве. По мнению разработчиков, такой подход позволил эффективно работать в тех системах, которые не поддерживают команду TRIM. Контроллеры с этой возможностью требовали чтоб диск был обязательно размечен в NTFS и содержал MBR. Данная технология была очень ненадежной, и часто приводила к потерям данных, особенно при использовании других файловых систем. Еще одним направлением, в котором движутся разработчики SSD – Application Hinting. Проще всего объяснить это на примере баз данных. Данные в СУБД также размещаются в страницах для упрощенного их поиска. Поэтому, в СУБД также есть понятие мусора, или Dirty Page. Если бы СУБД могла отсылать заранее списки «грязных» страниц на твердотельные устройства, это значительно помогло бы в процессе сборки мусора. Есть примеры оптимизации и для других приложений.

#конец первой части#
Александр Зейников @alexzeynikov
карма
72,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (19)

    • +6
      100%. Аж переденуло когда в 100500й раз увидел эту картинку. Лучше просто бы фотку SSD вставили.
      А за статью спасибо.
  • +2
    Контроллеры с этой возможностью требовали чтоб диск был обязательно размечен в NTFS и содержал MBR
    discard в linux и забудьте эту ересь
  • +5
    Когда у нас на руках девственно-чистый новый SSD, никаких проблем нет. Все его ячейки заполнены нулями и готовы к приему наших данных.

    Побуду занудой: чистые ячейки запонены единицами. При операции записи единцы переходят в нули. Для того что бы из нуля сделать обратно единицу — надо провести стирание. Стирание выставит все биты обратно в 1. Поэтому, кстати, если мы меняем биты с единицы на ноль — ничего можно и не стирать. Просто записать поверх.
    • 0
      Подтверждаю ваши умозаключения ). Сей факт что не надо стирать при записи единицу в ноль может породить новый класс алгоритмов подобно тому как были алгоритмы на заре развития ВТ связанные с оптимизацией просмотра данных на магнитной ленте. Я ожидал увидеть ссылки или описания подобных алгоритмов.

    • 0
      А почему именно единицами?
      >>Поэтому, кстати, если мы меняем биты с единицы на ноль — ничего можно и не стирать. Просто записать поверх.
      Тоже самое если изначально одни нули, просто в нужных местах пишете 1 и все.
      Зачем брать флэш-память и загонять в нее нули?
      • 0
        Абсолютное большинство микросхем флеш-памяти именно так и работают. Поскольку из структуры базируются на N-канальных полевых транзисторах один из затворов которого является ячейкой удерживающей заряд. Да и собственно, так повелось еще с ПЗУ с пережигаемыми перемычками — есть перемычка держим лог.1 на выходе, нет перемычки — лог.0
        Почему бы не проинвертировать? Дополнительный инвертор в микросхеме памяти снижает её быстродействие.
        • 0
          >>Поскольку из структуры базируются на N-канальных полевых транзисторах один из затворов которого является ячейкой удерживающей заряд.
          Ну и что что они N? При изготовлении памяти она электрически нейтральна, поэтому для того чтобы загнать туда 1 вам нужно каждый чип «заряжать», что несколько бессмысленно и нелогично.

          >>Почему бы не проинвертировать? Дополнительный инвертор в микросхеме памяти снижает её быстродействие.
          1 инвертор с точки зрения быстродействия такая мелочь, что даже не стоит про это говорить.

          Весьма сомнительно что она заполнена «1».
    • 0
      Не факт, далеко не факт. Данные ведь могут быть дополнительно проинвертированы перед записью во флеш-память, тогда стирание наоборот приведет к обнулению содержимого.
      И рассчитывать на сей факт не стоит, однажды попадется такой диск с которым подобное обращение приведет к ошибке. Да скорей сейчас все с точностью до наоборот.
      Это логика работы физической ячейки — есть заряд, читается как лог.0(наличие заряда открывает полевой транзистор и тот замыкает выход на землю давая тем самым лог.0) нет заряда — лог.1. Процесс очистки заключается в разряде всех ячеек, а при программировании ячейки в них заносится заряд.
      Но на логическом уровне, устройство работая как диск может с успехом инвертировать эти значения прямо на лету и тогда очищенная ячейка будет лог.0
      • 0
        Это может быть верно для SLC памяти (и то с оговорками), но не для MLC.
  • +1
    для достижения повышенного быстродействия, в них необходимо читать, писать и стирать данные большими блоками

    Значит ли это, что выгоднее при форматировании указывать размер блока, скажем 512 кб?
    А что скажете на счёт смещения в 4 кб: habrahabr.ru/company/paragon/blog/97436/
    Для SSD уже не актуально, как я понимаю…

    И ещё, вы упомянули SLC. Они вообще бывают для домашнего использования?

    Вообще тема интересна, спасибо. Хотелось бы продолжения.
    • 0
      Значит ли это, что выгоднее при форматировании указывать размер блока, скажем 512 кб?

      Нет, наоборот.

      Для SSD уже не актуально, как я понимаю…

      Нет, вы ошибаетесь.
      • 0
        Объяснитесь, чтоли…
        • 0
          Ну, скажем, у вас есть 10 файлов по 1кб. Если вы укажете размер блока в ФС 512кб, то ваши 10 файлов будут занимать не 10кб реального места на ssd, а аж 5 мегабайт.
          А выравнивание по размеру ячейки всегда актуально, что для ssd, что для hdd.
          • +2
            И? Это говорит о занимаемом месте и вовсе не значит, что SSD будет тратить время на заполнение чем-то неиспользуемого пространства. Т.е. логически да, будет занято 10 метров, но физически будут задействованы только 10 кб. А вот в статье сказано что де чтение\запись большими блоками увеличит скорость. От того и спрашиваю.

            А выравнивание было актуально при разметке диска во время установки старых версий Windows, которые смещали начало раздела на 63 кб, что не кратно физическому размеру сектора у современных HDD в 4 кб. Каков размер физического «сектора» у новых SSD я не знаю. Но, теоретически, все новые Windows уже не должны этим страдать.
            • 0
              почему это SSD не будет тратить время на запись? Ведь операционка ему дает блок в 512кб на запись из которых реально только 1кб под файл, а диск обязан выполнить запись всего блока. Он же не знает что там актуальны только 1кб в начале блока… можно конечно проверить этот факт чтением перед записью, но это сильно замедлит процесс записи.

              выравнивание было актуально при разметке диска во время установки старых версий Windows, которые смещали начало раздела на 63 кб
              Увы, не так давно ставил Win7 на нетбук, выбор разделов на автомате — в итоге потом посмотрел первый системный раздел смещен на 63 сектора… какая такая современная виндовс… ничего не знаю!
              • 0
                Ну, я не знаток того, как там на нижнем уровне всё устроено, поэтому лишь предполагал.

                А с виндой это печаль…
  • +1
    Для интересующихся, есть очень интересные доклады на тему SandForce и другие Storage-темы. AIS — это ежегодный слет LSI и партнеров в США. Очень рекомендую, информация из первых уст, итд. www.lsi.com/AIS/2013/Pages/agenda.aspx#AIS2013Track
  • 0
    У SLC дисков он выше, у MLC ниже, но он есть.
    Если я правильно понимаю, то тут кажется надо поменять местами SLC и MLC как-то так:
    У MLC дисков он ниже, у SLC выше, но он есть.

    Ведь вроде бы в этом случае выше = лучше. Поэтому «но» вроде бы уместно после описание лучшего варианта.
    Поправьте меня если я в этом моменте что-то не правильно понял.

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