当前位置: 首页 > 编程日记 > 正文

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.shActivated pre-commit hook.GIT_VERSION = 71sh: aclocal: command not foundautoreconf: 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' foundConsider 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肯定会好一些。

相关文章:

Java项目:新闻发布系统(java+Springboot+ssm+mysql+maven)

源码获取:博客首页 "资源" 里下载! 一、项目简述 功能: 区分为管理员用户和普通用户,管理员用户能删除评论, 调整新闻显示/隐藏,修改新闻,删除普通用户,普通用户能 登陆浏…

Linux下搭建Lotus Domino集群

Linux下搭建Lotus Domino 集群本文内容是Linux平台下Lotus Domino服务器部署案例(http://chenguang.blog.51cto.com/350944/1334595)的另一个模块,所以大家首先要有以上基础之后然后继续实验。集群是 Lotus Domino Server 提供的最重要特性之…

Centos下卸载openjdk并安装自定义jdk

1、查看是否安装了openjdk java -version 2、查看需要卸载的openjdk信息,其中只需要删除红色框标记的地方 rpm -qa | grep java 3、删除openjdk rpm -e --nodeps 需要删除的java组件 4、创建文件夹java mkdir java 5、到官网下载linux版本的jdk(如果不能…

pmdk -- libpmemlog 介绍

文章目录1. libpmemlog 应用背景2. libpmemlog 使用方式2.1 基本接口2.2 接口使用3. Libpmemlog 性能3.1 write sys call 性能3.2 libpmemlog 性能1. libpmemlog 应用背景 本文介绍的是英特尔 傲腾持久化内存 pmdk中 的一个持久化日志的库。 我们正常系统中会将日志 形成一个…

Java项目:家庭财务管理系统(java+Springboot+ssm+mysql+maven)

源码获取:博客首页 "资源" 里下载! 一、项目简述 功能: 家庭财务管理系统,具有收入统计,支出统计,汇总报 表,工资录入,其他收入等录入开支信息,echart图标插 …

(原创)c++primer(第五版)--1.3 注释简介

注释可以帮助人类读者理解程序。注释通常用于概述算法,确定变量的用途,或者结束晦涩难懂的代码段。编译器会忽略注释,因此注释对程序的行为或者性能不会有任何影响。 虽然编辑器会忽略注释,但读者并不会。即使系统文档的其他部分已…

BZOJ 1503 郁闷的出纳员(splay)

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id1503 题意:给出一个数列(初始为空),给出一个最小值Min,当数列中的数字小于Min时自动删除。四种操作:(1)数列…

javascript ES6 新特性之 扩展运算符 三个点 ...

对于 ES6 新特性中的 ... 可以简单的理解为下面一句话就可以了: 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中。 作用类似于 Object.assign() 方法,我们先来看一下 Object.assign() 方法: Obje…

字符串匹配算法 -- BM(Boyer-Moore) 和 KMP(Knuth-Morris-Pratt)详细设计及实现

文章目录1. 算法背景2. BM(Boyer-Moore)算法2.1 坏字符规则(bad character rule)2.2 好后缀规则(good suffix shift)2.3 复杂度及完整代码3. KMP(Knuth Morris Pratt)算法3.1 好前缀 和 坏字符规则3.2 高效构建 失效函数3.3 复杂度…

Java项目:中小医院信息管理系统(java+Springboot+ssm+mysql+maven+jsp)

源码获取:博客首页 "资源" 里下载! 一、项目简述 本系统功能包括:实现了挂号收费,门诊管理,划价收 费,药房取药,体检管理,药房管理,系统维护等各个模块功能&a…

DB2load遇到SQL3508N错误

SQL3508N装入或装入查询期间&#xff0c;当存取类型为 "<文件类型>" 的文件或路径时出错。原因码&#xff1a;"<原因码>"。路径&#xff1a;"<路径&#xff0f; 文件>"。 [more]解释: 装入或装入查询处理期间&#xff0c;在尝…

【cocos2d-x 手游研发小技巧(3)Android界面分辨率适配方案】

先感叹一下吧~~android的各种分辨率各种适配虐我千百遍&#xff0c;每次新项目我依旧待它如初恋 每家公司都有自己项目工程适配的方案&#xff0c;这种东西就是没有最好&#xff0c;只有最适合&#xff01;&#xff01;&#xff01; 这次新项目专项针对android&#xff0c;目的…

git submodule 使用场景汇总

文章目录1. 前言2. 基础命令介绍2.1 场景一&#xff1a;已有仓库&#xff0c;添加一个子模块2.2 场景二&#xff1a;已有仓库&#xff0c;添加一个子模块的特定分支2.3 场景三&#xff1a;已有仓库&#xff0c;更新子模块内容2.4 场景四&#xff1a;已有仓库&#xff0c;变更子…

Java项目:在线商城系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 本系统功能包括&#xff1a; 前台展示后台管理&#xff0c;包括最基本的用户登录注册&#xff0c;下单&#xff0c; 购物车&#xff0c;购买&#xff0c;结算&#xff0c;订单查询&#xff0c…

自定义参数解析器,减少10%的代码

*** 赋值调用方法* 如果为空,默认调用name()方法* 该方法必须是一个不含参数的方法,否则将会调用失败* @return*/value() : value用于绑定请求参数和方法参数名一致时的对应关系。比如user?statusNo=1。方法的参数写法如下:getUser(@EnumParam(value=“statusNo”) int status) 或者 getUser(@EnumParam() int statusNo)valueMethod() : 赋值时调用枚举中的方法。

微服务全做错了!谷歌提出新方法,成本直接降9倍!

一位DataDog的客户收到6500万美元的云监控账单的消息,也再次让业界无数人惊到了。事实上有些团队在将集中式单体应用拆分为微服务时,首先进行的往往不是建立领域模型,而只是按照业务功能将原来单体应用的一个软件包拆分成多个所谓的“微服务”软件包,而这些“微服务”内的代码高度耦合,逻辑边界不清晰,长期以来,不管大厂还是小厂,微服务都被认为是云原生服务应用程序架构的事实标准,然而2023,不止那位37signals的DHH决心下云,放弃微服务,就连亚马逊和谷歌等这些云巨头,正在带头开始革了微服务的命。

简述nodejs、npm及其模块在windows下的安装与配置

nodejs的安装 登陆官网http://nodejs.org/&#xff0c;自行安装&#xff0c;不需配置环境变量&#xff0c;安装中自动配置了。 检测是否安装成功&#xff0c;使用cmd输入 node -v 即可查看。 npm的安装 如果是最新版nodejs其实不用装npm&#xff0c;它集成了npm&#xff0c;验证…

discuz,ecshop的伪静态规则(apache+nginx)

discuz(nginx): (备注&#xff1a;该规则也适用于二级目录) rewrite ^([^\.]*)/topic-(.)\.html$ $1/portal.php?modtopic&topic$2 last; rewrite ^([^\.]*)/article-([0-9])-([0-9])\.html$ $1/portal.php?modview&aid$2&page$3 last; rewrite ^([^\.]*)/forum-…

字符串匹配数据结构 --Trie树 高效实现搜索词提示 / IDE自动补全

文章目录1. 算法背景2. Trie 树实现原理2.1 Trie 树的构建2.2 Trie树的查找2.3 Trie树的遍历2.4 Trie树的时间/空间复杂度2.5 Trie 树 Vs 散列表/红黑树3. Trie树的应用 -- 搜索词提示功能1. 算法背景 之前我们了解过单模式串匹配的相关高效算法 – BM/KMP&#xff0c;虽难以理…

Java项目:成绩管理系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 本系统功能包括&#xff1a; 超豪华成绩管理系统&#xff0c;学生&#xff0c;教师&#xff0c;管理员三类用户集 成&#xff0c;课程表管理&#xff0c;成绩查询&#xff0c;成绩详情数据统计…

NSThread 多线程相关

1.下面的代码&#xff0c;有2点需要注意&#xff0c;1>就是 就是thread:所传得参数&#xff0c;这里传得的是nsarray 当然也可以传其他的类型。2> [self performSelectorOnMainThread:selector(update) withObject:nil waitUntilDone:YES]; 这个函数的作用是通知主线程进…

Windows Phone 8初学者开发—第19部分:设置RecordAudio.xaml页面

原文地址: http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners/Part-19-Setting-up-the-RecordAudioxaml-Page 系列地址: http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners 源代码: http://aka.ms/abs…

9.path Sum III(路径和 III)

Level&#xff1a; Easy 题目描述&#xff1a; You are given a binary tree in which each node contains an integer value. Find the number of paths that sum to a given value. The path does not need to start or end at the root or a leaf, but it must go downwards…

字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法

文章目录1. 算法背景2. AC自动机实现原理2.1 构建失败指针2.2 依赖失败指针过滤敏感词3. 复杂度及完整代码1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 基于多模式串的匹配数据结构Trie树。 1. BM和KMP 单模式串匹配算法细节 2. Trie树 多模式串的高效匹配数…

Java项目:仿小米商城系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 本系统功能包括&#xff1a; 基于vue Springboot前后端分离项目精简版仿小米商城 系统&#xff0c;注册登录&#xff0c;首页展示&#xff0c;商品展示&#xff0c;商品购买&#xff0c;下单…

vb socket的使用

说明:原本在 csdn 博客 写博客的&#xff0c;因为使用的移动宽带&#xff0c;csdn的 博客无法访问&#xff0c;所以先暂时到博客园写博客了 有能解决移动宽带 有部分网站不能访问的问题&#xff0c;请联系我&#xff0c;QQ 809775607 /***************************/ 下面写wins…

不吹牛会死!国内音乐平台进入“大逃杀”

日前&#xff0c;一篇《看看海洋与腾讯音乐将如何“血洗”独立音乐应用》的文章引起了广泛关注。文中海洋声称长期独家签约的音乐及版权代理公司达40多家&#xff0c;占市场份额超过15%&#xff0c;一时间名不见经传的海洋音乐仿佛成了一匹跃然网上的“黑马”。然而据音乐圈深喉…

leetcode网学习笔记(1)

https://leetcode-cn.com/problems/reverse-linked-list/submissions/ 206 反转链表 错误原因&#xff1a;没有考虑到链表为空以及链表只有一个元素的情况 https://leetcode-cn.com/problems/swap-nodes-in-pairs/comments/ 24 两两交换链表 原方法&#xff1a;使用4个指针遍历…

贪心算法简单实践 -- 分糖果、钱币找零、最多区间覆盖、哈夫曼编解码

1. 贪心算法概览 贪心算法是一种算法思想。希望能够满足限制的情况下将期望值最大化。比如&#xff1a;Huffman编码&#xff0c;Dijkstra单源最短路径问题&#xff0c;Kruskal最小生成树 等问题都希望满足限制的情况下用最少的代价找到解决问题的办法。 这个办法就是贪心算法…

Java项目:个人博客系统(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 一、项目简述 本系统功能包括&#xff1a;文章展示、热门文章、文章分类、标签云用户登录评论、匿名评论用户留言、匿名留言评论管理、文章发布、文章管理文章数据统计等等&#xff0e; 二、项目运行 环境…