Происходящий последние полвека феноменальный рост компьютерной индустрии был бы невозможен без постоянного повышения плотности твердотельной памяти — уменьшения физического размера ячеек, однако растущие потребности приложений в памяти наряду с увеличением спроса на средства обработки Больших Данных снова сулят колоссальные трудности на пути дальнейшего развития технологий памяти.
Каждый чип хранит миллиарды битов в почти непрерывно работающих микроскопических ячейках, содержащих относительно небольшое число электронов. Полупроводниковая отрасль далеко продвинулась в развитии технологий динамической оперативной памяти и флэш-памяти, которые сегодня работают стабильно и без ошибок и служат иногда во много раз дольше, чем другие компьютерные комплектующие. Однако, чтобы добиться достигнутой на данный момент огромной плотности упаковки элементов, в микросхемах была реализована масса механизмов компенсации сбоев. В DRAM, например, благодаря постоянному обновлению сохраняются непрерывно «утекающие» данные, коды коррекции ошибок позволяют восстанавливать значения ошибочно переданных битов, а во флэш-памяти имеется уровень трансляции (Flash Translation Layer, FTL), задерживающий и маскирующий появление случайных и постоянных ошибок. До недавнего времени подобные технологии позволяли полупроводниковой индустрии стремительно продвигаться вперед.
Повышение плотности памяти с сохранением стабильности становится делом настолько сложным и затратным, что скоро может потребоваться радикальный отход от традиционных технологий, а это означает серьезные последствия для разработчиков ПО и системных инженеров. По мере того как ячейки памяти становятся все меньше, их стабильность ухудшается, и даже ничтожное воздействие на хранимый заряд способно изменить состояние ячейки. В числе возможных способов улучшения стабильности предлагаются дорогостоящие технологии изготовления: вертикальная «штабелевка» ячеек, альтернативные методы хранения, переход на гетерогенные иерархии памяти, а также более совершенные технологии коррекции, позволяющие надежно работать с нестабильной памятью.
Перечислим проблемы, которые предстоит преодолеть для дальнейшего повышения плотности памяти, и разберем возможные гетерогенные иерархии памяти будущего. Переход на новые технологии потребует новых уровней взаимодействия между программным и аппаратным обеспечением, а также значительных изменений в приложениях, средствах разработки и механизмах поддержки системного ПО.
Классы и характеристики памяти
Память делится на два основных класса: рабочую и долговременную. В рабочей памяти в период активных вычислений временно буферизуются входные данные, промежуточные значения и результаты — например, динамическая оперативная память (DRAM), используемая в качестве основной памяти, и статическая оперативная память (SRAM), применяемая в роли кэша процессора. Для сохранения состояния обе технологии используют электрический заряд, но в SRAM двоичный разряд хранится в схеме с положительной обратной связью, что позволяет поддерживать состояние без регенерации, необходимой в DRAM. В долговременной памяти данные сохраняются для последующего извлечения и обработки, либо она может использоваться в качестве дополнительного буфера, когда емкости рабочей памяти не хватает. В качестве долговременной памяти традиционно использовались магнитные жесткие диски, но в последние 10–15 лет к ним присоединилась флэш-память, также основанная на хранении заряда. Изначально флэш-память использовалась в основном в устройствах потребительской электроники, но затем проникла в твердотельные накопители, которые приходят на смену жестким дискам, применяемым вплоть до систем хранения для ЦОД.
В табл. 1 дается краткий обзор двух типов памяти. Рабочая память DRAM адресуется с точностью до байта, энергозависима, отличается меньшей емкостью, но и меньшей задержкой доступа; обращаясь к ней, процессоры могут быстро манипулировать элементами данных с высокой гранулярностью на протяжении относительно ограниченного периода времени, после чего данные могут переноситься в долговременную память. У флэш-памяти больше емкость, она энергонезависима и может хранить информацию несколько лет. Низкая задержка доступа для такой памяти менее критична, допустим менее гранулярный уровень доступа, поскольку данные для обработки загружаются в рабочую память. Долговечность важна для обоих типов памяти — нужно, чтобы они работали столько же, сколько и весь компьютер. Что касается энергопотребления, то оно сильно зависит от конкретного устройства и применения.
Таблица. 1. Основные характеристики технологий памяти |
Новые проблемы
Как в DRAM, так и во флэш-памяти используется заряд — электроны заносятся в ячейки для хранения данных, а считывание происходит при подаче напряжения. Для перемещения электронов достаточно низких энергий, что одновременно и хорошо, и плохо — высокая мобильность носителей позволяет быстро считывать и записывать биты с малыми затратами энергии, но делает сложным долгосрочное удержание информации, поскольку электроны могут легко «убегать» из ячеек. Во флэш-памяти это предотвращается за счет толстого слоя оксидного изолятора, который удерживает заряд дольше, однако для программирования ячеек требуется «пробивать» этот слой электронами, из-за чего снижается долговечность, поскольку оксидный слой постепенно деградирует, в конечном счете ухудшая свою способность удерживать заряд.
Повышение плотности требует уменьшения размеров ячеек, но по мере миниатюризации они могут удерживать все меньший заряд — соответственно, на заряд одиночного электрона приходится все большая доля общего заряда ячейки, и даже если небольшое число электронов покинет ее или проникнет в нее, хранимое значение испортится. По мере уменьшения размера ячейки проблему усугубляет производственный брак — неоднородность ячеек. Отклонения затрагивают геометрию и состав ячейки, в результате некоторые из них могут удерживать намного меньший по сравнению с нормой заряд либо оксид в них разрушается гораздо раньше, чем в остальных.
Исторически индустрия памяти решала эти проблемы путем использования новых материалов, производственных процессов или геометрий ячейки, но все чаще для повышения плотности некоторыми важными характеристиками приходилось жертвовать. Например, вместо хранения одного бита в каждой одноуровневой ячейке (single-level cell, SLC) перешли на многоуровневые ячейки (multi-level cell, MLC), сохраняющие по несколько бит за счет деления диапазона напряжений, используемого для чтения и записи. В результате повышается плотность памяти, но ускоряется износ. Еще один пример — регенерация DRAM: если ее не будет, DRAM не способна сохранять записанные значения, поэтому ячейки приходится периодически считывать и перезаписывать, чтобы поддерживать необходимый уровень заряда. Однако непрерывное обновление приводит к ухудшению быстродействия и требует дополнительного расхода энергии.
При отсутствии эффективного решения для удержания электронов в более компактных ячейках DRAM непроизводительные затраты на компенсацию ошибок памяти могут стать непозволительно высокими. К примеру, повышенная частота обновления может отнимать так много тактов памяти, что на реальные операции считывания и записи их просто не останется. А совершенствование механизмов коррекции ошибок — еще одно стандартное решение для серверной DRAM — повышает сложность конструкции чипа и требует дополнительного пространства для хранения кодов коррекции, вследствие чего прибавка в плотности уменьшается и возрастает цена. Кроме того, коррекция ошибок в рабочей памяти может увеличивать задержку — требования к быстродействию рабочей памяти гораздо выше, чем к долговременной, а решения для повышения надежности, например добавление трансляционного слоя, не подходят для рабочей памяти ввиду большой задержки, которую они создают.
Еще одна сложность, касающаяся рабочей памяти, особенно серверной, состоит в том, чтобы выделить достаточную пропускную способность памяти процессорным ядрам. Она растет не так быстро, как число ядер в процессорах, и необходимость делить между ними узкую полосу пропускания приводит к снижению производительности.
Альтернативы и последствия
Для преодоления упомянутых трудностей разрабатываются альтернативные виды памяти (табл. 2).
Таблица 2. Альтернативные технологии памяти |
Производители DRAM и флэш-памяти идут по пути вертикального размещения памяти в несколько ярусов — таким образом, увеличивается плотность ячеек на единицу площади, снижается стоимость на бит и повышается быстродействие. Атомные (резистивные) технологии памяти основаны на изменении физической конфигурации атомов или вакансий в ячейке, за счет чего меняется ее сопротивление. Магнитные (резистивные) схемы памяти основаны на изменении ориентации ферромагнитного материала с плавающей полярностью по отношению к материалу с фиксированной, что тоже влияет на сопротивление ячейки. О других альтернативных технологиях можно узнать из работ [1–3].
Вертикальная флэш-память, вероятнее всего, будет применяться в качестве долговременной, поскольку процесс ее производства сегодня ближе всего к используемому для выпуска флэш-памяти. Увеличенная благодаря переходу в третье измерение плотность позволит производителям поначалу задействовать более крупные ячейки, вследствие чего временно уменьшатся проблемы с надежностью. Какое-то время повышение плотности может продолжаться за счет увеличения числа ярусов в ячейке, но в конечном итоге будет достигнуто ограничение, когда затраты на производство станут несоразмерно высокими. После этого предела производителям придется вернуться к уменьшению размеров ячейки со всеми сопутствующими сложностями. Затем, вероятно, произойдет переход на атомные технологии, если стоимость крупномасштабного производства такой памяти удастся снизить до уровней стоимости нынешней флэш-памяти.
Прогнозировать развитие решений в области рабочей памяти сложнее ввиду более строгих требований к ее быстродействию. Вероятно, в краткосрочной перспективе в серверах начнут применять HMC-массивы, обеспечивающие более высокую производительность, однако, из-за меньшей емкости, технология HMC, скорее всего, не сможет вытеснить модули DRAM, а будет применяться вместе с ними. Что касается более отдаленной перспективы, у каждой из технологий-кандидатов есть недостатки, которые пока не преодолены. У магнитной памяти присутствуют все требуемые характеристики, однако высокой плотности такой памяти достичь трудно, и пока она не сравнима с DRAM. Атомные технологии памяти, похоже, имеют хорошие перспективы повышения плотности и приемлемые задержки считывания, но, так как их принцип сохранения данных основан на изменении атомной конфигурации ячейки, время и энергия, которые нужны на запись данных в такие ячейки, могут оказаться недопустимо высокими. Кроме того, при записи деформируется материал ячейки, это вызывает деградацию и приводит к преждевременному износу, вследствие которого ячейка «застревает» на низком или высоком сопротивлении, что может ухудшить долговечность системы в целом. Механизмы, разработанные для DRAM, например коды коррекции ошибок, еще больше усугубляют проблему, уменьшая срок службы атомной памяти.
Тернии будущего
Несмотря на преимущество перед DRAM с точки зрения перспектив увеличения плотности, ни одна из альтернативных технологий пока не может сравниться с ней по совокупности параметров, а это означает следующее:
- в пределах одной системы будут использоваться несколько модулей памяти разного типа, что усложнит системную архитектуру;
- в будущих технологиях памяти какая-либо характеристика может приноситься в жертву ради улучшения остальных, в связи с чем могут потребоваться модификации не только интерфейса модуля памяти, но и других системных уровней (кроме того, нужно будет организовать взаимодействие);
- потребуется возможность работы системной памяти в нескольких разных режимах, зафиксированных на этапе проектирования либо настраиваемых в период исполнения.
Эти перемены, в свою очередь, могут повлиять на уровни системного стека: интерфейсы памяти, аппаратные контроллеры памяти, ОС и среды исполнения, а также на языки и принципы программирования. Разработчики ПО и инженеры должны определиться, как выгоднее всего экспонировать сведения о памяти и ее «ручки настройки» для остальной части системы. Увеличение открытости дает больше возможностей, но и добавляет сложности и нестабильности.
Разберем гипотетическую систему, в которой в качестве компонентов общей рабочей памяти используется память трех видов: DRAM, HMC (память высокого быстродействия, но меньшей емкости) и PCM (память на фазовых состояниях с многоуровневыми ячейками, имеющая большую емкость, но меньшее быстродействие и изнашивающаяся при операциях записи). Все три составляют одно и то же плоское физическое адресное пространство, что требует больше поддержки в системном стеке, чем для традиционной рабочей памяти. На рисунке показана такая иерархия (слева внизу — три типа модулей памяти: DRAM, HMC и PCM) вместе с системными уровнями (в середине и вверху слева: контроллеры памяти, ОС, среды исполнения, язык программирования и приложения) и отмечено, на каких из этих уровней требуется дополнительная поддержка для каждого из пяти сценариев.
Гетерогенность памяти и систем
Из-за появления различных технологий и отсутствия единой, оптимальной по всем характеристикам, проектировщики начнут оснащать системы несколькими типами памяти, объединяя их для создания более эффективной общей рабочей памяти. Такие системы будут отличаться от привычных строго линейных иерархий, в которых рабочая память состоит из модулей одного типа. В этом новом мире программное обеспечение придется оптимизировать так, чтобы использовать преимущества разных типов памяти в иерархии (сценарий 1 на рисунке): к примеру, приложения, которым нужен максимум быстродействия, будут использовать HMC, а приложения, требующие много памяти, но редко в нее записывающие, воспользуются PCM, которая дает больше емкости, но изнашивается при операциях записи. Приложения, часто записывающие в память, но которым не хватит емкости HMC, могут пользоваться обычной DRAM. В подобном сценарии ОС должна быть осведомлена о гетерогенности памяти, чтобы резервировать лучший ее тип для каждого приложения, а контроллеры памяти должны взаимно координировать свою работу, чтобы соответственно направлять запросы.
Сценарий 2 касается использования энергонезависимой памяти. Рабочая память традиционно была энергозависимой, но данные PCM в описываемой гипотетической системе при отключении энергии сохраняются — таким образом, стирается грань между рабочей и долговременной памятью, что имеет определенные последствия для всего стека, особенно с точки зрения безопасности. Часть рабочей памяти теперь энергонезависима и поэтому может быть уязвима перед атаками холодной перезагрузки, для противодействия которым может потребоваться дополнительная поддержка — например, механизм в контроллерах памяти, шифрующий данные перед сохранением в PCM.
Еще одна проблема энергонезависимости — как экспонировать такую память для ПО? Самый простой способ — представить PCM в качестве обычного тома хранения большой емкости, для чего потребуется лишь поддержка на уровне ОС. Но при этом упускаются некоторые потенциальные преимущества, особенно если программный стек не оптимизирован для работы с быстрым пространством хранения и может создать большие непроизводительные затраты на доступ. Альтернатива — осуществлять доступ к рабочим данным как к части виртуального адресного пространства приложений без представления в виде файла (сценарий 3). На первый взгляд, этот вариант выглядит оптимальным, однако механизм назначения энергонезависимой памяти своей области виртуального адресного пространства требует поддержки на уровне языка программирования и создает риск некорректности работы системы. Во-первых, распространенные дефекты кода вроде висячих указателей и прочих ошибок управления памятью могут оказывать постоянное действие — после перезапуска приложения или всей системы аномальное состояние не обязательно будет устранено. Во-вторых, если одному и тому же приложению доступны и энергозависимая, и энергонезависимая память, то могут возникать и другие ошибки, связанные с использованием указателей. Пример — указатель в энергонезависимой памяти, отсылающий на данные в энергозависимой; когда приложение перезапускается, энергозависимые данные исчезают, но указатель на них остается актуальным. Наконец, может усложниться восстановление после непредвиденных системных сбоев — даже если приложение написано корректно, данные могут повредиться из-за сбоев питания или подобных событий.
Экспозиция для разных уровней
Принесение в жертву одних характеристик ради других — не новшество для индустрии. Например, твердотельные накопители на одноуровневой флэш-памяти NAND гарантируют больший срок службы, чем их наследники SSD большей емкости на многоуровневой NAND, и компромисс здесь касается исключительно характеристик самого продукта, так как сбои и результирующая фрагментация памяти маскируются с помощью трансляционного слоя. А вот недостатки новых технологий памяти, в том числе износ памяти PCM, от программного обеспечения скрыть будет уже непросто.
Изнашиваемая память
Проблема износа атомных типов рабочей памяти непосредственно сказывается на корректности работы модуля, а не только на его быстродействии или начальных характеристиках. Если рабочая память изнашивается и какие-то ее области становятся непригодными для использования, то привычная удобная абстракция непрерывного физического адресного пространства нарушается.
Та же проблема касается флэш-памяти, но износ здесь влияет только на характеристики продукта (количество циклов записи, выдерживаемых модулем), а не на корректность работы. Причина, по которой меньшая долговечность влияет только на характеристики, в случае флэш-памяти состоит в том, что она используется как долговременная и допускает более длительные задержки доступа. Увеличение задержек делает возможным включение в иерархию памяти слоя трансляции, который создает иллюзию непрерывного физического адресного пространства. FTL с помощью сложных механизмов распознает и исправляет ошибки, равномерно распределяя износ, и создает дополнительный уровень косвенной адресации путем переадресации операции на исправную память, когда какие-то участки выходят из строя. Но увеличение задержки, обусловленное FTL, для рабочей памяти недопустимо.
Таблица 3. Аппаратные методы управления памятью |
В табл. 3 показаны различные решения, предлагаемые для распознавания и устранения ошибок, а также для нивелирования износа в рабочей памяти. Все они нацелены на создание быстрой и долговечной рабочей памяти с низким уровнем сложности реализации. Но эти предложения в основном способствуют повышению надежности на аппаратном уровне, по возможности маскируя максимум дефектов для программных уровней. В частности, ни одно из решений не выполняет активное переназначение сбойных блоков, как FTL, поскольку затраты на подобные операции для рабочей памяти будут непозволительно высокими. Вместо этого предлагаются альтернативные подходы, подразумевающие экспозицию сбоев изношенной рабочей памяти для программного обеспечения.
Приведем пример межуровневого системного взаимодействия в целях ограничения износа. Чтобы можно было работать несмотря на сбои в изнашиваемой рабочей памяти, надо использовать управляемую среду исполнения, например, для кода Java или C#. Поскольку такие среды абстрагируют память, они могут резервировать для объектов ее произвольные участки. Это могло бы позволить избегать «дыр» в памяти, созданных изношенными блоками. Еще одно преимущество — высокая гранулярность, с которой среды исполнения могут обращаться к памяти. Объекты могут быть весьма компактными, это удобно, учитывая, что минимальный размер отбраковываемых неисправных фрагментов обычно соответствует величине одного кэш-блока (64 байта). Данное решение опирается на предположение о том, что у системы в любом случае есть область памяти, которая не изнашивается (например, DRAM), так что ОС и приложения, не терпящие сбоев памяти, могут нормально работать. Программы же, способные выполняться несмотря на сбои, должны объявлять, что они могут пользоваться памятью, способной дать сбой в период выполнения или уже частично неисправной. Мотивация для такого использования заключается в том, что эта память,скорее всего, будет дешевле и вместительнее.
Взаимодействие между аппаратным и программным обеспечением реализуется следующим образом. Оборудование распознает обусловленные износом сбои в процессе возвращения кэшированных данных в рабочую память — если значение записать не удается, значит, произошел сбой. Тогда оборудование буферизует это значение и генерирует прерывание, обрабатываемое ОС. Отметим, что сбои из-за износа приводят к невозможности записи битов, а не к случайным их переключениям, характерным для DRAM. Как только обнаружен сбой из-за износа, соответствующий адрес памяти больше не используется и при операциях считывания сбой повторно не распознается. ОС отвечает за восстановление незаписанных данных из аппаратного буфера, и теперь, помимо управления физической памятью, она должна вести карту неисправных блоков. При резервировании памяти средой исполнения ей передается участок карты сбоев, близкий к резервируемой области. Диспетчер памяти среды затем заботится о том, чтобы под объекты неисправные блоки не резервировались.
Терпимость сред исполнения к сбоям имеет свою цену. Сбои распределяются произвольно, особенно при использовании механизмов нивелирования износа, поэтому могут вызывать фрагментацию. К примеру, если раньше можно было сохранить некоторый объект в непрерывном регионе памяти, то после фрагментации уже нельзя. Ослабить эту проблему можно соответствующими механизмами низкого уровня, например с помощью аппаратных средств дефрагментации. Как показали тесты, при использовании такого механизма даже при неисправности половины блоков быстродействие диспетчера памяти ухудшается в среднем лишь на 12%.
Статический и динамический выбор режима
Проектировщики могут пойти на различные компромиссы, чтобы получить модуль памяти с желаемыми характеристиками — например, выбирая для PCM материалы с разной способностью к переходу из одного состояния в другое, можно получать память с различной скоростью считывания и записи данных. В этом случае режим работы выбран статически, и скорость чтения/записи изменить уже нельзя.
Когда память неоднородна, ее участки с определенными свойствами можно делать доступными динамически — в частности, если для приложения допустимы незначительные ошибки, то ему можно предоставить память с более высокой плотностью. Некоторые приложения (например, системы анализа показания датчиков, машинного обучения и обработки изображений) работают с ошибкоустойчивыми структурами данных — эти приложения могут выдавать приемлемые результаты, даже если некоторые биты их структур данных некорректны (сценарий 5). Некоторым из таких приложений нужна огромная емкость памяти, и можно увеличить плотность, заплатив за это повышением доли ошибок. Чтобы использовать более емкие, но чреватые ошибками виды памяти, необходима межуровневая системная поддержка. Модули памяти должны предоставлять операционной системе «ручки настройки», позволяющие выбирать необходимые компромиссы, например повышенную плотность с увеличенным процентом ошибок. Пользуясь такой «ручкой», ОС резервирует соответствующие области памяти для приложений. Языки программирования должны давать разработчикам возможность обозначить данные, которые можно хранить в плотных «ошибочных» областях, а среды исполнения должны знать о существовании таких типов памяти и управлять ими.
Как уже отмечалось, будущие перемены в технологиях памяти отразятся сразу на нескольких уровнях системного стека, как программных, так и аппаратных. Проектировщикам нужно решить, каким именно способом экспонировать характеристики памяти: быстродействие, энергозависимость и сбои. А также — какие «ручки настройки» предоставить программному обеспечению, например, для динамической регулировки компромиссов между плотностью, надежностью, быстродействием и потребляемой мощностью. Если экспонировать компромиссы только для низких уровней, системный стек будет затронут меньше, но тогда нельзя будет избирательно пользоваться оптимизациями для узких применений. Если же раскрывать большой объем информации об особенностях памяти всем системным уровням, то возрастает уровень сложности, но зато на каждом из них можно будет оптимальнее задействовать преимущества памяти разных типов.
***
При проектировании иерархий памяти возможны варианты, выбор которых определяется балансом между функциональностью и сложностью. Но лучшие конструкции потребуют тесного взаимодействия всех уровней системы, а лучшие компромиссы будут достигнуты, когда все уровни проектируются параллельно. Развитие DRAM- и флэш-памяти скоро упрется в физические ограничения, и остается под вопросом, какие из технологий станут их преемниками и какова будет организация памяти. Можно предположить, что произойдет переход на специализированные конструкции памяти для разных систем, подобно тому как в мире процессоров идет переход в сторону специализированных чипов. Ключом к дальнейшему повышению плотности памяти станут пересмотр абстракций и усиление взаимодействия между многими программными и аппаратными уровнями системных стеков.
Литература
- Y.-J. Song et al. What Lies Ahead for Resistance-Based Memory Technologies? Computer, Aug. 2013, P. 30–36.
- Y. Li, K.N. Quader. NAND Flash Memory: Challenges and Opportunities, Computer, Aug. 2013, P. 23–29.
- International Technology Roadmap for Semiconductors 2011 Edition, Executive Summary, Int’l Tech. Roadmap for Semiconductors, 2011; URL: http://www.itrs.net/Links/2011itrs/2011Chapters/2011ExecSum.pdf (дата обращения: 18.04.2014).
Карин Страусс (kstrauss@microsoft.com) — научный сотрудник, Даг Бургер (dburger@microsoft.com) — директор отделения Extreme Computing Group, Microsoft Research.