Емуляція PMEM на серверах Intel

Постійна пам'ять (Persistent Memory, PMEM) – це швидка пам'ять, володіє можливістю зберігати дані після відключення живлення комп'ютера. Нерідко її називають «Non-Volatile Random Access Memory» (NVRAM) – «незалежній оперативною пам'яттю», або просто «незалежною пам'яттю». Ще одне найменування такої пам'яті – NVDIMM. Воно вказує на те, що до складу постійної пам'яті входять модулі традиційної оперативної пам'яті.


Іноді ми просто не знаємо, яку картинку вставити до ката. І сьогодні саме такий випадок. Шлях буде кіт :)

Історично склалося так, що додатки організовують дані з використанням двох рівнів пам'яті. Перший – швидка оперативна пам'ять, другий – порівняно повільні накопичувачі інформації. Поява PMEM означає виникнення третього рівня пам'яті, що займає місце між першим і другим.

Працювати з новим видом пам'яті можна так само, як з ОЗП, використовуючи інструкції процесора завантаження і збереження даних.

Шлях апаратних рішень, що реалізують PMEM, тільки починається. Однак, все вказує на те, що вони цілком можуть одержати широке поширення. Нова різновид пам'яті вимагає нових підходів до розробки програмного забезпечення. Програми самі по собі не можуть отримати вигоду з PMEM, їх треба до цього підготувати.

Якщо ви – програміст, який хоче якомога раніше, ще до широкого поширення апаратних PMEM-рішень, приступити до створення додатків, які вміють працювати з новою пам'яттю, ви можете скористатися емуляцією. Такий підхід допоможе і при оновленні існуючих проектів.

З цього матеріалу ви дізнаєтеся про те, як налаштувати емуляцію PMEM, використовуючи звичайну оперативну пам'ять. Виділена під емуляцію область ОЗП буде видно операційній системі як область постійної пам'яті. Треба зазначити, що в нашому випадку, так як емуляція заснована на звичайній DRAM, дані з віртуальної PMEM втрачаються після вимкнення живлення. Однак, швидкість роботи з емуліруемой пам'яттю буде дуже високою.

Тут ми будемо користуватися сервером з процесором Intel і ОС сімейства Linux з ядром версії 4.3. або вище. Ми розповімо про конфігурування апаратного забезпечення, і про те, як налаштувати програмну частину рішення. Після того, як емуляція буде налаштована, ви зможете випробувати приклади PMEM-додатків, які можна знайти на бібліотеці NVM на сайті pmem.io.

Апаратні і програмні компоненти
Ось характеристики апаратного і програмного забезпечення, які використовувалися для експериментів.
Компонент
Характеристики
Процесор
Intel Xeon E5-2699 v4 (2.2 ГГц, 22 ядра, використовується одне ядро).
Чіпсет
Intel C610 QS (степпінг B1), системна шина Intel QPI, 9.6 ГТ/с.
Платформа
Intel Server System R2000WT (Wildcat Pass), 24 слоти DIMM, 2 процесорних сокета, блок живлення на 1100 Вт.
BIOS – GRRFSDP1.86B.0271.R00.1510301446 ME:V03.01.03.0018.0 BMC:1.33.8932
Оперативна пам'ять
Micron MTA36ASF2G72PZ2GATESIG, 256 Гб (16х16 Гб) DDR4 2133P.
Накопичувач
Western Digital WD1002FAEX, 1 Тб.
Операційна система
CentOS з ядром 4.5.3
Підготовка ядра Linux
В ході роботи використовувалося ядро Linux версії 4.5.3. Підтримка пристроїв постійної пам'яті і емуляції є в ядрі, починаючи з версії 4.0, проте, для того, щоб спростити настройку системи, рекомендується користуватися ядрами версії вище 4.2.

Емуляція повинна працювати з будь-яким дистрибутивом Linux, який здатний підтримувати офіційне ядро. Для того, щоб встановити потрібні драйвери, запустіть make nconfig.

На малюнках 1 — 5 показаний процес налаштування підтримки NVDIMM в меню конфігурації ядра (Kernel Configuration).

$ make nconfig

-> Device Drivers -> NVDIMM Support ->

<M>PMEM; <M>BLK; <*>BTT


Рис. 1. Перехід до налаштування драйверів пристроїв


Рис. 2. Налаштування підтримки NVDIMM


Рис. 3. Налаштування файлової системи для підтримки технології Direct Access


Рис. 4. Налаштування підтримки Direct Access (DAX)


Рис. 5. Параметри підтримки NVDIMM

Ядро запропонує області пам'яті для драйвера PMEM, їх можна буде використовувати для емуляції постійного сховища. На малюнках 6 — 7 показано налаштування параметрів процесора і системи.

$ make nconfig

-> Processor type and features

<*>Support non-standard NVDIMMs and ADR protected memory


Рис. 6. Налаштування процесора для підтримки NVDIMM


Рис. 7. Включення підтримки нестандартної пам'яті NVDIMM і пам'яті, захищеної ADR

Тепер все готово до того, щоб зібрати ядро, використовуючи команду, показану нижче.

$ make -jX

X – це кількість ядер процесора

Прискорення складання ядра
Нове ядро можна зібрати значно швидше, використовуючи декілька потоків. Експерименти з різною кількістю потоків показали, що компіляцію можна прискорити приблизно на 95% в багатопотоковому режимі. В результаті настроювання нового ядра проходить досить швидко. На двох малюнках, наведених нижче, показана завантаження процесора і графік, що ілюструє вплив на продуктивність використання декількох потоків при складанні ядра.


Рис. 8. Компіляція вихідного коду ядра


Рис. 9. Вплив багатопоточності на продуктивність компіляції

Установка і настроювання нового ядра
Для установки ядра скористайтеся такою командою:

# make modules_install install


Рис. 10. Установка ядра

Тепер зарезервуємо область пам'яті, модифікувавши завантажувальні параметри ядра. В результаті вибрана область буде виглядати для операційної системи як постійна пам'ять. Тут використовується команда такого виду:

memmap=nn[KMG]!ss[KMG]

В результаті її виконання буде виділена область пам'яті в діапазоні від ss до ss+nn. «KMG» – це скорочення для одиниць вимірювання: Kilo, Mega, Giga.

Наприклад, команда вигляду memmap=4G!12G резервує 4 Гб пам'яті між 12-м і 16-м гігабайтами. Налаштування виконується в GRUB і розрізняється для різних дистрибутивів Linux. Ось приклад конфігурації GRUB для CentOS 7.0.

# vi /etc/default/grub
GRUB_CMDLINE_LINUX="memmap=nn[KMG]!ss[KMG]"
On BIOS-based machines:
# grub2-mkconfig -o /boot/grub 2/grub.cfg

На малюнку нижче показана інструкція щодо PMEM, додана в GRUB-файл.


Рис. 11. Вказівка областей для PMEM у файлі /etc/default/grub

А ось – процес складання конфігурації GRUB.


Рис. 12. Створення файлу конфігурації завантаження на основі шаблону grub

Після налаштування GRUB і перезавантаження комп'ютера, якщо все зроблено правильно, можна буде побачити эмулируемое пристрій /dev/pmem0...pmem3.

Спроба захопити зарезервованих областей пам'яті під емуляцію постійної пам'яті призведе до розірваним областях, що відносяться до постійної пам'яті (type 12).


Рис. 13. Області, виділені під емуляцію постійної пам'яті марковані як (type 12)

При налаштуванні рекомендується використовувати пам'ять з діапазону, що перевищує 4 Гб (memmap=nnG!4G), або попередньо перевірити карту пам'яті (через BIOS-e820) і вибрати відповідний діапазон.

Якщо потрібної віртуального пристрою в системі не видно, перевірте налаштування memmap у файлі grub, як показано на рис. 11, потім – проаналізуйте стан пам'яті з допомогою dmesg, як показано на рисунку 13. Якщо все налаштовано правильно, ви побачите зарезервовані області пам'яті. Тут можуть бути і неперекрывающиеся області, зарезервовані як постійна пам'ять. Якщо при налаштуванні використовувати декілька команд memmap, будуть створені декілька віртуальних пристроїв, що надаються ядром і видимих як /dev/pmem0, /dev/pmem1, /dev/pmem2 і так далі.

Розширення прямого доступу до файлової системи
Розширення прямого доступу (Direct Access, DAX) до файлової системи створюють середовище, в якій можна працювати з PMEM. Деякі дистрибутиви, такі, як Fedora 24 і більш пізні версії, вже мають вбудовані механізми DAX/PMEM, там же доступна і бібліотека NVM (NVML).

Ось швидкий спосіб перевірити, вбудовані в ядро DAX і PMEM. Для цього можна обробити утилітою egrep конфігураційний файл ядра, який зазвичай знаходиться в папці /boot дистрибутива:

# egrep '(DAX|PMEM)' /boot/config-`uname –r`

В результаті виконання такої команди буде виведено приблизно наступне:

CONFIG_X86_PMEM_LEGACY_DEVICE=y
CONFIG_X86_PMEM_LEGACY=y
CONFIG_BLK_DEV_RAM_DAX=y
CONFIG_BLK_DEV_PMEM=m
CONFIG_FS_DAX=y
CONFIG_FS_DAX_PMD=y
CONFIG_ARCH_HAS_PMEM_API=y

З допомогою наступних команд можна встановити файлову систему з DAX (сьогодні це можливо для ext4 і xfs):

# mkdir /mnt/pmemdir
# mkfs.ext4 /dev/pmem3
# mount -o dax /dev/pmem3 /mnt/pmemdir

Тепер в змонтованому розділі можна створювати файли і передавати в якості вхідних даних NVML-пулам.


Рис. 14. Блоки постійної пам'яті


Рис. 15. Збірка файлової системи

Варто відзначити, що емулювати постійну пам'ять можна і з допомогою ramdisk (тобто, /dev/shm), або встановивши змінну оточення PMEM_IS_PMEM_FORCE=1. Це дозволить уникнути впливу на продуктивність, викликаного msync.

Підсумки
Тепер ви знаєте, як налаштувати середовище, в якому можна створювати додатки, що працюють з PMEM, не маючи відповідного апаратного забезпечення, використовуючи додаткові потоки на серверах з архітектурою Intel, ви зможете швидко зібрати нове ядро Linux, готове до експериментів з постійною пам'яттю.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.