
Революционные изменения в аппаратной реализации систем хранения данных неизбежно отражаются на архитектуре программного обеспечения. Apache Mnemonic, Java-фреймворк с открытым исходным кодом, реализует библиотеку ввода-вывода, оптимизированную для поддержки NVMe устройств и энергонезависимой памяти Optane. Сходство с анонсированной технологией Intel Apache Pass, следует хотя бы уже из названия продукта.
Особенности реализации
Встроенная оптимизация для процессоров с поддержкой векторных расширений AVX и систем с NUMA-топологией, в идеале, должны избавить разработчиков программного обеспечения, использующих данный фреймворк, от необходимости применения интерфейса JNI (Java Native Interface) и системно-зависимых «заплаток», лишающих Java-приложения их основных преимуществ, в том числе кроссплатформенности.
Рис 1. Сравнительная диаграмма позволяет оценить латентность при доступе к различным видам оперативных и энергонезависимых запоминающих устройств среднестатистической современной платформы
Вместе с тем, речь идет не только об очередном повышении производительности или устранении отдельных недостатков, присущих «дедушке» java.nio. Событием, отразившимся на всех уровнях программно-аппаратной инфраструктуры является возможность прямого размещения энергонезависимой памяти (persistent memory) в адресном пространстве платформы.
Hardware: режимы Apache Pass persistent memory
Рассмотрим базовые варианты модели хранения данных, согласно концепции Intel Apache Pass.
- Memory mode. В этом режиме оперативная память (DRAM) выполняет роль быстродействующего кеширующего буфера между процессором и сравнительно медленной энергонезависимой памятью.
- Storage mode. Режим накопителя, поддерживаемого драйвером как блоковое устройство.
- Application direct mode. В этом варианте декларируется факт наличия двух видов памяти: быстрой оперативной и сравнительно медленной энергонезависимой. Оптимизация производительности при условии сохранности данных здесь переводится в зону ответственности приложений. Оба вида памяти декларируются и доступны в адресном пространстве.
Первый и второй варианты делают акцент на совместимость, предоставляя или даже эмулируя стандартные устройства (оперативную память и накопители) и скрывая при этом новые физические сущности (энергонезависимую память, включенную в адресное пространство).
Третий вариант наиболее сложен с точки зрения программной поддержки, но позволяет оптимизировать стратегию хранения данных, предоставив информацию об истинной физической реализации mass storage подсистемы на все уровни программно-аппаратной инфраструктуры, с расчетом на ее готовность к поддержке новых типов запоминающих устройств. Это делает возможной реализацию концепции in place computing, подразумевающей непосредственный доступ приложения к физически ресурсам подсистемы энергонезависимой памяти.
Для сравнения вспомним консервативный вариант: файлы, отображенные на память (java.nio.MappedByteBuffer). Здесь объектом, доступным в адресном пространстве является DRAM, при этом программно, с применением механизма своппинга создается только иллюзия тождественности диапазона оперативной памяти и заданной области mass storage устройства.
Software: persistent memory требует перемен
Устройства, выполненные в виде NVDIMM и подключаемые к шине DRAM, а также ряд NVMe накопителей, консервативных по форме, но революционных по содержанию, совмещающих интерфейс PCI Express и Direct Memory Interface, как альтернативу блоковому доступу, создают иную парадигму хранения данных. Подсистему управления памятью, входящую в состав виртуальной машины JVM, а также архитектуру фреймворков, обслуживающих mass storage функции, ждут радикальные перемены.
Рис 2. Устройства энергонезависимой памяти, размещенные в адресном пространстве, непосредственно доступны виртуальной машине JVM и используются при размещении объектов, создаваемых приложениями
Если запоминающая матрица накопителя, представима в виде объекта, находящегося в физическом адресном пространстве платформы, как диапазон memory-mapped IO, то такой объект или его фрагмент, может быть непосредственно подключен в виртуальное адресное пространство приложения. Для этого, ОС должна установить содержимое нескольких дескрипторов, отвечающих за соответствие между виртуальным и физическим адресами.
Для сравнения, чтение данных с блокового устройства, состоящее из операции передачи команды накопителю, пересылки данных (включая транзитные буферы) и сигнализацию о завершении посредством запроса на прерывание, в общей сложности займет значительно больше времени, даже если речь о накопителе с интерфейсом NVMe.
Рис 3. Специальная реализация типовых Java-коллекций, учет факторов кэширования, NUMA-топологии и применение современных наборов AVX-инструкций, позволяют предположить, что ряд операций получат ускорение и при работе с классическими блоковыми накопителями
Не ограничиваясь улучшением производительности, связанным с новыми методами физической доставки данных приложению, разработчиками минимизируются затраты времени, обусловленные сохранением и восстановлением состояния Java-объектов (операции, известные как serialization, deserialization). Снижена нагрузка на механизм Garbage Collection (GC), асинхронно работающий в фоновом режиме и автоматически освобождающий неиспользуемую память. Вспомним, что GC часто является причиной пауз в работе JVM, момент возникновения и длительность которых в общем случае не прогнозируемы.
Накопители, фреймворки, бенчмарки
Изменения в технологиях хранения данных и эволюция программных интерфейсов потребуют особого внимания разработчиков бенчмарок. Несколько упрощая, можно сказать, что фреймворк Apache Mnemonic является «продвинутым» функциональным аналогом популярной технологии ввода-вывода java.nio, на основе которой реализована утилита измерения производительности NIOBench, один из проектов тестовой лаборатории IC Book.
Концепция каналов и буферов, лежащая в основе java.nio, оперирует абстракциями, набор которых обусловлен классической архитектурой mass storage подсистемы: каналы соответствуют накопителям (обычно блоковым устройствам), буферы организуются в оперативной памяти. Ввод-вывод реализуется как двунаправленная передача информации между каналами и буферами.
Другой атрибут java.nio, концепция файлов, отображенных на память, как уже было отмечено, создает иллюзию тождественности диапазона оперативной памяти и заданной области накопителя, работая на основе подкачки и классических операций дискового ввода-вывода.
В системах, использующих Intel Optane (и не только в них), в случае размещения энергонезависимой памяти в адресном пространстве платформы, информация в ряде случаев может быть обработана на месте своего исходного размещения, без копирования в ОЗУ. Измерение производительности такой подсистемы сходно с измерением производительности оперативной памяти, что повлияет не только на численные значения бенчмарок, но и сам подход к оценке быстродействия mass storage подсистемы.
Своеобразное компромиссное решение допускается в презентации Microsoft. Изменение внутренней реализации процедур ОС API, обслуживающих файлы, отображенные на память, при сохранении их программного интерфейса, теоретически позволит существующим приложениям, использующим данный API, получить некоторую прибавку в скорости. Вместе с тем, титул Optane Ready, неизбежно потребует редизайна архитектуры программных комплексов, с учетом всех преимуществ persistent memory.
Вместо послесловия
Несмотря на отсутствие технологии хранения данных, одновременно обладающей производительностью DRAM и энергонезависимостью, а также продолжающийся дуализм в физической реализации запоминающих устройств, унификацию программной модели доступа к двум видам памяти уже сегодня можно признать свершившимся фактом. Речь не только модулях NVDIMM но и некоторых NVMe накопителях, позволяющих размещать диапазон энергонезависимой памяти в адресном пространстве платформы.
Фреймворк Apache Mnemonic предлагает методы взаимодействия с модулями памяти Intel Apache Pass и другими запоминающими устройствами обоих рассмотренных типов: прямо адресуемыми и блоковыми, эффективно реализуя потенциал новых аппаратных средств, при сохранении возможности эволюционного развития систем хранения данных.