Прямо в память

В начале 1990-х годов на фа­куль­те­те ки­бер­не­ти­ки Ки­ев­ско­го уни­вер­си­те­та им.Т.Г.Шев­чен­ко у од­но­го из пре­по­да­ва­те­лей был лю­би­мый ка­вер­з­ный во­п­рос на эк­за­ме­не: мо­жет ли ком­пью­тер вы­пол­нить про­г­рам­му с жест­ко­го дис­ка? Ес­тест­вен­но, боль­шин­ст­во вто­ро­кур­с­ни­ков от­ве­ча­ли ут­вер­ди­тель­но — ко­неч­но, мо­жет! На что пре­по­да­ва­тель, по­бед­но улыб­ну­в­шись, объ­яс­нял: вы­пол­нить про­г­рам­му мож­но из па­мя­ти, пре­д­ва­ри­тель­но ее ту­да за­гру­зив — с дис­ка или от­ку­да-то еще! Но по­хо­же, что в на­ши дни, с рас­про­ст­ра­не­ни­ем тех­но­ло­гии DAX, обес­пе­чи­ва­ю­щей пря­мой до­с­туп к энер­го­не­за­ви­си­мой па­мя­ти, пра­виль­ность от­ве­та при­дет­ся пе­ре­смо­т­реть.

Как известно, механизм сво­пин­га по­зво­ля­ет ас­со­ци­и­ро­вать ди­а­па­зон вир­ту­аль­но­го ад­рес­но­го про­ст­ран­ст­ва с фай­лом на уст­рой­ст­ве хра­не­ния дан­ных. Для при­ло­же­ния это со­зда­ет ил­лю­зию на­ли­чия опе­ра­тив­ной па­мя­ти зна­чи­тель­но боль­ше­го объе­ма, чем фи­зи­че­ски ус­та­нов­ле­но. Ее объем ог­ра­ни­чен воз­мож­но­стя­ми на­ко­пи­те­ля и за­ви­сит от то­го, как про­цес­сор вир­ту­а­ли­зи­рует ад­рес­ное про­ст­ран­ст­во. При­ло­же­ние ра­бо­та­ет с оз­на­чен­ным ди­а­па­зо­ном ис­поль­зуя ли­ней­ный ад­рес, аб­ст­ра­ги­ру­ясь от низ­ко­у­ров­не­вых осо­бен­но­стей об­ме­на с дис­ком. За­бо­ту о «под­кач­ке» бе­рет на се­бя опе­ра­ци­он­ная сис­те­ма.

Теоретически, в архитектуре защищенного режима x86-совместимого процессора сво­пинг возможен как на уровне сег­мен­тов, так и страниц. Не секрет, что роль сегментации в дизайне современных процессоров и ОС существенно ог­ра­ни­че­на, поэтому на практике получил распространение только второй вариант, основанный на механизме транс­ля­ции страниц (paging). При этом исключение page fault, возникающее при обращении к отсутствующей странице, за­пус­ка­ет механизм «подкачки» этой страницы в физическую память.

Производительность или совместимость?

Некоторая пикантность ситуации состоит в том, что для платформ, поддерживающих концепцию DAX и ос­на­щен­ных мо­ду­ля­ми энергонезависимой памяти NVDIMM, операционная система может заменить механизм свопинга прямым и прак­ти­че­ски мгновенным отображением заданного диапазона памяти на шину, куда подключены модули NVDIMM.

Классификация видов доступа к mass storage устройствам (по материалам Microsoft)

 

Теоретически, это обстоятельство создает фактор совместимости, благодаря которому, традиционные приложения, не оптимизированные для использования 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-накопители Samsung, модель PM983 MZ1LB960HAJQ

 

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

С другой стороны, время выполнения любой операции упрощенно можно представить в виде суммы двух слагаемых: время обработки команды накопителем и накладных расходов, обусловленных функционированием mass storage сте­ка ОС. Очевидно, чем производительнее накопитель, тем меньше первое слагаемое, а значит растет вес второго. По­э­то­му для различных архитектур файлового обмена производительность может различаться. Что и бы­ло пред­ме­том ис­сле­до­ва­ния.

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

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

Показатели производительности чтения и записи для операции свопинга с применением memory mapped file

Показатели производительности чтения и записи для операции свопинга с применением memory mapped file

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

NVMe-накопители Samsung PM983
предоставлены компанией Onix