如何在英特尔® 架构服务器上仿真持久性内存

简介

本教程将介绍如何在采用 4.3 或更高版本的 Linux* 内核的英特尔® 处理器上使用常规动态随即访问内存 (DRAM) 设置持久性内存仿真。本文介绍硬件配置以及如何设置软件。你可以按照本文中的步骤,在pmem.io中尝试 NVM 库中的 PMEM 编程示例。

为什么使用仿真?

如果你是一名软件开发人员,想尽快开始开发软件或准备 PEME 感知型应用,可以在 PMEM 硬件面市之前在开发过程中使用这种仿真方法。

什么是持久性内存?

传统应用在内存层和存储层之间组织数据。新兴 PMEM 技术引进了第三层。它可以像易失性内存那样,使用处理器加载和保存指令进行访问,但会像存储那样在断电期间保留内容。由于仿真使用的是 DRAM,所以重启期间无法保留数据。

硬件和系统要求

持久性内存仿真以 DRAM 内存为基础,该内存以持久性内存区的形式呈现给操作系统 (OS)。由于它是基于 DRAM 的仿真,因此仿真速度极快,但关机时会丢失所有数据。本教程使用以下硬件:

CPU 和芯片组

英特尔® 至强® 处理器 E5-2699 v4 处理器,2.2 GHz

  • 每块芯片的内核数量:22(仅使用一个内核)
  • 插槽数量:2
  • 芯片组:英特尔® C610 芯片组,QS(B-1 步)
  • 系统总线:9.6 GT/秒英特尔® 快速通道互联技术

平台

平台:英特尔® 服务器系统 R2000WT 产品家族(代号“Wildcat Pass”)

  • BIOS:GRRFSDP1.86B.0271.R00.1510301446 ME:V03.01.03.0018.0 BMC:1.33.8932
  • DIMM 插槽:24
  • 电源:1x1100W

内存

内存大小:256 GB (16X16 GB) DDR4 2133P

品牌/型号:Micron* – MTA36ASF2G72PZ2GATESIG

存储

品牌和型号:1 TB Western Digital* (WD1002FAEX)

操作系统

CentOS* 7.2 with kernel 4.5.3

表 1 - 用于 PMEM 仿真的系统配置。

Linux* 内核

本教程撰写期间使用 Linux 内核 4.5.3。自版本 4.0 起的内核支持持久性内存设备和仿真,但为了简化配置,建议使用高于 4.2 的内核。仿真应与能够处理官方内核的所有 Linux 分发版搭配使用。如欲配置合适的驱动程序安装,可运行 make nconfig ,并启用驱动程序。按照以下说明,图 1 - 图 5 显示了 Kernel Configuration 菜单中关于 NVDIMM Support 的正确设置。

$ make nconfig

        -> Device Drivers -> NVDIMM Support ->

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

Set up the device drivers.
图 1:设置设备驱动程序。

Set up the NVDIMM device.
图 2:设置 NVDIMM 设备。

Setup the file system for Direct Access support.
图 3:设置支持 Direct Access 的文件系统。

Setting for Direct Access support.
图 4:设置 Direct Access (DAX) 支持。

Property of the NVDIMM support.
图 5:NVDIMM Support 属性。

该内核将为 PMEM 驱动程序提供这些区域,以便用于持久性存储。图 6 和图 7 显示了 Kernel Configuration 菜单中关于处理器类型和特性的正确设置。

$ make nconfig

        -> Processor type and features

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

图 4 和图 5 显示了 Kernel Configuration 菜单中的选择。

Set up the processor to support NVDIMM.
图 6:设置处理器支持 NVDIMM。

Enable the NON-standard NVDIMMs and ADR protected memory.
图 7:启用非标准 NVDIMM 和 ADR 保护内存。

构建您的内核

现在你可以使用以下指令构建内核。

$ make -jX

        其中 X 是设备上的内核数

在构建新内核过程中,以并行方式编译新内核将获得性能优势。我们开展的从一个线程到多个线程的实验表明,编译速度比单个线程快 95%。加上使用多线程编译节省的时间,整个新内核的设置速度将会更加。图 8 和图 9 显示编译不同数量的内核时所达到的利用率和性能提升。

Compiling the kernel sources.
图 8:编译内核源。

Performance gain for compiling the source in parallel.
图 9:并行编译源代码所获得的性能优势。

安装内核

# make modules_install install

Installing the kernel.
图 10:安装内核。

通过修改内核命令行参数,保留一个内存区,以便以持久性内存位置的形式呈现给 OS。从 ss 到 ss+nn 是待使用的内存区。[KMG] 指 kilo、mega、giga。

memmap=nn[KMG]!ss[KMG]

例如,memmap=4G!12G 指保留第12 和第 16 GB 之间的 4GB 每次买。配置在 GRUB 中完成,配置可能因 Linux 分发版的不同而有所差异。下面是两个 GRUB 配置示例。

CentOS 7.0 下的 GRUB 配置

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

图 11 显示在 GRUB 文件中增加的 PMEM 声明。图 12 显示执行 GRUB 配置的指令。

Define PMEM regions in the /etc/default/grub file.
图 11:在 /etc/default/grub 文件中定义 PMEM 区。

Generate the boot configuration file bases on the grub template.
图 12:根据 grub 模板生成启动配置文件。

设备重启后,应该能够看到仿真设备呈现 /dev/pmem0…pmem3。尝试获取保留的内存区支持持久性内存仿真,定义持久性 (type 12) 区域的各个内存范围将如图 13 所示。通常建议使用 4GB+ 范围 (memmap=nnG!4G) 的内存,或查找该范围之前或以内的 e820 内存映射。如果没有看到设备,请验证 grub 文件中的 memmap 是否如图 9 所示设置正确,然后按照图 13 所示进行 dmesg(1) 分析。应该可以看到 dmesg 输出快照:dmesg,显示保留的范围。

Persistent memory regions are highlighted as (type 12).
图 13:持久性内存区突出显示为 (type 12)。

你将看到有多个未重叠的区域保留为持久性内存。放置多个 memmap="...!..." 条目将导致内核以 /dev/pmem0、/dev/pmem1、/dev/pmem2… 的形式呈现多台设备。

DAX - Direct Access 扩展

DAX(直连)扩展至文件系统可创建 PMEM 感知型环境。部分 distro(例如 Fedora* 24 或更高版本)默认内置了 DAX/PMEM,并提供 NVML。查找内核中通常由 /boot 下方的 distro 提供的配置文件,能够快速查看内核中是否内置了 DAX 和 PMEM。使用以下命令:

# 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 池。

Persistent memory blocks.
图 14:持久性内存块。

Making a file system.
图 15:制作文件系统。

另外值得一提的是,大家可以通过 ramdisk (i.e., /dev/shm) 仿真持久性内存,或通过设置环境变量 PMEM_IS_PMEM_FORCE=1 强制执行类似 PMEM 的行为。这样可以消除由 msync(2) 造成的性能损失。

结论

现在,大家知道了如何设置在没有实际 PMEM 硬件的情况下构建 PMEM 应用的环境。大家可以借助英特尔® 架构服务器上的其他内核,快速为仿真环境构建支持 PMEM 的新内核。

参考资料

持久性内存编程

作者

Thai Le 是英特尔公司的一名软件工程师,负责云计算和性能计算分析工作。

Для получения подробной информации о возможностях оптимизации компилятора обратитесь к нашему Уведомлению об оптимизации.
Возможность комментирования русскоязычного контента была отключена. Узнать подробнее.