Intel Optane PMEM 概览

转自: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低层。

在这里插入图片描述

  •          Persistent Memory 部分中:有两种访问NVDIMMs (底层PMEM存储)的方式,第一种是pmdk,以pmem_mmap方式访问,第二种是通过pmem aware-fs来访问, 这个pmem aware-fs是pmem设备支持的一种适配文件系统,可以提供标准用户访问API(read,write,pread,pwrite…)。
  •         Block中 操作系统抽象出 NVDIMM driver可以在其上格式化标准文件系统(xfs/ext4),对外提供文件系统API;同时也能够对外提供标准设备API 来直接访问 driver。
  •         第三种就是 NVME driver提供了UI ,可以通过UI直接访问NVMDIMM。

PMDK       

        PMDK 则是官方为 PMEM的管理员和应用开发者抽象出来的用户态接口,能够极大得简化用户操作pmem的成本。

接口架构

        persistent memory development kit 接口 提供了大量的编程接口,足以应对用户的各种复杂操作的需求。

        对外接口 以及 不同的库之间关系如下:

在这里插入图片描述

接口概览

  • libpmem 提供最底层的库给应用,保证数据能够持久化。只是不保证原子性和一致性(没有事务),如果用户直接用这一个库,则需要自己保证这一些特性。
  • librpmem类似libpmem 提供的持久化能力 以及一些问题,只是这个库支持通过RDMA访问远端的PMEM 设备
  • libpmemlog 提供能够持久化的log 库
  • libpmemobj 用户主要是使用的库,提供了持久化、事务、内存管理、锁、基本数据结构(链表。。),保证了原子性和一致性
  • libpmemblk 提供持久化的块存储,保证了块数据的原子更新和下电不丢失。
  • libmemkind 用作pmem的内存模式,可以通过malloc/free申请释放空间,就像使用DDR一样。

pmdk 安装

        下面主要介绍的是linux 系统的安装,关于windows 的安装,可以参考GitHub - pmem/pmdk: Persistent Memory Development Kit

  • 依赖安装:

yum install autoconf pkg-config ndctl-devel daxctl-devel pandoc -y 
  •  最新版本的pmdk 会依赖更高版本的ndctl,而这个较高版本的ndctl无法通过yum直接安装,只能通过源码编译安装

        这个过程中遇到的问题挺多的,当然看个人系统,如果系统库安装的比较全,可能也一次通过,简单记录一下。

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
 

PMEM性能

官方性能

        参考链接: https://www.intel.com/content/www/us/en/products/docs/memory-storage/optane-persistent-memory/optane-persistent-memory-200-series-brief.html
在这里插入图片描述

其中 以128G容量为例:

  • 写入单元为256B时,能够提供292PB 的总写入寿命,6.8GB/s的读带宽,1.85GB/s的写带宽,依次读写延时基本都在百ns量级
  • 写入单元为64B时,寿命以及读写带宽都有下降。只能写入91PB的总数据量,读写带宽分别只有1.7Gb/s和0.45GB/s。因为PMEM的字节寻址的基本单元也是256B,也就是如果只写入64B,需要占用256B的存储空间,如果底层要写入的单元有数据,则需要先读取256B的数据单元,将64B的数据添加进去,再把256B的单元整体写入到PMEM中。这个过程会极大得降低读写性能,所以,针对PMEM的编程建议256B对齐,这样对pmem的性能更加友好。
     

 

实测性能

        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肯定会好一些。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值