В списке рассылки ядра Linux представлена новая файловая система NOVA (NOn-Volatile memory Accelerated file system), созданная для обеспечения максимальной эффективности и надёжности работы на чипах энергонезависимой памяти (NVM, non-volatile memory, например NVDIMM и Intel 3DXpoint DIMM), сочетающих производительность ОЗУ с возможностью постоянного хранения содержимого, не теряющегося после прекращения подачи энергии. Отмечается, что представленная реализация NOVA уже достаточно стабильна при выполнении сложных приложений, но до доведения до готовности к широкомасштабному внедрению ещё необходимо проделать много работы.

Традиционные ФС недостаточно эффективны для NVM-памяти, так как не рассчитаны на байтовую адресацию, применяемую в энергонезависимой памяти, которая для обработчиков выглядит как обычное ОЗУ. В частности, чтение с обычных накопителей обеспечивает атомарность операции на уровне чтения/записи сектора, в то время как NVM-память обеспечивает доступ на уровне отдельных байтов.

Кроме того, традиционные ФС пытаются снизить интенсивность обращения к носителю, который рассматривается как заведомо более медленный, чем оперативная память, а также пытаются группировать операции для обеспечения последовательного чтения при применении НЖМД, обрабатывать очереди запросов, разделять приоритеты выполнения разных операций. Для NVM-хранилищ подобные усложнения излишни, так как скорость обращения к данным сопоставима с оперативной памятью и порядок доступа не имеет значения.

ФС NOVA использует интерфейс ядра DAX для прямого доступа к устройствам постоянной памяти в обход страничного кэша - содержимое накопителя отображается в адресное пространство ядра без применения традиционного уровня блочных устройств. В итоге при хранении в памяти с байтовой адресацией NOVA обеспечивает атомарное обновление метаданных (каждая операция с директорией атомарна) и данных (каждая запись в файл атомарна). Дополнительно предусмотрен режимы "unsafe data" и "unsafe metadata", позволяющих форсировать производительность ценой потери атомарности операций.

Поддерживается система снапшотов, позволяющих зафиксировать состояние ФС на текущий момент времени, которую можно использовать для создания целостных резервных копий. Для обеспечения непротиворечивости и целостности применяется похожая на RAID5 схема избыточного хранения метаданных, а также проверка по контрольным суммам (crc32c). Контроль целостности производится при каждом доступе к ФС и позволяет исправлять нарушения целостности метаданных, а также выявлять как случайные изменения содержимого NVDIMM в обход ФС, так и ошибки, вызванные повреждениями на аппаратном уровне.

Система основана на структурах данных, отражающих изменения в форме лога (log-structured FS), но вместо поддержания одного глобального лога для всей ФС в NOVA создаются отдельные логи для каждого файла (по логу на каждый inode). Лог разбивается на 4-килобайтовые страницы, которые могут произвольно размещаться в памяти (не обязательно по порядку). В логах хранятся только метаданные, а данные вынесены в отдельные страницы памяти. При выполнении операций записи в лог помещается указатель на блок изменяемых данных. Сами изменения в хранимые данные вносятся с применением механизма copy-on-write (COW) для обеспечения атомарности обновления.

Для файловых операций, в которые вовлечено несколько inode, в NOVA применяются небольшие логи отката изменений (redo logs), имеющие фиксированный размер, которые атомарно прикрепляются к элементам в логе каждого задействованного в операции inode. В случае невозможности завершить операцию из-за сбоя изменения откатываются в прошлое состояние по находящемуся в логе журналу изменений. Подтверждение успешного завершения операции осуществляется путём удаления redo-лога. Подобный подход позволяет добиться достаточно компактного размера логов и очень быстрого выполнения операций сборки мусора. Также появляется возможность параллельной обработки логов в процессе восстановления целостности ФС.

Все таблицы inode и связанные с ними журналы разбиваются на несколько частей, каждая из которых привязывается к своему ядру CPU, что позволяет распараллелить операции с таблицей. Сами inode хранятся в связанных списках (по одному на CPU) блоками по 2 Мб. Последние 8 байт в каждом блоке ссылаются на следующий блок. Выделение новых блоков для inode осуществляется динамически. Каждый блок обрабатывается только тем ядром CPU, за которым закреплён. Привязка к CPU осуществляется во время инициализации нового экземпляра ФС командой "mount -t NOVA -o init /dev/pmem0 /mnt/ramdisk"). Так как таблицы inode привязываются к CPU, работа уже созданной ФС возможна только на системах с аналогичным числом ядер CPU.

Из других ограничений, которые планируется устранить по мере развития ФС, отмечается отсутствие утилит mkfs и fsck, отсутствие утилиты для перепроверки целостности данных (проверяется только целостность данных, к которым производится доступ), отсутствие ведения таблиц сбойных блоков (bad blocks), возможность работы только на системах x86-64, отсутствие поддержки ACL и расширенных атрибутов файлов, невозможность записи в примонтированные снапшоты, отсутствие поддержки квот.

Источник: http://www.opennet.ru/opennews/art.shtml?num=46977