Особенности работы современных SSD-дисков
Актуальность перехода на SSD-диски
Многоуровневые и одноуровневые ячейки флэшпамяти
Архитектура массивов флэшпамяти
Логическая структура NAND флэшпамяти
Особенности операций записи данных в SSD-дисках
Разница между последовательной и случайной записью в SSD-дисках
Способы повышения производительности SSD-дисков
Рынок SSD-дисков постепенно становится всё более разнообразным. Растет емкость SSD-дисков, и одновременно с этим падает цена в расчете на гигабайт памяти. Однако говорить о том, что SSD-диски стали популярными, еще преждевременно. Главная причина этого — их невысокая (в сравнении с традиционными HDD-дисками) емкость и очень высокая (опять-таки в сравнении с традиционными HDD-дисками) стоимость в расчете на гигабайт памяти. А потому наличие SSD-диска в домашнем настольном ПК — это скорее исключение из правила. Более того, даже в нетбуках и ноутбуках SSD-диски встречаются пока крайне редко. В то же время уже сейчас очевидно, что будущее систем хранения данных именно за SSD-дисками, которые в дальнейшем вытеснят с рынка HDD-диски. Когда это произойдет? Да, собственно, как только они станут сопоставимы по емкости и стоимости с HDD-дисками. Тогда последние просто исчезнут как класс, поскольку SSD-диски имеют ряд неоспоримых преимуществ перед HDD-дисками.
В этой статье мы рассмотрим некоторые особенности функционирования современных SSD-дисков, которые иногда вызывают массу вопросов и недоумение, поговорим об особенностях их архитектуры, а также о возможных вариантах использования этих дисков в ноутбуках, ПК и серверах.
Актуальность перехода на SSD-диски
Производительность современных центральных процессоров, определяющих вычислительные возможности ПК, существенно превосходит производительность традиционных жестких дисков (HDD). В результате именно подсистемы хранения данных во многих случаях становятся узким местом, сдерживающим рост производительности компьютеров в целом. Использование дорогостоящих решений на основе RAID-массивов лишь отчасти позволяет решить проблему дисбаланса в производительности процессоров и подсистем хранения данных на основе HDD. И в дальнейшем дисбаланс производительности процессоров и HDD-дисков будет только увеличиваться, и мы неизбежно придем к тому, что производительность компьютера во многих приложениях уже перестанет определяться производительностью процессора, а будет упираться в самое слабое звено — подсистему хранения данных. Так, с 1996 года усредненная производительность процессоров выросла в 175 раз, в то время как производительность HDD-дисков (имеется в виду выборочное чтение блоков размером 20 Кбайт) — всего в 1,3 раза.
Сегодня единственным способом решения этой проблемы является переход от HDD к твердотельным дискам SSD (Solid State Drive) на основе флэшпамяти. Такие диски способны обеспечить уровень производительности, который в полной мере отвечает производительности современных многоядерных процессоров.
Впрочем, высокая производительность — это не единственное преимущество SSD-дисков. Они также абсолютно бесшумны, поскольку не содержат движущихся частей, и, что особенно важно для ноутбуков, потребляют гораздо меньше электроэнергии по сравнению с HDD-дисками. Так, энергопотребление обычного 2,5-дюймового HDD-диска в режиме активности составляет порядка 2,5-3 Вт и порядка 0,85-1 Вт в режиме простоя (Idle). Если HDD-диск не активен, то через некоторое время (в зависимости от настроек) он переходит в режим пониженного энергопотребления (Standby или Sleep) и при выходе из этого режима ему требуется порядка 1-2 с для раскрутки. Типичное энергопотребление SSD-диска (не серверного) в режиме активности составляет порядка 0,15 Вт, а в режиме простоя — 0,06 Вт. Причем при правильной настройке переход из режима активности в режим пониженного энергопотребления происходит автоматически, если диск не активен в течение 25 мс. А включаются эти диски практически мгновенно, поскольку им просто нечего раскручивать. Отметим, что для автоматического перехода SSD-диска в режим пониженного энергосбережения необходимо активировать функцию Device Initiated Power Management (DIPM) в реестре, поскольку по умолчанию задана функция Host Initiated Power Management (HIPM), когда переходом в режим пониженного энергопотребления управляет не сам диск, а операционная система.
Не уступают SSD-диски традиционным HDD-дискам и по такой характеристике, как среднее время наработки на отказ (MTFB). Так, если для HDD среднее время наработки на отказ составляет порядка 300 тыс. ч, то для SSD-дисков — свыше миллиона часов.
Казалось бы, если преимущества SSD-дисков настолько очевидны, почему они до сих пор не получили широкого распространения? Увы, но у SSD-дисков есть и серьезные недостатки. Прежде всего современные SSD-диски не сопоставимы с HDD-дисками по емкости. Так, если емкость HDD-дисков (размером 3,5 дюйма) достигает 3 Тбайт, то максимальная емкость SSD-дисков (размером 2,5 дюйма) составляет только 512 Гбайт. Правда, если сравнивать 2,5-дюймовые SSD- и HDD-диски, то их емкость вполне сопоставима.
Второй недостаток SSD-дисков — это их стоимость, которая в несколько раз выше, чем у HDD.
Впрочем, что касается емкости SSD-дисков, то не всё так плохо, как может показаться. Емкость SSD-дисков растет гораздо более высокими темпами, чем емкость HDD-дисков, и недалек тот день, когда SSD-диски превзойдут по емкости HDD. В качестве доказательства приведем интересную статистику. В 2006 году компания Intel, один из ведущих игроков на рынке SSD-дисков, производила микросхемы флэшпамяти типа NAND для SSD-дисков по 90-нм техпроцессу, при этом их емкость составляла 1 или 2 Гбит. В 2009 году Intel выпускала микросхемы флэшпамяти уже по 34-нм техпроцессу, а емкость микросхем стала составлять 32 Гбит. В 2010 году компания освоила 25-нм процесс производства микросхем флэшпамяти емкостью 64 Гбит. Как видим, темпы роста емкости микросхем флэшпамяти для SSD-дисков впечатляют: фактически ежегодно происходит ее удвоение. Так что в скором времени SSD-диски будут превосходить по объему HDD.
Нужно также отметить, что хотя до широкого распространения SSD-дисков еще далеко, но говорить о том, что SSD-диски вообще не покупают, неверно. Статистика такова: в 2008 году в мире было продано всего 700 тыс. SSD-дисков, в 2009 году объем продаж составил уже 2 млн штук, а в этом году, согласно прогнозам, он достигнет 5,9 млн штук. Предполагается, что к 2013 году рынок SSD-дисков составит 61,8 млн штук.
Итак, прогнозы по объемам продаж SSD-дисков весьма оптимистичны, однако они отнюдь не отвечают на главный вопрос: что делать пользователям сегодня, когда емкость SSD-дисков еще недостаточно высока, а их стоимость всё еще очень высока? Если речь идет о домашних пользователях, то, конечно же, не имеет смысла выбрасывать HDD-диски, чтобы установить SSD. Однако повысить производительность компьютера за счет использования SSD-дисков всё же можно. Оптимальным является решение, когда в настольном ПК применяется комбинация одного SSD-диска и одного или нескольких HDD-дисков. На SSD-диск можно установить операционную систему и все программы (для этого будет достаточно диска объемом 80 Гбайт), а HDD-диск использовать для хранения данных.
Устройство ячейки флэшпамяти
Как мы говорили, главным преимуществом SSD-дисков является их более высокая, в сравнении с HDD-дисками, производительность, однако никаких конкретных характеристик типа скорости последовательного и выборочного чтения и записи не приводилось. Однако, прежде чем переходить к рассмотрению скоростных характеристик SSD-дисков, а также типов SSD-дисков, нужно ознакомиться с особенностями их архитектуры и процесса чтения и записи информации на эти диски. Начнем с краткого описания структуры ячейки флэшпамяти.
На простейшем уровне ячейка флэшпамяти представляет собой n-канальный MOSFET-транзистор с так называемым плавающим затвором. Напомним, что обычный n-канальный MOSFET-транзистор (структура n-p-n) может находиться в двух состояниях: открытом и запертом (закрытом). Управляя напряжением между стоком и затвором, можно создавать канал проводимости электронов (n-канал) между истоком и стоком (рис. 1). Напряжение, при котором возникает канал проводимости, называется пороговым. Наличие канала проводимости соответствует открытому состоянию транзистора, а отсутствие (когда транзистор не способен проводить ток от истока к стоку) — запертому.
Рис. 1. Устройство MOSFET-транзистора (открытое и закрытое состояние)
В открытом состоянии напряжение между стоком и истоком близко к нулю, а в закрытом может достигать высокого значения. Конечно, сам по себе транзистор не способен сохранять информацию. Собственно, для хранения информации как раз предназначен плавающий затвор (рис. 2). Он выполнен из поликристаллического кремния и полностью окружен слоем диэлектрика, что обеспечивает ему полное отсутствие электрического контакта с элементами транзистора. Плавающий затвор расположен между управляющим затвором и подложкой из p-n-переходов. Такой затвор способен сохранять помещенный на него заряд (отрицательный) в течение неограниченного времени (до 10 лет). Наличие или отсутствие избыточного отрицательного заряда (электронов) на плавающем затворе может трактоваться как логические единица и ноль.
Рис. 2. Устройство транзистора с плавающим затвором и чтение содержимого ячейки памяти
Сначала рассмотрим ситуацию, когда на плавающем затворе нет электронов. В этом случае транзистор ведет себя подобно уже рассмотренному традиционному транзистору. При подаче на управляющий затвор положительного напряжения (инициализация ячейки памяти), равного пороговому значению, в подзатворной области создается канал проводимости — и транзистор переходит в открытое состояние. Если же на плавающем затворе помещен избыточный отрицательный заряд (электроны), то даже при подаче порогового значения напряжения на управляющий затвор он компенсирует создаваемое управляющим затвором электрическое поле и не дает образоваться каналу проводимости, то есть транзистор будет находиться в закрытом состоянии.
Таким образом, наличие или отсутствие заряда на плавающем затворе однозначно определяет состояние транзистора (открыт или закрыт) при подаче одного и того же порогового значения напряжения на управляющий затвор. Если подачу напряжения на управляющий затвор трактовать как инициализацию ячейки памяти, то по напряжению между истоком и стоком можно судить о наличии или отсутствии заряда на плавающем затворе.
То есть в отсутствие управляющего напряжения на затворе, независимо от наличия или отсутствия заряда на плавающем затворе, транзистор будет всегда закрыт, а при подаче порогового значения напряжения на затвор состояние транзистора будет определяться наличием заряда на плавающем затворе: если заряд имеется, то транзистор будет закрыт и выходное напряжение будет высоким; если заряд отсутствует, то транзистор будет открыт и выходное напряжение будет низким.
Закрытое состояние транзистора (отсутствие канала проводимости) принято трактовать как логический ноль, а открытое (наличие канала проводимости) — как логическую единицу. Таким образом, при инициализации ячейки памяти (подаче порогового значения напряжения на затвор) наличие заряда на плавающем затворе трактуется как логический ноль, а его отсутствие — как логическая единица (см. таблицу).
Получается своеобразная элементарная ячейка памяти, способная сохранять один информационный бит. При этом важно, чтобы заряд на плавающем затворе (если он там имеется) мог сохраняться сколь угодно долго как при инициализации ячейки памяти, так и при отсутствии напряжения на управляющем затворе. В этом случае ячейка памяти будет энергонезависимой. Осталось лишь придумать, каким образом на плавающий затвор помещать заряд (записывать содержимое ячейки памяти) и удалять его оттуда (стирать содержимое ячейки памяти).
Помещение заряда на плавающий затвор реализуется либо методом инжекции горячих электронов (CHE-Channel Hot Electrons), либо методом туннелирования Фаулера — Нордхейма (рис. 3). Ну а удаление заряда производится только методом туннелирования Фаулера.
Рис. 3. Процесс записи и стирания информационного бита в транзистор с плавающим затвором
При использовании метода инжекции горячих электронов на сток и управляющий затвор подается высокое напряжение (на управляющий затвор подается напряжение выше порогового значения), чтобы придать электронам в канале энергию, достаточную для преодоления потенциального барьера, создаваемого тонким слоем диэлектрика, и туннелировать в область плавающего затвора (при чтении на управляющий затвор подается меньшее напряжение, и эффекта туннелирования не наблюдается).
Для удаления заряда с плавающего затвора (процесс стирания ячейки памяти) на управляющий затвор подается высокое отрицательное напряжение, а на область истока — положительное. Это приводит к тому, что электроны туннелируют из области плавающего затвора в область истока (квантовое туннелирование Фаулера — Нордхейма (Fowler — Nordheim, FN)).
Рассмотренный нами транзистор с плавающим затвором может выступать в роли элементарной ячейки флэшпамяти. Однако однотранзисторные ячейки имеют ряд существенных недостатков, главный из которых — плохая масштабируемость. Дело в том, что при организации массива памяти каждая ячейка памяти (транзистор) подключается к двум перпендикулярным шинам: управляющие затворы — к шине, называемой линией слов, а стоки — к шине, называемой битовой линией (в дальнейшем данная организация будет рассмотрена на примере NOR-архитектуры). Вследствие наличия в схеме высокого напряжения при записи методом инжекции горячих электронов все линии — слов, битов и истоков — необходимо располагать на достаточно большом расстоянии друг от друга для обеспечения требуемого уровня изоляции, что, естественно, сказывается на ограничении объема флэшпамяти.
Другим недостатком однотранзисторной ячейки памяти является наличие эффекта избыточного удаления заряда с плавающего затвора, который не может компенсироваться процессом записи. В результате на плавающем затворе образуется положительный заряд и транзистор всегда остается в открытом состоянии.
Широкое распространение получили и другие типы ячеек памяти, например ячейка SST (рис. 4), разработанная компанией Silicon Storage Technology, Inc. В транзисторе SST-ячейки изменены формы плавающего и управляющего затворов. Управляющий затвор выровнен своим краем с краем стока, а его изогнутая форма дает возможность разместить плавающий затвор частично под ним и одновременно над областью истока. Такое расположение плавающего затвора позволяет упростить, с одной стороны, процесс помещения на него заряда методом инжекции горячих электронов, а с другой — процесс снятия заряда за счет эффекта туннелирования Фаулера — Нордхейма.
Рис. 4. Структура SST-ячейки памяти
При снятии заряда туннелирование электронов происходит не в область истока, как у рассмотренной однотранзисторной ячейки, а в область управляющего затвора. Для этого на управляющий затвор подается высокое положительное напряжение. Под воздействием электрического поля, создаваемого управляющим затвором, осуществляется туннелирование электронов с плавающего затвора, чему способствует его изогнутая к краям форма.
При помещении заряда на плавающий затвор сток заземляется, а к истоку и управляющему затвору подается положительное напряжение. Управляющий затвор формирует при этом канал проводимости, а напряжение между стоком и истоком «разгоняет» электроны, сообщая им энергию, достаточную для преодоления потенциального барьера, то есть для туннелирования на плавающий затвор.
В отличие от однотранзисторной ячейки памяти, ячейка SST имеет несколько иную схему организации массива памяти.
Многоуровневые и одноуровневые ячейки флэшпамяти
Все рассмотренные до этого типы ячеек памяти способны сохранять только один бит информации в расчете на одну ячейку. Подобные ячейки памяти получили название одноуровневых (Single Level Cell, SLC). Однако существуют и такие ячейки, каждая из которых сохраняет по нескольку битов, — это многоуровневые ячейки, или MLC (Multi Level Cell).
Как уже отмечалось при описании однотранзисторной ячейки памяти, наличие логической единицы или нуля определяется по значению напряжения на битовой линии и зависит от наличия или отсутствия заряда на плавающем затворе. Если на управляющий затвор подается пороговое значение напряжения, то при отсутствии заряда на плавающем затворе транзистор открыт, что соответствует логической единице. Если же на плавающем затворе имеется отрицательный заряд, своим полем экранирующий поле, создаваемое управляющим затвором, то транзистор оказывается в закрытом состоянии, что соответствует логическому нулю. Понятно, что даже при наличии отрицательного заряда на плавающем затворе транзистор можно перевести в открытое состояние, однако для этого придется подать на управляющий затвор напряжение, превышающее пороговое значение. Следовательно, об отсутствии или наличии заряда на плавающем затворе можно судить по пороговому значению напряжения на управляющем затворе. Поскольку пороговое напряжение зависит от величины заряда на плавающем затворе, то можно не только определить два предельных случая — отсутствие или присутствие заряда, — но и по величине порогового напряжения судить о количестве заряда. Таким образом, если имеется возможность размещать на плавающем затворе разное количество уровней заряда, каждому из которых соответствует свое значение порогового напряжения, то в одной ячейке памяти можно сохранять несколько информационных битов. К примеру, для того чтобы с использованием такого транзистора сохранять в одной ячейке 2 бита, необходимо различать четыре пороговых напряжения, то есть иметь возможность размещать на плавающем затворе четыре различных уровня заряда. Тогда каждому из четырех пороговых напряжений можно поставить в соответствие комбинацию двух битов: 00, 01, 10, 11.
Для того чтобы иметь возможность записывать в одну ячейку 4 бита, необходимо различать уже 16 пороговых напряжений.
Ячейки MLC активно разрабатываются компанией Intel, поэтому технология памяти на основе MLC-ячеек получила название Intel StrataFlash.
Отметим, что SLC-ячейки памяти обеспечивают более высокую скорость чтения и записи. Кроме того, они более долговечны, однако SSD-диски на их основе дороже, поскольку при равной емкости SSD-дисков на базе MLC- и SLC-ячеек памяти количество самих ячеек памяти в MLC-диске будет в два раза меньше (в случае четырехуровневых ячеек памяти). Именно поэтому SSD-диски на основе SLC-ячеек памяти используются главным образом в серверах.
Архитектура массивов флэшпамяти
Рассмотренная нами простейшая ячейка флэшпамяти на основе транзистора с плавающим затвором, способная сохранять один бит информации, может использоваться для создания массивов энергонезависимой памяти. Для этого нужно только соответствующим образом объединить в единый массив множество ячеек, то есть создать архитектуру памяти.
Существует несколько типов архитектуры флэшпамяти, то есть способов объединения ячеек памяти в единый массив, но наибольшее распространение получили архитектуры NOR и NAND. Отметим, что в SSD-дисках применяется организация памяти по типу NAND, однако для лучшего понимания особенностей этой архитектуры логично прежде рассмотреть более простую архитектуру NOR. Кроме того, именно архитектура NOR была первой архитектурой, используемой во флэшпамяти.
Архитектура NOR (рис. 5) подразумевает параллельный способ объединения ячеек памяти в массив. Как уже отмечалось, для инициализации ячейки памяти, то есть для получения доступа к содержимому ячейки, необходимо подать пороговое значение напряжения на управляющий затвор. Поэтому все управляющие затворы должны быть подсоединены к линии управления, называемой линией слов (Word Line). Анализ содержимого ячейки памяти производится по уровню сигнала на стоке транзистора. Поэтому стоки транзисторов подключаются к линии, называемой битовой линией (Bit Line).
Рис. 5. Архитектура NOR
Своим названием архитектура NOR обязана логической операции «ИЛИ-НЕ» (английская аббревиатура — NOR). Логическая операция NOR над несколькими операндами дает единичное значение, когда все операнды равны нулю, и нулевое значение во всех остальных случаях. В данном случае имеется в виду принцип соединения транзисторов вообще, а не конкретно транзисторов с плавающим затвором.
Рассмотрим в качестве примера несколько транзисторов (без плавающего затвора), присоединенных к одной битовой линии (рис. 6). В этом случае если хотя бы один транзистор открыт, то выходное напряжение на битовой линии будет низким. И только в случае, когда все транзисторы закрыты, напряжение на битовой линии будет высоким. Получаем таблицу истинности входных напряжений на затворах транзисторов и выходного напряжения на битовой линии, соответствующую таблице истинности логической функции «ИЛИ-НЕ» (NOR). Именно поэтому такая схема объединения транзисторов и получила название NOR.
Рис. 6. Соединение транзисторов по схеме NOR
Архитектура NOR обеспечивает произвольный быстрый доступ к любой ячейке памяти, однако процессы записи (используется метод инжекции горячих электронов) и стирания информации происходят довольно медленно. Кроме того, в силу технологических особенностей производства микросхем флэшпамяти с архитектурой NOR размер ячейки получается большим, поэтому такая память плохо масштабируется.
Другой распространенной архитектурой флэшпамяти является архитектура NAND (рис. 7), соответствующая логической операции «И-НЕ». Операция NAND дает нулевое значение только в том случае, когда все операнды равны нулю, и единичное значение во всех остальных случаях. Архитектура NAND подразумевает последовательный способ подключения транзисторов, при котором сток каждого транзистора связан с истоком соседнего транзистора, а в серии нескольких последовательно соединенных транзисторов только один из них оказывается подключенным к линии битов. Причем при рассмотрении архитектуры соединения речь не идет конкретно о транзисторах с плавающим затвором.
Рис. 7. Архитектура NAND
Рассмотрим группу таких последовательно соединенных транзисторов (без плавающего затвора) (рис. 8). В случае если управляющее напряжение на затворах всех транзисторов равно пороговому значению, то все транзисторы находятся в открытом состоянии и выходное напряжение (напряжение на битовой линии) будет низким, что соответствует логическому нулю. Если же входное напряжение хотя бы на одном транзисторе будет низким (ниже порогового значения), то есть если хотя бы один транзистор будет находиться в запертом состоянии, то напряжение на битовой линии будет высоким, что соответствует логической единице. Получаем таблицу истинности входных напряжений на затворах транзисторов (напряжений на линии слов) и выходного напряжения на битовой линии, соответствующую таблице истинности логической функции «И-НЕ» (NAND). Именно поэтому такая схема объединения транзисторов и получила название NAND.
Рис. 8. Соединение транзисторов по схеме NAND
В схеме соединения NAND-транзисторов с плавающим затвором к группе последовательно соединенных транзисторов с обоих концов подключаются обычные транзисторы (без плавающего затвора), которые изолируют группу транзисторов и от земли, и от битовой линии и подключают всю группу транзисторов к битовой линии при их инициализации.
В сравнении с архитектурой NOR данная архитектура, в силу особенностей технологического процесса производства (объединение стоков и истоков соседних транзисторов и гораздо меньшее количество проводников), позволяет добиться более компактного расположения транзисторов, а следовательно, хорошо масштабируется. В отличие от NOR-архитектуры, где запись информации производится методом инжекции горячих электронов, в архитектуре NAND запись осуществляется методом туннелирования FN, что позволяет реализовать более быструю запись, чем для архитектуры NOR.
Естественно, возникает вопрос: каким образом в архитектуре NAND можно получить доступ к отдельно взятой ячейке памяти (прочитать содержимое ячейки)? Ведь если хотя бы один из транзисторов в такой последовательно соединенной группе будет находиться в закрытом состоянии (что можно трактовать как наличие заряда на плавающем затворе соответствующего транзистора), то напряжение на битовой линии будет высоким независимо от состояния остальных ячеек. Для того чтобы получить доступ к отдельно взятой ячейке, недостаточно просто подать пороговое значение напряжения на затвор транзистора, соответствующего этой ячейке, и измерить напряжение на битовой линии. Еще нужно, чтобы все остальные транзисторы при этом находились в открытом состоянии. Для этого на затвор транзистора, соответствующего ячейке памяти, чье содержимое необходимо прочитать, подается пороговое значение напряжения, а на затворы всех остальных транзисторов — напряжение, превышающее пороговое значение и достаточное для образования канала проводимости даже при наличии заряда на плавающем затворе, но недостаточное для эффекта квантового туннелирования зарядов. В таком случае все эти транзисторы переходят в открытое состояние и напряжение на битовой линии определяется наличием или отсутствием заряда на плавающем затворе транзистора, соответствующего ячейке памяти, к которой реализуется доступ.
Логическая структура NAND флэшпамяти
Как мы уже отмечали, в SSD-дисках используется флэшпамять с организацией по типу NAND, поэтому в дальнейшем мы сосредоточимся на рассмотрении исключительно NAND флэшпамяти.
Несмотря на тот факт, что флэшпамять позволяет получить доступ для чтения, записи и стирания отдельно взятой ячейки, для более эффективного использования элементарных ячеек памяти они были объединены в массивы с четырехуровневой структурой. На низшем уровне находится элементарная ячейка памяти, а элементарные ячейки, объединенные в массив, вмещающий 4 Кбайт данных, называются страницей памяти. 128 таких страниц образуют блок памяти размером 512 Кбайт (иногда в блок памяти входит 64 страниц), а 1024 блока — массив размером 512 Мбайт. Таким образом, логическая структура объединения ячеек в массивы довольно проста. Страница подобна кластеру (сектору) в жестком диске и представляет собой минимальный размер данных, с которым работает флэшпамять. Однако между кластером жесткого диска и страницей флэшпамяти существует принципиальная разница при выполнении операций чтения, записи и удаления. Так, если в жестком диске кластер можно прочитать, записать и удалить, то во флэшпамяти операции чтения и записи возможны страницами по 4 Кбайт, а стирание данных — только блоками по 512 Кбайт. Причем как только информация записана на страницу, она не может быть перезаписана до тех пор, пока не будет очищена (удалена).
Особенности операций записи данных в SSD-дисках
Итак, как мы уже отмечали, запись и чтение данных в NAND флэшпамяти возможны страницами по 4 Кбайт, а стирание данных — только блоками по 512 Кбайт. Вообще, процесс записи информации на SSD-диски сильно отличается от аналогичного процесса с HDD-дисками. С этим, к примеру, связано то, что производительность SSD-дисков меняется со временем, а скорости последовательного и выборочного доступа к флэшпамяти отличаются друг от друга. Для того чтобы объяснить эти явления, рассмотрим более подробно процессы записи на HDD- и SSD-диски.
В случае жестких дисков HDD наименьшая единица информации, которой оперирует система управления жесткого диска, носит название сектора или блока. В HDD размер сектора равен 4 Кбайт (в новых моделях) или 512 байт. Для адресации секторов (блоков) на диске используется метод LBA (Logical Block Addressing), при котором каждый блок, адресуемый на жестком диске, имеет свой порядковый номер — целое число, начиная с нуля (то есть первый блок LBA = 0, второй LBA = 1 и т.д.). Количество LBA-блоков на диске определяется количеством цилиндров, дорожек, секторов и головок чтения/записи. Так, расчет номера LBA-блока производится по формуле:
LBA = [(Cylinder x No_of_heads + Heads) x Sectors/track] + [Sector – l),
где:
- LBA — адрес блока по LBA;
- Cylinder — номер цилиндра;
- No_of_heads — количество головок;
- Heads — номер выбранной головки;
- Sectors/track — количество секторов в одной дорожке;
- Sector — номер сектора.
Преимущество метода LBA заключается в том, что системному контроллеру нет необходимости учитывать геометрию самого жесткого диска (количество цилиндров, сторон, секторов на цилиндре).
Теперь рассмотрим процесс записи данных на HDD-диск. Если данные записываются, к примеру, в блок LBA c определенным номером, то это означает, что они будут размещаться в определенном месте (на определенном цилиндре, дорожке и секторе) на диске. И сколько бы раз ни перезаписывался этот блок, данные всегда будут помещаться в одно и то же физическое место на диске, соответствующее номеру блока LBA. Если данные записываются в LBA-блоки с разными номерами, то это означает, что на диске они будут размещаться в разных местах, которые соответствуют номерам LBA-блоков. Если, к примеру, требуется записать на HDD-диск какойлибо файл, то первоначально он разбивается на блоки, каждому из которых присваивается определенный логический LBA-номер, а каждому логическому LBA-номеру соответствует жестко заданное место на диске.
Если же данные удаляются, то есть пользователь удаляет файл на уровне операционной системы, то на самом деле они не удаляются с диска, а просто соответствующие данным логические LBA-адреса на уровне операционной системы помечаются как свободные и могут в дальнейшем использоваться (данные могут перезаписываться). Важно, что контроллер самого HDD-диска ничего об этом не знает, однако для HDD-диска это не проблема, поскольку переписать LBA-блоки для HDD-диска не составляет труда.
В случае SSD-диска всё совсем по-иному. Дело в том, что в SSD-дисках нет однозначного соответствия между логическим номером записываемой порции данных (страницы) и ее физическим расположением во флэшпамяти. Еще раз напомним, что запись данных во флэшпамять производится страницами, а удаление — только блоками, причем для записи в уже использованную страницу ее предварительно необходимо очистить (стереть данные).
Во флэшпамяти данные преимущественно записываются последовательно, то есть они всегда записываются порциями по 4 Кбайт в следующую по порядку свободную страницу флэшпамяти. При этом логический адрес записываемой страницы (LBA) сопоставляется с физическим адресом (PBA), то есть с адресом расположения во флэшпамяти.
Для соответствия между логическими и физическими адресами (LBA-PBA mapping) предназначена специальная таблица соответствия логических и физических адресов. Эта таблица размещается в оперативной памяти SSD-диска.
При получении запроса на запись контроллер выделяет соответствующее число свободных страниц и заносит в таблицу соответствие между LBA- и PBA-адресами. Если же данные перезаписываются (то есть требуется записать данные с логическими адресами, которые уже заняты), то контроллер SSD-диска выделяет следующие свободные страницы памяти, а в таблице соответствия логических и физических адресов помечает страницы, в которые эти данные были записаны ранее, как содержащие устаревшую информацию. Важно, что при этом реально страницы с устаревшими данными не перезаписываются (как в HDD-дисках) и не удаляются.
Если же данные удаляются, то есть пользователь удаляет файл на уровне операционной системы, то, как и в случае HDD-диска, данные не удаляются с диска, а просто соответствующие данным логические LBA-адреса на уровне операционной системы помечаются как свободные и в дальнейшем могут быть использованы (данные могут перезаписываться). Важно, что контроллер самого SSD-диска ничего об этом не знает и считает соответствующие страницы памяти занятыми. То есть соответствующие страницы памяти не помечаются к удалению в таблице соответствия LBA- и PBA-адресов. Запись на SSD-диск в основном происходит последовательно, поэтому существует большая разница между записью на новый диск (на который данные еще не записывались) и на уже заполненный диск. Отметим, что заполненный диск с точки зрения пользователя может быть пустым, поскольку удаление данных с диска на уровне операционной системы еще не означает их реального удаления из флэшпамяти.
При случайной записи на пустой (или частично занятый) SSD-диск всё происходит очень просто. Все данные пишутся последовательно в страницы памяти, заполняя тем самым блоки памяти. Причем даже в том случае, если производится перезапись данных, они последовательно записываются в следующие по порядку свободные страницы памяти, а в таблице соответствия логических и физических адресов те страницы, в которые эти данные были записаны ранее, помечаются как содержащие устаревшие данные (помечаются к удалению).
Естественно, при таком последовательном алгоритме записи неизбежна ситуация, когда весь диск будет заполнен, то есть на нем не останется блоков со свободными страницами, а будут лишь блоки, содержащие заполненные страницы с актуальными данными, и страницы, помеченные к удалению (рис. 9).
Рис. 9. Запись данных на пустой и уже заполненный диски
Казалось бы, почему нельзя записывать новые данные в те страницы флэшпамяти, которые содержат устаревшие данные и помечены на удаление? Всё дело в том, что в архитектуре флэшпамяти для того, чтобы произвести запись данных в занятую страницу памяти, ее нужно предварительно очистить. Однако, как мы помним, если запись и чтение во флэшпамяти осуществляются страницами, то удаление возможно только блоками. И если нам нужно очистить какую-то страницу памяти, то придется стереть весь блок, в котором находится эта страница. Однако данный блок может содержать и страницы, помеченные на удаление (страницы с устаревшими данными), и страницы с актуальными данными, которые удалять нельзя.
Для того чтобы использовать блоки со страницами, помеченными на удаление, применяется метод переноса данных с помощью пустых и резервных блоков. Даже если пустых блоков в SSD-диске уже не осталось, всегда имеется определенное количество резервных блоков, применяемых для переноса данных. Чтобы удалить страницу с устаревшими данными, прежде нужно переместить из соответствующего блока страницы с актуальными данными в резервный свободный блок и уже потом удалить весь блок, содержащий страницы с устаревшими данными. Соответственно мы получаем частично занятый блок с перемещенными данными, доступный для записи, и пустой блок, который становится резервным. Однако в результате такого перемещения данных получается, что на SSD-диск приходится записывать больше данных, чем требуется. К примеру, если требуется записать всего одну страницу (4 Кбайт) и для этого нет свободного блока, то прежде нужно найти блок со страницами, помеченными на удаление. Если имеется блок, в котором помечена на удаление всего одна страница, то нужно переместить из этого блока в резервный блок остальные 127 страниц и дополнить его той одной страницей, которую нужно было записать. Затем блок со страницей, помеченной на удаление, стирается и становится резервным. Получается, что для записи всего одной страницы (4 Кбайт) приходится записывать 128 страниц (512 Кбайт), и это не считая того, что время тратится еще на чтение всего блока и его стирание. Именно поэтому скорость записи на новый диск (на который данные никогда не записывались) и на уже заполненный диск может кардинально различаться. Для того чтобы подчеркнуть принципиальную разницу в скорости записи на пустой и заполненный диски, используется такой показатель, как коэффициент усиления записи (Write Amplification), который показывает, во сколько раз больше данных приходится записывать, чем реально требуется. При записи на пустой диск коэффициент усиления записи равен единице, а при записи на заполненный диск он всегда больше единицы — его значение может колебаться от 2 до 25.
Рассмотренный пример является несколько идеализированным — в реальности механизм перемещения данных, то есть избавления от блоков со страницами, помеченными к удалению, используется по мере заполнения диска, причем с помощью как пустых, так и резервных блоков. Эту процедуру называют сбором «мусора» (Garbage Collection).
Существуют различные алгоритмы процедуры Garbage Collection, и разница между ними заключается в том, каким именно образом выбирается блок, используемый для перемещения данных. Понятно, что это должен быть блок, содержащий как можно больше страниц памяти, помеченных к удалению. Именно в этом случае можно минимизировать количество операций записи и, тем самым, уменьшить показатель Write Amplification. Кроме того, учитывая, что количество циклов перезаписи ячеек флэшпамяти ограничено, процедура Garbage Collection с выбором блока с наибольшим количеством страниц, помеченных к удалению, позволяет продлить время жизни SSD-диска.
Казалось бы — что мешает просто выбирать блок с максимальным количеством страниц, помеченных к удалению. Но для этого нужно просмотреть всю таблицу соответствия LBA-PBA, однако это очень трудоемкая операция для контроллера, которая требует достаточно много процессорных циклов. Такой способ выбора блоков на удаление не оптимален и ведет к снижению производительности, поэтому используются алгоритмы окна, когда анализируются не все блоки, а лишь некоторая их часть (окно блоков) с наибольшей вероятностью содержащая блок с максимальным количеством страниц, помеченных к удалению.
Теперь нужно выяснить, откуда берутся те самые резервные блоки, которые применяются для перемещения данных. Если имеется SSD-диск, емкость которого составляет 160 Гбайт, то реально для записи доступно 160 десятичных, а не двоичных гигабайт. То есть реально емкость диска, доступная для записи, составит 160 000 000 000 байт, а не 171 798 691 840 байт, как в двоичной интерпретации (в двоичной интерпретации 1 Кбайт = 1024 байт). Разница между емкостью диска в двоичной и десятичной интерпретации как раз и составляет резерв блоков для перемещения данных (резервная область). В случае SSD-диска размером 160 Гбайт резервная область равна 11 798 691 840 байт, или примерно 11 Гбайт в двоичной интерпретации. Важно отметить, что резервная область диска — это не какойто выделенный участок блоков памяти. Резервные блоки как бы «размазаны» по всему диску, более того — их расположение динамически меняется во времени. Любой блок памяти может быть и резервным, и доступным для записи.
Также отметим, что если при записи в какойто блок памяти выдается ошибка, то он помечается как Bad-блок и в дальнейшем не используется. Причем объем доступного для записи места при этом не уменьшается, поскольку все Bad-блоки автоматически помечаются как резервные. То есть, если по мере эксплуатации SSD-диска в нем увеличивается количество Bad-блоков, это автоматически означает, что уменьшается размер резервной области диска. Естественно, это приводит к тому, что производительность диска в операциях записи начинает снижаться, поскольку от количества резервных блоков зависит скорость записи.
Разница между последовательной и случайной записью в SSD-дисках
Итак, мы рассмотрели первый феномен SSD-дисков, заключающийся в том, что скорость записи на новый и ранее использовавшийся диски может заметно различаться. Есть и другой феномен: разница в скорости последовательной и случайной записи. Казалось бы, если данные записываются на SSD-диск преимущественно последовательным образом, то можно вообще ли говорить о случайной записи? Однако не будем спешить с выводами. Представим себе последовательную (с точки зрения операционной системы) запись большого массива данных на пустой диск. То есть запись, при которой все логические LBA-адреса заполняются последовательно.
В этом случае все физические блоки памяти будут заполняться последовательно, а если данные перезаписываются, то опять-таки будут образовываться блоки, целиком состоящие из страниц, помеченных к удалению. В этом случае не требуется использовать технологию перемещения данных, поскольку если блок состоит только из страниц, помеченных к удалению, то его можно стереть целиком, не перемещая из него никаких данных. Понятно, что в таком случае (то есть в случае последовательной записи) коэффициент усиления записи равен 1 и достигается максимальная скорость записи.
В случае случайной записи даже на пустой диск, хотя данные и записываются преимущественно последовательным образом, пока не будет заполнено всё доступное пространство диска, неизбежно возникают операции перезаписи данных мелкими порциями, и в результате блоки данных содержат как страницы с нужными данными, так и страницы, помеченные к удалению. Это как раз та ситуация, которая была рассмотрена ранее, то есть по мере заполнения диска начинает использоваться механизм перемещения данных и коэффициент усиления записи становится больше единицы. Таким образом, за счет эффективного использования технологии перемещения данных скорость случайной записи всегда ниже скорости последовательной записи (рис. 10).
Рис. 10. Разница между последовательной и случайной записью
Существует еще одна принципиальная разница между случайной и последовательной записью, которая заключается в принципах формирования и оптимизации таблицы соответствия LBA-PBA. Строго говоря, речь идет не просто о таблице, а о гораздо более сложной структуре. Не вникая в детали, отметим, что данная таблица не содержит отдельных записей для каждого сектора, а оперирует блоками переменной длины, и чем больше эти блоки, тем меньшее количество записей в таблице требуется. Более того — по мере заполнения такой таблицы начинается процедура ее оптимизации, что сильно отражается на производительности диска.
Процесс оптимизации, по сути, состоит из объединения разрозненных маленьких фрагментов в один непрерывный сегмент. Одно такое объединение позволяет заменить несколько тысяч записей в таблице на одну запись. Объединение делается путем считывания разрозненных фрагментов и последовательной их записи в новый сегмент. Физические блоки, где эти фрагменты ранее размещались, помечаются как неиспользуемые.
При последовательной записи фактически создается один большой фрагмент. Поэтому записей в таблице будет очень мало и оптимизировать ее не надо. Если же запись производится случайным образом, то необходимость постоянной оптимизации таблицы приводит к тому, что производительность диска резко падает.
Механизм Wear Leveling
Кроме рассмотренных ранее специфических особенностей, SSD-диски имеют и другие отличия от HDD-дисков. В частности, для того чтобы обеспечить равномерное использование всех ячеек памяти и тем самым повысить долговечность SSD, применяется механизм Wear Leveling. Он заключается в том, что контроллер SSD-диска отслеживает частоту использования различных блоков памяти, и если какието блоки памяти применяются реже остальных, то он принудительно повышает частоту их использования. Рассмотрим, к примеру, ситуацию, когда записывается большой архив фотографий, занимающий половину диска. Понятно, что архивные фотографии не будут перезаписываться, и получается, что, будучи один раз записанными, блоки памяти, соответствующие этому архиву, больше не используются, в то время как остальные блоки памяти эффективно применяются, а следовательно, быстрее изнашиваются. Для того чтобы уравнять частоту использования всех блоков памяти и тем самым увеличить время жизни SSD-диска, механизм Wear Leveling принудительно перезаписывает неиспользуемые блоки данных в другие блоки, высвобождая их для применения.
Способы повышения производительности SSD-дисков
Как уже отмечалось, слабость SSD-диска заключается в том, что его производительность (скорость записи) со временем снижается. Напомним, что происходит это из-за того, что по мере заполнения диска уменьшается количество свободных блоков, которые можно использовать для перемещения данных.
Однако скорость записи можно повысить путем принудительного увеличения размера резервной области (за счет сокращения области диска, доступной для записи), то есть путем принудительного увеличения количества блоков памяти, применяемых для перемещения данных.
Компания Intel приводит следующие данные для своих новых дисков X25-M размером 160 Гбайт. Если использовать диск (уже применявшийся) для случайных операций (чтение, запись) с блоками данных размером 8 Кбайт при соотношении операций чтения и записи 2:1 и использовать для записи всё доступное пространство, то есть все 160 Гбайт (размер резервной области по умолчанию), то мы получим производительность примерно 1400 IOPS. Если же сократить размер доступного для записи пространства до 96 Гбайт, тем самым увеличив размер резервной области, то производительность возрастет до 8300 IOPS. При сокращении используемого пространства до 128 Гбайт производительность увеличится до 5500 IOPS, а при сокращении до 144 Гбайт — до 3500 IOPS.
Естественно, возникает вопрос: каким образом можно регулировать размер резервной области с целью повышения производительности случайной записи? Самый простой вариант — создать на диске логический раздел (partition) меньше физического размера диска. В этом случае не применяемое для логического раздела пространство автоматически станет резервной областью диска. Правда, следует отметить, что данный способ годится только для нового диска, на котором до этого не создавалось логических разделов. Если же на диске первоначально был создан логический раздел по размеру всего диска и он ранее использовался, то создание нового логического раздела не приведет к ожидаемым результатам. В этом случае диск нужно прежде почистить, то есть принудительно очистить все блоки памяти. Обычная операция форматирования при этом помогает не всегда (это зависит от операционной системы, модели SSD-диска и версии прошивки диска), поэтому для очистки дисков иногда приходится применять специальные утилиты, о которых речь пойдет далее, а пока познакомимся с еще одним средством повышения производительности — командой TRIM.
Другой способ повышения производительности SSD-дисков в операциях записи заключается в том, чтобы периодически производить процедуру очистки диска от «мусора», то есть время от времени очищать блоки памяти от страниц, помеченных к удалению, увеличивая тем самым количество пустых блоков.
Для такой процедуры можно использовать специализированные утилиты (например, wiper.exe, которая поставляется с некоторыми моделями SSD-дисков или может быть просто скачана из Интернета, или фирменную утилиту для оптимизации производительности диска), которые сканируют диск и очищают его от страниц, помеченных к удалению.
Можно также вообще очистить все блоки диска от данных и фактически вернуть диск к своему первоначальному состоянию, то есть сделать из уже использованного диска новый диск (ранее не применявшийся). Для этого можно использовать утилиту HDD Eraser (запускается под DOS).
Другой подход заключается в том, чтобы переложить задачу очистки диска от «мусора» на операционную систему и сам диск. Для этого предназначена специальная команда TRIM.
Если операционная система и SSD-диск поддерживают команду TRIM, то при удалении некоторого файла с диска ОС посылает команду TRIM диску и дает ему знать, что данные из определенного набора страниц могут быть перезаписаны, то есть соответствующие страницы памяти помечаются к удалению и могут применяться в процедуре Garbage Collection. Важно отметить, что сама по себе команда TRIM не приводит к физическому удалению данных. Преимущество команды TRIM заключается в том, что с ее помощью можно увеличить количество блоков, содержащих страницы, отмеченные к удалению, и тем самым повысить эффективность процедуры Garbage Collection при выборе блока с наибольшим количеством страниц, отмеченных к удалению. Тем самым, команда TRIM способствует увеличению производительности диска, минимизируя избыточную запись при перемещении данных. Кроме того, использование команды TRIM позволяет снизить число перемещений данных в процедуре Wear Leveling.
Для работы команды TRIM необходима поддержка со стороны как ОС, так и SSD-диска. Команда TRIM реализована в операционной системе Windows 7, а также в ядре Linux начиная с ревизии 2.6.28. Кроме того, все основные производители SSD-дисков объявили о поддержке этой команды. Тем не менее не все старые SSD-диски ее поддерживают.
В операционной системе Windows 7 команда TRIM используется в таких операциях, как удаление файлов и даже форматирование. Поэтому если мы хотим увеличить размер резервной области диска для повышения его производительности за счет уменьшения логического раздела диска, то достаточно перед удалением старого логического раздела отформатировать его или просто удалить всё содержимое, а потом уже удалить старый логический раздел и создать новый. Если вы применяете операционную систему Windows 7 и у вас имеется RAID-массив из SSD-дисков, то тут уже не всё так просто. Для того чтобы использовать команду TRIM, нужно, чтобы драйвер RAID-контроллера ее поддерживал. Однако далеко не все RAID-контроллеры имеют соответствующие драйверы. Правда, если речь идет о RAID-контроллере Intel, интегрированном в чипсет, то в случае применения драйвера Intel RST версии 9.6 и выше команда TRIM будет работать и с RAID-массивом.
Как мы уже отмечали, очистку SSD-диска от «мусора» можно проводить и в ручном режиме с помощью специальных утилит. К примеру, компания Intel выпускает для своих SSD-дисков специальную утилиту Intel SSD Toolbox, которая, в частности, позволяет производить принудительную очистку диска от «мусора» и тем самым повышать его производительность.
Заключение
Подытожим особенности работы SSD-дисков. Самое слабое место SSD-дисков — это операции случайной записи и снижение производительности SSD-диска по мере его эксплуатации, то есть производительность нового диска (еще не применявшегося) и уже заполненного диска (удаление файлов не всегда означает их физическое удаление из блоков памяти диска) могут существенно различаться.
Частично решить проблему снижения производительности при случайной записи можно за счет применения команды TRIM, для чего необходимо использовать операционную систему Windows 7 или Linux с ядром версии 2.6.28 и выше, а также SSD-диски, контроллеры которых поддерживают команду TRIM.
Кроме того, повысить производительность SSD-дисков можно путем принудительного увеличения резервной области, то есть количества резервных блоков памяти, используемых для операций перемещения данных. Сделать это можно, если создать логический раздел диска (партицию) с размером меньше физического размера диска. Тогда всё неиспользуемое пространство автоматически будет применяться как резервная область диска.
В статье «Тестирование SSD-диска Intel X25-M 160 Гбайт», опубликованной в этом номере журнала, можно ознакомиться с подробным анализом результатов тестирования нового SSD-диска компании Intel, основанном на теоретическом материале, изложенном в данной статье.