简介
本教程将介绍如何在采用 4.3 或更高版本的 Linux* 内核的英特尔® 处理器上使用常规动态随即访问内存 (DRAM) 设置持久性内存仿真。本文介绍硬件配置以及如何设置软件。你可以按照本文中的步骤,在pmem.io中尝试 NVM 库中的 PMEM 编程示例。
为什么使用仿真?
如果你是一名软件开发人员,想尽快开始开发软件或准备 PEME 感知型应用,可以在 PMEM 硬件面市之前在开发过程中使用这种仿真方法。
什么是持久性内存?
传统应用在内存层和存储层之间组织数据。新兴 PMEM 技术引进了第三层。它可以像易失性内存那样,使用处理器加载和保存指令进行访问,但会像存储那样在断电期间保留内容。由于仿真使用的是 DRAM,所以重启期间无法保留数据。
硬件和系统要求
持久性内存仿真以 DRAM 内存为基础,该内存以持久性内存区的形式呈现给操作系统 (OS)。由于它是基于 DRAM 的仿真,因此仿真速度极快,但关机时会丢失所有数据。本教程使用以下硬件:
CPU 和芯片组 | 英特尔® 至强® 处理器 E5-2699 v4 处理器,2.2 GHz
|
平台 | 平台:英特尔® 服务器系统 R2000WT 产品家族(代号“Wildcat Pass”)
|
内存 | 内存大小: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
图 1:设置设备驱动程序。
图 2:设置 NVDIMM 设备。
图 3:设置支持 Direct Access 的文件系统。
图 4:设置 Direct Access (DAX) 支持。
图 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 菜单中的选择。
图 6:设置处理器支持 NVDIMM。
图 7:启用非标准 NVDIMM 和 ADR 保护内存。
构建您的内核
现在你可以使用以下指令构建内核。
$ make -jX 其中 X 是设备上的内核数
在构建新内核过程中,以并行方式编译新内核将获得性能优势。我们开展的从一个线程到多个线程的实验表明,编译速度比单个线程快 95%。加上使用多线程编译节省的时间,整个新内核的设置速度将会更加。图 8 和图 9 显示编译不同数量的内核时所达到的利用率和性能提升。
图 8:编译内核源。
图 9:并行编译源代码所获得的性能优势。
安装内核
# make modules_install install
图 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 配置的指令。
图 11:在 /etc/default/grub 文件中定义 PMEM 区。
图 12:根据 grub 模板生成启动配置文件。
设备重启后,应该能够看到仿真设备呈现 /dev/pmem0…pmem3。尝试获取保留的内存区支持持久性内存仿真,定义持久性 (type 12) 区域的各个内存范围将如图 13 所示。通常建议使用 4GB+ 范围 (memmap=nnG!4G) 的内存,或查找该范围之前或以内的 e820 内存映射。如果没有看到设备,请验证 grub 文件中的 memmap 是否如图 9 所示设置正确,然后按照图 13 所示进行 dmesg(1) 分析。应该可以看到 dmesg 输出快照:dmesg,显示保留的范围。
图 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 池。
图 14:持久性内存块。
图 15:制作文件系统。
另外值得一提的是,大家可以通过 ramdisk (i.e., /dev/shm) 仿真持久性内存,或通过设置环境变量 PMEM_IS_PMEM_FORCE=1 强制执行类似 PMEM 的行为。这样可以消除由 msync(2) 造成的性能损失。
结论
现在,大家知道了如何设置在没有实际 PMEM 硬件的情况下构建 PMEM 应用的环境。大家可以借助英特尔® 架构服务器上的其他内核,快速为仿真环境构建支持 PMEM 的新内核。
参考资料
作者
Thai Le 是英特尔公司的一名软件工程师,负责云计算和性能计算分析工作。