Когда-то я уже писал о том, что 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