我是靠谱客的博主 欣喜身影,最近开发中收集的这篇文章主要介绍Intel Optane PMEM 概览,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 前言
    • 基本架构
    • 编程模型
    • PMDK
      • 接口架构
      • 接口概览
      • pmdk 安装
      • 开发文档汇总
    • PMEM性能
      • 官方性能
      • 实测性能


前言

随着以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来访问的。

持久内存的使用模式对比如下:

优势劣势
持久内存
内存模式
容量大,相比于DDR 更便宜
DRAM可作为持久内存的缓存。
更大的实例容量,更多实例树木扩展
无序应用改动,容易使用
支持最新的CLX平台
持久内存
APP Direct模式
容量大,价格便宜
DRAM和持久内存空间都可用
更大的实例容量,更多实例数目扩展 ,更稳定的性能表现
持久化特性,更好的持久化性能,更快的 恢复时间
只支持最新的CLX平台
需要应用管理数据的分层,应用需要改 动
不经过kernel,所以kernel COW 不支 持

编程模型

这个针对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 的安装,可以参考https://github.com/pmem/pmdk

  1. 依赖安装:

    yum install autoconf pkg-config ndctl-devel daxctl-devel pandoc -y 
    
  2. 最新版本的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
    
  3. 编译:

    # 获取代码
    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
    

开发文档汇总

  1. PMDK官网:https://pmem.io/pmdk
  2. PMDK 开发指南 书籍:https://pmem.io/book/
  3. PMDK 开发者论坛: https://groups.google.com/forum/?utm_source=digest&utm_medium=email#!forum/pmem/topics
  4. 持久内存指南: https://software.intel.com/en-us/persistent-memory/get-started
  5. 持久内存编程示例https://software.intel.com/en-us/persistent-memory/training
  6. 分析你的系统是否适合使用PMEM 的工具: [https://software.intel.com/en- us/articles/vtune-amplifier-platform-profiler](https://software.intel.com/en- us/articles/vtune-amplifier-platform-profiler)
  7. 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肯定会好一些。

最后

以上就是欣喜身影为你收集整理的Intel Optane PMEM 概览的全部内容,希望文章能够帮你解决Intel Optane PMEM 概览所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(78)

评论列表共有 0 条评论

立即
投稿
返回
顶部