(Часть 1)

Когда одного из компьютерных «гуру» 80-х спросили, как он себе представляет архитектуру будущих компьютерных систем, тот ответил, что видит её как огромное пастбище компьютерной памяти, где, как коровы, пасутся процессоры.

Если продолжить эту аналогию процессора с коровой, то современный компьютер можно представить в виде стойла, в котором стоят коровы (ядра процессоров) и едят сено (данные).

Persistent Memory и вычисления в памяти

Во двор или проход коровника (оперативная память) им регулярно подносят охапки сена (блоки данных) из амбара (СХД). Persistent Memory можно в такой аналогии можно уподобить открытому пастбищу, где коровы могут пастись в своё удовольствие. Тогда не нужно косить траву и складировать её в виде «блоков» или «файлов» сена в амбаре «СХД».

Persistent Memory и вычисления в памяти

Сам того не ведая, почти 40 лет назад этот «гуру» предрёк появление спустя такого революционного изменения компьютерной архитектуры, как Persistent Memory.

По-русски Persistent Memory иногда не совсем верно называют «постоянное запоминающее устройство», ПЗУ. Этот термин берёт своё начало от зари развития компьютерной индустрии и имеет несколько иной смысл.

Другие синонимы термина Persistent Memory:

  • Storage Class Memory (Память класса СХД)
  • NAND (хотя это не так, но часто путают)
  • NVDIMM (Non-volatile DIMM)
  • 3D XPoint
  • Optane

Последние два пункта – конструктивно одно и тоже, только 3D XPoint – зарегистрированное название фирмы Micron, а торговая марка Optane принадлежит Intel.

История вопроса

Со времени появления в середине 60-х годов, жёсткие диски остаются наиболее распространённым средством хранения больших объёмов данных. Несмотря на свои преимущества (ёмкость, выносливость и пр.), есть у них и недостатки. Это, прежде всего, недостаточная пропускная способность чтения-записи, а также задержки, что приводит к ожиданию процессора на доставку данных из СХД в память. Кроме того, жёсткие диски хранят данные в виде последовательных байтовых потоков, а это приводит к дополнительным затратам вычислительных ресурсов на сериализацию и десериализацию данных. Поэтому, скорость ввода-вывода для жёстких дисков стала основным ограничивающим фактором для приложений, которым нужен быстрый доступ к данным, например, критичных ко времени СУБД.

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

Поэтому и появилась технология Persistent memory, которая сочетает в себе преимущества обоих миров запоминающих устройств.

Persistent Memory и вычисления в памяти

Persistent memory способна обеспечить производительность на уровне оперативной памяти DRAM и ёмкость хранения в масштабах терабайт. Данные остаются всегда доступными, даже в случае перезагрузки компьютера. То есть, приложения будут стартовать с момента остановки и не потребуется никакого восстановления работы из временных файлов .tmp.

При разработке приложений, Persistent memory может адресоваться точно также, как обычная память, однако, данные в ней остаются постоянно доступными, как в СХД. Для этого существуют среды разработки Persistent Memory Development Kit (PMDK), представляющие собой открытые библиотеки C/C++, которые могут быть использованы для написания приложений, использующих преимущества Persistent memory.

Есть также библиотеки Persistent Collections for Java (PCJ), для таких приложений, как СУБД Apache Cassandra и Apache Ignite, приложений аналитики Apache Spark, и многих других.

Вычисления в памяти (In-Memory Computing)

В иерархии систем хранения данных, persistent memory находится между ОЗУ (DRAM) и дисковым накопителем (HDD или SSD). Рассмотрим эту иерархию.

Persistent Memory и вычисления в памяти

Процессор, как известно, в своём составе имеет регистры, в которых он хранит промежуточные результаты математических операций. Для повышения производительности, в процессорах обычно имеется кэш-память. Между регистрами процессора и DRAM имеется несколько уровней кэш-памяти уровней 1, 2, 3 (L1, L2, L3). Иногда есть и уровень 4. Обычно, кэш L1 или L2 физически является частью процессора и создаётся непосредственно на его чипе в микросхеме. Он может хранить больше данных, чем регистры процессора. Однако, кэш L1/L2 немного медленнее, чем регистры и имеет несколько большую задержку. Иногда, один кэш L1 или L2 может обслуживать два ядра процессора или более.

Кэш уровня L3 ещё медленнее и имеет ещё более высокую задержку, нежели L1/L2. Обычно, L3 обслуживает все ядра процессора. Но его ёмкость выше, чем у L1/L2.

Ниже в иерархии, после кэш-памяти, располагается память DRAM, которая известна как «оперативная память» или главная память (main memory). Конструктивно, она представляет собой модули на вставных печатных платах, которые вставляются в специальный разъём на главной плате (motherboard). Её ёмкость может быть достаточно большой, однако производительность ниже и задержки больше, чем у кэш-памяти.

Все эти виды памяти не могут сохранять информацию в отсутствии электропитания. Сегодня, положение таково, что постоянно сохранять информацию можно только на дисках, которые, по сравнению с DRAM, очень медленны и вносят высокую задержку. Поэтому, такие системы хранения данных концентрируются вне вычислительных устройств (серверов и процессоров в них). При отказе вычислительного узла, состояние приложения приходится извлекать из временного файла (.tmp), которые также требуют своего места на диске, снижая эффективность использования дискового пространства СХД.

В свою очередь, Persistent memory не имеет такого быстродействия и столь низких задержек, как DRAM, но это отставание не такое существенное, как между DRAM и дисками. Однако, Persistent memory сохраняет данные даже при отключении питания, как и диски. И кроме того, по ёмкости она ближе к дискам, чем к DRAM.

До появления Persistent memory «зазор» по ёмкости и быстродействию между дисковыми накопителями и DRAM был очень большим. Поэтому эта технология смогла кардинально изменить иерархию и архитектуру систем хранения данных и в будущем, очевидно, приведёт к ещё более кардинальному изменению компьютерной архитектуры.

Системы с использованием Persistent memory приведут к пересмотру парадигм хранения данных. Вместо того, чтобы хранить данные на дисках, и доставлять их процессорам, как охапки сена коровам в амбаре, эти «коровы» (процессоры) будут сами пастись на просторных зелёных лужайках данных.

Кроме того, такая архитектура, которая использует «вычисления в памяти» (In-Memory Computing) приведёт к изменению подходов к разработке приложений. Разработчики приложений постепенно отучатся от привычки использовать DRAM только как «кэш» между процессором и диском. Вместо этого, можно будет использовать как Persistent memory, так и DRAM в качестве большого пула адресуемой памяти, либо даже использовать весь этот массив как СХД.

Плюсы и минусы

Как и любая новая технология Persistent memory имеет как положительные, так и отрицательные стороны.

Плюсы Persistent memory:

  • Высокая производительность, много выше, чем у любых дисков, но ниже, чем у DRAM
  • Низкая стоимость, ниже, чем DRAM, но выше, чем у дисков
  • Высокая ёмкость, на порядок выше, чем у DRAM
  • Сохранность данных при отключении питания
  • Постоянная готовность данных сразу же при включении питания

Минусы Persistent memory

  • Данные остаются локальными для процесса (приложения), их использующего, в то время как данные с дисков могут одновременно использоваться разными приложениями
  • При отказе вычислительного узла теряется доступ к данным в Persistent memory.

Persistent Memory как оперативная память

Persistent memory можно адресовать как обычную оперативную память компьютера. Типичная ёмкость DRAM хорошего вычислительного узла лежит в пределах 64-256 ГБ. Однако, ёмкость Persistent memory может быть гораздо выше, чем у DRAM. Можно, конечно, купить 1-2 терабайта оперативной памяти DRAM для компьютера и наслаждаться его быстродействием, но это будет очень дорого. Однако, ёмкость РМ может быть на порядки больше (несколько терабайт) при гораздо более низкой цене.

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

В прошлом предпринималось достаточно много попыток сделать накопители SSD с разъёмами для установки в слоты DRAM на главной плате. Однако, такой подход себя не оправдал, поскольку производительность приложений при этом падала ниже ожидаемой величины. В результате подход «SSD memory» оказался неприемлемым.

С другой стороны, новые виды памяти, такие как 3D XPoint компании Micron, или Optane компании Intel (технологически мало отличающиеся друг от друга) работали гораздо быстрее и имели меньшие задержки, чем SSD. При этом был найден компромисс между производительностью, стоимостью и ёмкостью. Однако, в любом случае требуются испытания того, как приложения будут работать с памятью Persistent memory.

Persistent Memory как СХД

PM может быть использована как СХД блочного или файлового типа, если установить поверх неё файловую операционную систему, для которой Persistent memory будет выглядеть как обычная блочная СХД. При этом файловая система может быть как локальной, так и распределённой (сетевой).

В обоих случаях мы получаем очень быструю СХД (почти как DRAM), которую можно не разбивать на уровни для «горячих» и «холодных» данных.

В этом аспекте стоить рассмотреть переносимый интерфейс операционных систем POSIX (англ. Portable Operating System Interface), который обеспечивает взаимодействие интерфейсов различных операционных систем. POSIX даёт совместимость и общий интерфейс для различных сред, что даёт возможность легко переносить приложения между различными операционными системами. Часто его использование на обычных дисковых СХД создаёт больше проблем, чем пользы, поскольку POSIX может вносить большие задержки в работу приложений. Однако, использование PM в качестве местной СХД даёт возможность преодолеть этот недостаток, поскольку эти величины задержек становятся вполне приемлемыми. Это ещё один аргумент в пользу перехода на Persistent memory.

Заключение

Persistent memory является нестираемой (non-volatile) памятью, с производительностью почти как у DRAM, но гораздо дешевле последней. Основное преимущество такой памяти в том, что при отключении питания вся текущая информация работающего приложения может оставаться в этой памяти, что даёт возможность немедленно запустить приложения точно в месте остановки, при восстановлении питания процессора.

Persistent memory занимает в иерархии памяти и систем хранения данных промежуток между дисками (HDD и SSD) и оперативной памятью DRAM. Это значительная инновация, которая может в недалёком будущем привести к кардинальному изменения компьютерных архитектур вообще и структур хранения данных в частности.

* * *

Более подробно о вычислениях в памяти – в части 2.