С момента своего официального запуска в 2019 году энергонезависимая память Optane продемонстрировала исключительную эффективность во многих областях и получила широкое признание. Optane, особенно с точки зрения искусственного интеллекта, успешно применяется для ключевого бизнеса искусственного интеллекта во многих интернет-компаниях.
Как энергонезависимая память Optane расширяет возможности данных и ускоряет внедрение приложений На этот раз Ху Фэнхуа специально приглашают написать подробное объяснение технологии программирования энергонезависимой памяти.
01 Постоянная память Optane и модели ее использования
Энергонезависимая память Intel® Optane™ переопределяет традиционную архитектуру хранения с помощью инновационной технологии памяти, сочетая экономичную память большой емкости с сохраняемостью данных, чтобы обеспечить большие уровни энергонезависимой памяти по разумным ценам. Энергонезависимая память Intel® Optane™ (Intel® Optane™ PMem) с революционными уровнями производительности для рабочих нагрузок, интенсивно использующих память, плотностью виртуальных машин и высокой емкостью хранения ускоряет трансформацию ИТ для удовлетворения требований к вычислительной мощности в эпоху данных.
Новая серия PMem 200 в сочетании с масштабируемыми процессорами Intel® Xeon® 3-го поколения (Ice Lake, ICX), серия PMem начального уровня в сочетании с масштабируемыми процессорами Intel® Xeon® 2-го поколения (Cascade Lake, CLX), которая совместима с созданными программными экосистемами. для таких рабочих нагрузок, как базы данных, анализ данных, виртуализация и другая инфраструктура, помогая более эффективно раскрыть потенциальную ценность данных. Разработчики могут использовать стандартные отраслевые шаблоны программирования энергонезависимой памяти для создания более простых и мощных приложений, гарантируя, что инвестиции в центр обработки данных окупятся.
Продукты энергонезависимой памяти можно использовать различными способами, некоторые из которых прозрачны для приложения. Например, все продукты с энергонезависимой памятью поддерживают интерфейсы хранения и стандартные файловые API, такие как твердотельный диск (SSD), или настраивают энергонезависимую память в режиме памяти, и энергонезависимая память системы используется так же, как и системная память. Использование постоянной памяти этими двумя способами очень просто и понятно, нам не нужно вносить какие-либо изменения в приложение, чтобы использовать ее, и пользователи даже не ощущают ее существования, за исключением огромного улучшения производительности.
Однако у этих двух методов также есть свои недостатки.Для первого метода, поскольку в основном все еще используется прошлый программный стек, преимущества производительности энергонезависимой памяти Optane не могут быть полностью использованы; для второго метода, хотя он может достигать больших размеров. между памятью и памятью по-прежнему существует разрыв с точки зрения производительности задержки доступа, и она не справляется со сценариями с высокими требованиями к задержке памяти.Кроме того, она не может сохранять данные.
Чтобы в полной мере воспользоваться преимуществами производительности и сохраняемости энергонезависимой памяти Optane, мы ввели режим AppDirect. В этом режиме приложения могут напрямую обращаться к энергонезависимой памяти из пользовательского пространства способом, подобным памяти, который не только полностью использует преимущества производительности энергонезависимой памяти, но и сохраняет данные локально. Этот режим требует от пользователя внесения незначительных изменений в приложение.
02 Характеристики постоянной памяти
Развитие каждой новой технологии приводит к новому мышлению, и постоянная память не является исключением. При создании и разработке решений учитывайте следующие характеристики энергонезависимой памяти:
-
Производительность (пропускная способность, задержка и пропускная способность) постоянной памяти намного выше, чем у NAND, но немного ниже, чем у DRAM.
-
В отличие от NAND, постоянная память долговечна. Его долговечность обычно на несколько порядков выше, чем у NAND, и может превышать срок службы сервера.
-
Модули энергонезависимой памяти имеют гораздо большую емкость, чем модули DRAM, и могут использовать одни и те же каналы памяти. Приложения, поддерживающие постоянную память, могут обновлять данные на месте без их сериализации/десериализации.
-
Постоянная память поддерживает адресацию байтов (аналогично памяти). Приложения могут обновлять только те данные, которые им нужны, без каких-либо накладных расходов на чтение-изменение-запись (RMW).
-
Данные согласованы с кешем ЦП. Постоянная память обеспечивает прямой доступ к памяти (DMA) и удаленный прямой доступ к памяти
(удаленный прямой доступ к памяти, RDMA). -
Данные, записанные в энергонезависимую память, не теряются после отключения питания.
-
После завершения проверки разрешений доступ к данным в постоянной памяти можно получить непосредственно из пользовательского пространства. Доступ к данным не проходит через какой-либо код ядра, кэши страниц файловой системы или прерывания.
-
Данные о постоянной памяти доступны сразу, то есть:
o Данные доступны, как только система включена.
o Приложению не нужно тратить время на прогрев кеша.
o Они могут получить доступ к данным сразу после сопоставления памяти. -
Данные в постоянной памяти не занимают место в DRAM, если приложение не копирует данные в DRAM для более быстрого доступа к данным.
-
Данные, записываемые в модули постоянной памяти, являются локальными для системы. Приложения отвечают за репликацию данных между различными системами.
Разработчики приложений обычно рассматривают резидентные структуры данных и структуры данных, хранящиеся в памяти. В случае с приложениями для центров обработки данных разработчики стараются поддерживать непротиворечивые структуры данных в хранилище даже в случае сбоя системы.
Эту проблему часто можно решить с помощью приемов ведения журнала, таких как ведение журнала с опережением, когда изменения записываются в журнал перед их сбросом в постоянное хранилище. Если процесс модификации данных прерван, приложение может использовать информацию в журнале для завершения операции восстановления при перезапуске. Такие методы существуют уже много лет, но правильный метод реализации трудно разработать, а его поддержка требует много времени. Разработчики часто полагаются на комбинацию баз данных, программных библиотек и современных файловых систем для обеспечения согласованности.
Тем не менее, в конечном счете разработчик приложения должен разработать стратегию для обеспечения согласованности структур данных в хранилище во время выполнения и при восстановлении после сбоя приложения и системы.
03 Модель программирования SNIA NVM
Постоянная память может быть доступна приложениям напрямую и сохраняет выполнение данных на месте, что позволяет операционным системам поддерживать новую модель программирования, которая обеспечивает производительность, подобную памяти, но остается такой же надежной, как энергонезависимые устройства хранения. Хранение данных.
К счастью для разработчиков, пока первое поколение энергонезависимой памяти все еще находилось в разработке, дизайнеры, архитекторы и разработчики Microsoft Windows и Linux работали с Ассоциацией производителей сетей хранения данных (SNIA) над определением универсального программирования для программной памяти. , как показано на рисунке 1.
▲Рисунок 1 Модель программирования SNIA NVM
Постоянная память, используемая в качестве блочного хранилища
Операционная система может обнаруживать наличие модулей постоянной памяти и загружать драйверы устройств в подсистему ввода-вывода операционной системы, как показано в левой половине рисунка 1. Драйвер энергонезависимого двухрядного модуля памяти (NVDIMM) выполняет две важные функции.
Во-первых, он предоставляет системным администраторам интерфейс гипервизора для настройки и мониторинга состояния оборудования энергонезависимой памяти. Во-вторых, он имеет функциональные возможности, аналогичные драйверу запоминающего устройства. Драйверы NVDIMM представляют энергонезависимую память приложениям и модулям операционной системы в качестве быстрых блочных запоминающих устройств.
Это означает, что приложения, файловые системы, диспетчеры томов и другие уровни промежуточного программного обеспечения хранения могут использовать постоянную память так же, как они в настоящее время используют хранилище без изменений.
Файловая система с поддержкой постоянной памяти
Еще одним расширением операционной системы является поддержка поддержки файловой системы и оптимизация для постоянной памяти. Этот тип файловой системы называется постоянной файловой системой с поддержкой памяти (PMem-Aware File System).
Текущие файловые системы с поддержкой постоянной памяти включают Linux ext4 и XFS и Microsoft Windows NTFS. Как показано на рис. 1, эти файловые системы могут либо использовать блочные драйверы в подсистеме ввода-вывода (как описано выше), либо обойти подсистему ввода-вывода и использовать постоянную память напрямую в качестве загружаемой/сохраняемой памяти с байтовой адресацией, самой быстрой и короткой. путь для доступа к данным, хранящимся в постоянной памяти.
В дополнение к очистке традиционных операций ввода-вывода этот путь позволяет выполнять запись небольших блоков быстрее, чем традиционные блочные устройства хранения, которые, напротив, требуют, чтобы файловая система считывала исходный размер блоков устройства, модифицировала блок, а затем записывала. весь блок обратно на устройство. Эти файловые системы с постоянной памятью предоставляют приложениям знакомые стандартные файловые API, включая системные вызовы открытия, закрытия, чтения и записи. Это позволяет приложениям продолжать использовать знакомый файловый API, используя при этом более высокую производительность энергонезависимой памяти.
прямой доступ к постоянной памяти
Функция прямого доступа к постоянной памяти в операционной системе (известная как Direct Access, DAX в Linux и Windows) использует файловый интерфейс с отображением памяти, предоставляемый операционной системой, но может в полной мере использовать собственные возможности постоянной памяти, которые могут хранить данные, также может использоваться в качестве памяти. Постоянная память может быть естественным образом сопоставлена с памятью приложения, поэтому операционной системе не нужно кэшировать файлы в энергозависимой основной памяти.
Чтобы использовать DAX, системный администратор должен создать файловую систему в модуле постоянной памяти и смонтировать эту файловую систему в дереве файловой системы операционной системы. Для пользователей Linux устройства постоянной памяти будут отображаться как специальные файлы устройств /dev/pmem*. Для отображения физических устройств с постоянной памятью системные администраторы могут использовать программы ndctl и ipmctl.
04 Комплект для разработки энергонезависимой памяти PMDK
Как упоминалось ранее, приложения могут напрямую обращаться к энергонезависимой памяти с помощью отображаемых в память файлов, но для этого пользователям необходимо модифицировать свои приложения. Чтобы снизить стоимость модификации приложений для пользователей, мы представили комплект Persistent Memory Development Kit (PMDK). Мы покажем, как использовать PMDK для модификации приложения для эффективного управления структурами данных с байтовой адресацией, которые находятся в постоянной памяти.
Библиотека PMDK построена на модели программирования SNIA NVM. Они расширяют эту модель в разной степени: некоторые просто инкапсулируют примитивы, предоставляемые операционной системой, в простые в использовании функции, а другие предоставляют сложные структуры данных и алгоритмы для использования в постоянной памяти. Это означает, что вы несете ответственность за решение, какой уровень абстракции лучше всего подходит для вашего варианта использования.
После многих лет разработки PMDK включает большое количество библиотек с открытым исходным кодом, как показано на рис. 2. Эти библиотеки помогают разработчикам приложений и системным администраторам упростить разработку приложений и управление устройствами постоянной памяти.
PMDK предоставляет два типа библиотек:
1) Энергонезависимая библиотека: подходит для пользователей и сценариев, которые просто хотят воспользоваться большим объемом постоянной памяти.
2) Библиотека персистентности: подходит для программного обеспечения, которое хочет реализовать отказоустойчивые алгоритмы персистентной памяти.
▲ Рис. 2 Библиотека разработки, связанная с PMDK
libmemkind
libmemkind — это расширяемый пользователем менеджер кучи, созданный поверх jemalloc, который поддерживает управление характеристиками памяти и разделение кучи между различными типами памяти. Тип памяти определяется политикой памяти операционной системы, применяемой к диапазону виртуальных адресов. В отсутствие пользовательских расширений функции памяти, поддерживаемые memkind, включают управление неоднородным доступом к памяти (NUMA) и функции размера страницы памяти.
Нестандартный интерфейс jemalloc расширен для поддержки специализированных типов, запрашивающих виртуальную память у операционной системы через интерфейс раздела memkind. Через другие интерфейсы memkind вы можете контролировать и расширять функции разбиения памяти и выделять память, выбирая включенные функции. С помощью интерфейса memkind вы можете создавать и управлять файловой памятью из постоянной памяти, которая поддерживает типы PMEM.
libmemcache
libvmemcache — это встраиваемое облегченное решение для кэширования в памяти, которое использует преимущества хранилища большой емкости, такого как постоянная память с поддержкой DAX, за счет эффективного масштабируемого сопоставления памяти. libvmemcache имеет свою уникальность:
- Распределитель памяти на основе экстентов позволяет избежать проблем с фрагментацией, которые затрагивают большинство баз данных в памяти, и позволяет кэшам достигать чрезвычайно высокого использования пространства в большинстве рабочих нагрузок.
- Алгоритм буферизованного наименее недавно использовавшегося (LRU) сочетает в себе традиционные двусвязные списки LRU и неблокирующие кольцевые буферы для достижения высокой масштабируемости на современных многоядерных процессорах.
- Структура индекса critnib обеспечивает высокую производительность и экономит место. Кэш настроен на оптимальную обработку относительно больших значений, минимум до 256 байт, но libvmemcache работает лучше всего, когда ожидаемый размер значения превышает 1 КБ.
pmemkv
pmemkv — встроенное локальное хранилище ключей и значений общего назначения, оптимизированное для постоянной памяти. Он прост в использовании и поставляется с множеством различных языковых интеграций, включая C, C++ и JavaScript.
В библиотеке также есть подключаемые внутренние плагины для различных механизмов хранения. Хотя в первую очередь он предназначен для поддержки сценариев постоянных приложений, его также можно использовать в качестве энергозависимой библиотеки. Созданный как отдельный проект, pmemkv не только обеспечивает облачную поддержку набора библиотек в PMDK, но также предоставляет API-интерфейс «ключ-значение» для сборок постоянной памяти. Одна из основных целей разработчиков pmemkv — создать дружелюбную среду для сообщества открытого исходного кода, чтобы поддержать их в разработке новых движков с помощью PMDK и его интеграции с другими языками программирования.
API pmemkv подобен большинству баз данных типа «ключ-значение» и реализует различные механизмы хранения. Эти механизмы хранения обладают превосходной гибкостью и функциональностью. Каждый двигатель имеет разные эксплуатационные характеристики и используется для решения разных задач. Таким образом, каждый двигатель предоставляет различные возможности, которые можно описать следующими характеристиками:
- Постоянные: Постоянные механизмы обеспечивают сохранение модификаций и энергосбережение, в то время как энергозависимые механизмы сохраняют свое содержимое только в течение всего срока службы приложения.
- Параллелизм: механизм параллелизма гарантирует, что некоторые методы, такие как get(), put(), remove(), являются потокобезопасными.
- Сортировка ключей: Механизм «сортировки» предоставляет методы запроса диапазона (например, get_above()). пмемкв
Что отличает ее от других баз данных «ключ-значение», так это то, что она поддерживает прямой доступ к данным. Это означает, что данные для чтения из постоянной памяти не нужно копировать в DRAM.
Прямой доступ к данным может значительно ускорить работу приложений. Это преимущество наиболее заметно, когда программу интересует только часть данных, хранящихся в базе данных. При традиционном подходе все данные нужно скопировать в какой-то буфер, а затем вернуть в приложение. С помощью pmemkv мы предоставляем приложению прямой указатель, и приложение считывает только те данные, которые ему нужны.
Благодаря модульной конструкции, гибкому API-интерфейсу движка и интеграции со многими распространенными языками облачного программирования pmemkv стал первым выбором многих разработчиков облачного программного обеспечения. Будучи облегченной библиотекой с открытым исходным кодом, ее можно легко интегрировать в существующие приложения и немедленно использовать преимущества энергонезависимой памяти или разрабатывать на ее основе для нужд конкретных приложений.
libpmemobj
libpmemobj — это библиотека C, предоставляющая хранилище транзакционных объектов, распределитель динамической памяти, транзакции и общие функции для программирования постоянной памяти. Библиотека libpmemobj предоставляет транзакционные объекты, которые хранятся в постоянной памяти в режиме прямого доступа (DAX) для приложений, требующих управления транзакционной и постоянной памятью. Эта библиотека может решить многие распространенные проблемы с алгоритмами и данными, возникающие при программировании постоянной памяти.
libpmemobj позволяет приложениям отображать файлы в память в файловых системах с поддержкой постоянной памяти, обеспечивая операции прямой загрузки/сохранения без блоков подкачки с блочных устройств хранения. Он обходит ядро, избегает переключения контекста и прерываний и позволяет приложениям читать и записывать непосредственно в постоянную память с байтовой адресацией.
Библиотека libpmemobj предоставляет удобный API для простого управления созданием и доступом к пулу памяти, избегая сложностей прямого сопоставления и синхронизации данных. PMDK также предоставляет программу pmempool для управления пулами памяти из командной строки. Для постоянной памяти память может быть зарезервирована для временных объектов с помощью pmeobj_alloc(), pmeobj_reserve() или pmeobj_xreserve() так же, как и malloc().
libpmemobj предоставляет следующие три набора API: API атомарных операций, API сохранения/публикации, API транзакций, которые можно использовать для обеспечения устойчивости данных. Все эти API обеспечивают отказоустойчивую атомарность и согласованность, снижая количество ошибок при создании приложений и обеспечивая целостность данных.
Libpmemobj-cpp
Библиотека libpmemobj предназначена для разработчиков системного программного обеспечения низкого уровня и создателей языков, предоставляя распределители, транзакции и методы для автоматического управления объектами. Однако, поскольку он не изменяет компилятор, его API многословен и содержит множество макросов. Чтобы упростить программирование энергонезависимой памяти и уменьшить количество ошибок, Intel создала языковые привязки высокого уровня для libpmemobj и добавила его в PMDK. Связывание языка C++ — это libpmemobj-cpp, также известная как libpmemobj++, которая представляет собой библиотеку только для заголовков C++, которая может использовать функции метапрограммирования C++ для предоставления более простого и менее подверженного ошибкам интерфейса для libpmemobj.
Он поддерживает быструю разработку приложений с постоянной памятью, повторно используя концепции, знакомые программистам на C++, такие как интеллектуальные указатели и транзакции закрытия, предоставляя удобный API для изменения структур и классов с небольшими изменениями функций. Библиотека также поставляется с STL-совместимыми пользовательскими структурами данных и контейнерами, поэтому разработчикам приложений не нужно перерабатывать базовые алгоритмы для постоянной памяти.
Libpmem
libpmem — низкоуровневая библиотека C, предоставляющая базовые абстракции над примитивами, представленными операционной системой. Он может автоматически обнаруживать функции на платформе, выбирать подходящую семантику сохранения и метод передачи памяти ( memcpy() ), оптимизированный для постоянной памяти. Большинству приложений потребуется использовать хотя бы часть этой библиотеки.
libpmem обрабатывает инструкции ЦП, связанные с постоянной памятью, оптимально копируя данные в постоянную память и отображая файлы.
Библиотека libpmem содержит несколько удобных функций для отображаемых в память файлов. Использование этих функций для замены функций отображения памяти, предоставляемых операционной системой, имеет следующие преимущества:
- libpmem может гарантировать правильные аргументы для вызовов карты ОС.
- libpmem может определить, является ли карта постоянной памятью и безопасно ли очищать ее напрямую с помощью инструкций ЦП.
- libpmem также предоставляет несколько интерфейсов для поддержки оптимального способа копирования или обнуления областей постоянной памяти для сохраняемых данных.
Программисты, которые просто хотят получить полный необработанный доступ к постоянной памяти и не нуждаются в библиотеке для предоставления функций распределителя или транзакций, могут захотеть использовать libpmem в качестве основы для разработки.
Для большинства программистов libpmem является очень низкоуровневым и может обеспечить максимальную гибкость программирования, но стоимость кодирования и отладки относительно высока.Если в этом нет необходимости, вам следует рассмотреть возможность использования библиотеки более высокого уровня для повышения эффективности разработки. затраты на отладку.
05 Ресурсы для программирования энергонезависимой памяти
Представляем энергонезависимую память Intel® Optane™:
woohoo.Intel.capable/content/woohoo…
Спецификация модели программирования SNIA NVM:
Woohoo. Это you.org/specialty_AC кик ви...
Официальный сайт ПМДК:
pmem.io/
Книга: Программирование энергонезависимой памяти, китайское издание
PMDK:
github.com/pmem/pmdk
libmemkind:
memkind.github.io/memkind/
libvmemcache:
GitHub.com/PM em/VM EMC A…
pmemkv:
github.com/pmem/pmemkv
libpmemobj-cpp:
GitHub.com/PM эм/Ли Баопин…
Автор: Ху Фэнхуа/архитектор облачного программного обеспечения
Ху Фэнхуа, архитектор облачного программного обеспечения подразделения Intel Optane, занимается изучением инновационных приложений энергонезависимой памяти в областях облачных вычислений, больших данных, искусственного интеллекта и Интернета вещей. Он работал архитектором программного обеспечения и менеджером по разработке программного обеспечения в Alibaba Group и EMC China R&D Center и имеет более чем 15-летний опыт работы в области файловых систем, распределенных систем хранения, облачных вычислений и больших данных.