转自:https://vigourtyy-zhg.blog.csdn.net/article/details/113284470
随着以PCM 为存储单元的3D XPoint 非易失存储介质 不断精进的工艺,以及 上层硬件协议栈的飞速发展,为非易失内存这样硬件的出现提供了技术工艺基础。
关于3D XPoint 介质 和 NAND 介质 之间的底层差异,可以参考从NMOS 和 PCM 底层存储单元 来看NAND和3D XPoint的本质区别
全新英特尔® 傲腾TM 持久型内存重新定义了传统的架构,以合 理的价格提供大型持久型内存层级。英特尔® 傲腾TM 级持久型 内存(结合第二代智能英特尔® 至强® 可扩展处理器)在内存 密集型工作负载、虚拟机密度和快速存储容量方面具有突破 性的性能水平,通过比以往更快的分析、云服务和下一代通 信服务,可加速 IT 转型以支持数据时代的需求。
PMEM 所处 intel构建的 存储架构体系的位置 以及 它的性能量级 如下:
总的来说 PMEM处于DDR 内存性能之下,能够提供持久化能力 且 性能和 DDR 在一个量级,远低于NAND SSD。
基本特点如下:
能够提供128G,256G,512G 的容量,且和DDR4总线兼容。它能够插在内存条的插槽之上。
可以直接加载访问,其实是以256B 为基本读写单元大小。
底层3d xpoint 保证了性能和非易失性
内存模式和 APP Direct模式。
内存模式下:
即PMEM和内存作用一样,由MMU直接管理空间访问,同样存在易失性问题。
不过内存模式下性能 肯定是没有 传统的DDR性能好。
APP Direct模式如下:
PMEM 可以代替DDR,作为内存并提供持久化能力。只是这个时候,PMEM的空间管理需要由软件层来做。
整个PMEM的完整模块系统如下:
主体部分以 持久内存的控制器功能为主,内部集成了针对3D XPoint存储介质的各个组件管理,基本的数据加密,EC校验 以及 保证PCM 存储单元的正常散热和功耗优化 的组件等。这幅图中CPU以64B访问是有一些问题,当前的PMEM版本其实是以256B来访问的。
持久内存的使用模式对比如下:
这个针对PMEM的编程模型叫做SNIA(storage network industry association) 细节可以参考 SNIA,介绍了用户如何来通过标准接口访问PMEM低层。
PMDK 则是官方为 PMEM的管理员和应用开发者抽象出来的用户态接口,能够极大得简化用户操作pmem的成本。
persistent memory development kit 接口 提供了大量的编程接口,足以应对用户的各种复杂操作的需求。
对外接口 以及 不同的库之间关系如下:
下面主要介绍的是linux 系统的安装,关于windows 的安装,可以参考GitHub - pmem/pmdk: Persistent Memory Development Kit
依赖安装:
yum install autoconf pkg-config ndctl-devel daxctl-devel pandoc -y
这个过程中遇到的问题挺多的,当然看个人系统,如果系统库安装的比较全,可能也一次通过,简单记录一下。
git clone https://github.com/pmem/ndctl.git
cd ndctl
git checkout v71 # 当前的最新版本
./autogen.sh
Activated pre-commit hook.
GIT_VERSION = 71
sh: aclocal: command not found
autoreconf: aclocal failed with exit status: 127 # 执行失败
----------------------------------------------------
# 解决
sudo yum install automake libtool -y
autoreconf -ivf
# 执行成功
$ ./autogen.sh
----------------------------------------------------------------
Initialized build system. For a common configuration please run:
----------------------------------------------------------------
./configure CFLAGS='-g -O2' --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64
# 执行./configure
./configure CFLAGS='-g -O2' --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64
...
checking for a sed that does not truncate output... (cached) /usr/bin/sed
checking for asciidoctor... missing
configure: error: asciidoctor needed to build documentation # 执行失败
----------------------------------------------------
# 解决
sudo yum install asciidoctor -y
# 重新执行 ./configure
./configure CFLAGS='-g -O2' --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64
...
checking for KMOD... no
configure: error: Package requirements (libkmod) were not met:
No package 'libkmod' found
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix # 执行失败
----------------------------------------------------
#解决
sudo yum install kmod kmod-devel -y
# 再次重新执行 ./configure
./configure CFLAGS='-g -O2' --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64
...
configure: error: Package requirements (uuid) were not met:
No package 'uuid' found #执行失败
----------------------------------------------------
#解决
sudo yum install libuuid-devel json-c-devel -y
# 执行./configure 成功,生成 Makefile
./configure CFLAGS='-g -O2' --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64
# 安装ndctl
make && sudo make install
# 获取代码
git clone https://github.com/pmem/pmdk
cd pmdk
git checkout stable-1.10 # 这一步也可以跳过,直接编译master分支
# 编译 ,建议以root用户来执行
make EXTRA_CFLAGS="-Wno-error"
make install prefix=/usr/local # 如果没有root用户,可以指定自己的安装prefix,默认是/usr/local
PMDK官网:https://pmem.io/pmdk
PMDK 开发指南 书籍:https://pmem.io/book/
PMDK 开发者论坛: https://groups.google.com/forum/?utm_source=digest&utm_medium=email#!forum/pmem/topics
持久内存指南: https://software.intel.com/en-us/persistent-memory/get-started
持久内存编程示例https://software.intel.com/en-us/persistent-memory/training
分析你的系统是否适合使用PMEM 的工具: [https://software.intel.com/en- us/articles/vtune-amplifier-platform-profiler](https://software.intel.com/en- us/articles/vtune-amplifier-platform-profiler)
PMDK 实践应用:
VMware vSphere : https://vspherecentral.vmware.com/t/hardware-acceleration/persistent-memory-pmem/
Microsoft Hyper-V: https://docs.microsoft.com/en-us/windows-server/virtualization/hyper-v/manage/persistent-memory-cmdlets
pmem-redis: https://github.com/pmem/pmem-redis
参考链接: https://www.intel.com/content/www/us/en/products/docs/memory-storage/optane-persistent-memory/optane-persistent-memory-200-series-brief.html
其中 以128G容量为例:
PMEM性能和内存处于一个量级,且PMEM是插在DIMM插槽,也就是内存条的插槽上。所以CPU访问PMEM的性能 只有绑定 NUMA 才能完整体现。
硬件环境:
CPU:Intel® Xeon® CPU E5-2680 v4 @ 2.40GHz 56core
内存: 256G
硬盘:pmem 128G*4 aep
操作系统:CentOS Linux release 7.4.1708 (Core)
文件系统:XFS(rw,noatime,attr2,dax,inode64,noquota)
测试软件:FIO
fio脚本
[global]
ioengine=libpmem #pmem引擎
direct=1
norandommap=1
randrepeat=0
runtime=60
time_based
size=1G
directory=./fio
group_reporting
[read256B-rand]
bs=256B
rw=randread
numjobs=32
iodepth=4
cpus_allowed=0-15,16-31 #绑定numa
如果大家要对比PMEM和SSD的性能,可以同样的脚本去测试一下SSD,ioengine可以替换成libaio。
这个测试 达不到 官网给出的 单个128G 在256B的读场景下 的6.8G的带宽,我们使用的是128G*4的 pmem,总带宽实际测试也只有7.5G/s,这个目前还没有和官方核对。
其他的数据在libpmem引擎下基本一样,还有如果使用普通的libaio引擎,也就是走文件系统的调用,读写性能会有20%以上的损失,这里的损失基本是由内核文件系统带来的,libpmem引擎能够支持fio直接通过用户态调用pmdk来访问PMEM,性能相比于libaio肯定会好一些。