В начале 1990-х годов на факультете кибернетики Киевского университета им.Т.Г.Шевченко у одного из преподавателей был любимый каверзный вопрос на экзамене: может ли компьютер выполнить программу с жесткого диска? Естественно, большинство второкурсников отвечали утвердительно — конечно, может! На что преподаватель, победно улыбнувшись, объяснял: выполнить программу можно из памяти, предварительно ее туда загрузив — с диска или откуда-то еще! Но похоже, что в наши дни, с распространением технологии DAX, обеспечивающей прямой доступ к энергонезависимой памяти, правильность ответа придется пересмотреть.
Как известно, механизм свопинга позволяет ассоциировать диапазон виртуального адресного пространства с файлом на устройстве хранения данных. Для приложения это создает иллюзию наличия оперативной памяти значительно большего объема, чем физически установлено. Ее объем ограничен возможностями накопителя и зависит от того, как процессор виртуализирует адресное пространство. Приложение работает с означенным диапазоном используя линейный адрес, абстрагируясь от низкоуровневых особенностей обмена с диском. Заботу о «подкачке» берет на себя операционная система.
Теоретически, в архитектуре защищенного режима x86-совместимого процессора свопинг возможен как на уровне сегментов, так и страниц. Не секрет, что роль сегментации в дизайне современных процессоров и ОС существенно ограничена, поэтому на практике получил распространение только второй вариант, основанный на механизме трансляции страниц (paging). При этом исключение page fault, возникающее при обращении к отсутствующей странице, запускает механизм «подкачки» этой страницы в физическую память.
Производительность или совместимость?
Некоторая пикантность ситуации состоит в том, что для платформ, поддерживающих концепцию DAX и оснащенных модулями энергонезависимой памяти NVDIMM, операционная система может заменить механизм свопинга прямым и практически мгновенным отображением заданного диапазона памяти на шину, куда подключены модули NVDIMM.

Теоретически, это обстоятельство создает фактор совместимости, благодаря которому, традиционные приложения, не оптимизированные для использования DAX, могут получить некоторое ускорение. Вместе с тем, анализ такого сценария и необходимых условий его осуществления заслуживают нескольких отдельных публикаций.
Принцип работы DAXBench64
Небольшой тестовый пример — приложение DAXBench64 — создает файл, отображаемый в диапазон адресного пространства, оценивая его производительность по скорости чтения и записи. Ее характеризуют четыре шестнадцатеричных числа: два handles-номера, присвоенные ОС, идентифицируют файл и диапазон виртуальной памяти, далее следуют начальный и конечный адреса этого диапазона в виртуальном адресном пространстве приложения. После окончания сеанса выводятся измеренные скорости чтения и записи в мегабайтах в секунду.
Свопинг или DAX?
Если тестируется классическое mass storage устройство, например с NVMe-интерфейсом, то низкоуровневый метод передачи информации между накопителем и оперативной памятью платформы не зависит от архитектуры доступа со стороны приложения, в данном примере это всегда будет протокол NVMe с присущими ему ограничениями. Показатели скорости чтения и записи для свопинг-файла, отображенного на память (memory mapped file) будут сравнимы с величинами, имеющими место в бенчмарках, основанных на классических операциях чтения и записи файлов (например, NIOBench, режим unbuffered native).
Если тестируемое устройство хранения поддерживает DAX, например NVDIMM, то в оптимальном случае, доставка данных приложению должна состоять в обновлении содержимого дескрипторов страниц с целью отображения диапазона виртуального адресного пространства приложения на физическую шину, к которой подключен модуль NVDIMM. Физического перемещения (копирования) данных в этом случае не требуется, вернее оно откладывается до начала взаимодействия приложения с целевой областью памяти, что в теории должно привести к значительному росту производительности.
Функциональность DAXBench64 при реализации такого сценария еще предстоит проверить.
О результатах
Выберем в качестве тестовой платформы ASUS Prime B360-Plus (Intel Core i5-8400, набор модулей памяти HyperX Savage HX430-C15SBK4/16, блок питания Seasonic Focus Plus 650 Platinum), задействовав NVMe-накопители от компании Samsung, модель PM983 MZ1LB960HAJQ терабайтного объема:

На первый взгляд, тест NVMe-накопителя с помощью DAXBench64 может показаться бессмысленным — ведь прямое отображение не поддерживается устройством. Низкоуровневый аппаратный протокол не зависит от архитектуры обмена, выбранной приложением, будь то обычные операции чтения и записи файла или свопинг, организованный для диапазона памяти. В обоих случаях накопитель, действуя в качестве bus master устройства, подключенного к порту PCIe, выполняет циклы чтения и записи оперативной памяти платформы. К слову, параметры подключения: ширина линка x4, пропускная способность 8 гигатранзакций в секунду обеспечивают теоретический максимум около 4 ГБ/сек в каждом направлении.
С другой стороны, время выполнения любой операции упрощенно можно представить в виде суммы двух слагаемых: время обработки команды накопителем и накладных расходов, обусловленных функционированием mass storage стека ОС. Очевидно, чем производительнее накопитель, тем меньше первое слагаемое, а значит растет вес второго. Поэтому для различных архитектур файлового обмена производительность может различаться. Что и было предметом исследования.

Показатели производительности чтения и записи для классических ОС API файловых операций

Показатели производительности чтения и записи для операции свопинга с применением memory mapped file
Увы, в данном эксперименте, применение свопинга вместо классических файловых операций практически не оказало влияния на производительность записи — сказалось фундаментальное свойство ячеек NAND-памяти. А вот скорость чтения кратно упала, предположительно, вследствие усложнения транзитных операций, выполняемых ОС. Это иллюстрирует оптимизационные задачи, стоящие перед разработчиками ОС, драйверов и бенчмарок.
NVMe-накопители Samsung PM983
предоставлены компанией Onix