随着计算能力虚拟化技术的普及,存储机制在速度上远逊于内存这一劣势开始变得愈发凸显。

这一巨大的访问速度鸿沟一直是各项存储技术想要解决的核心难题:纸带、磁带、磁盘驱动器乃至闪存记忆体等等,而如今最新一代问题解决方案则成长为由3D XPoint领军的高速非易失性固态记忆体。

这种几乎能够在一定程度上将速度与内存看齐的新型存储方案将给服务器以及系统硬件与软件带来颠覆性的变革。

内存中的内容具备易失性或者说临时性,意味着电源关闭后其会直接消失。相比之下,存储设备中的内容即使失去电力支持也依然存在,因此我们将其称为持久性或者非易失性存储。

而固态、非易失性记忆体或者说NAND闪存在速度上则要远远高于磁盘以及磁带。

纳秒与微秒

内存访问时长约为200纳秒。其速度主要受到CPU缓存访问速度标准的影响,其中一级缓存访问约耗时半纳秒,二级缓存访问速度则为7纳秒。

磁盘驱动器需要将读取/写入磁头移动到对应的磁道处才能完成读写操作,其耗时约在1000万纳秒上下--即10毫秒或者10000微秒。其速度基本要比内存访问慢上两个量级。

而固态驱动器(简称)的速度则要远超于此。美光最新推出的9100 SSD是一款NVMe协议PCIe总线卡,其读取访问延迟为120微秒,写入访问延迟则为30微秒。其至少要比磁盘快上一个量级,但仍较DRAM写入访问慢150倍,读取访问更要慢上600倍。

为什么读取与写入之间存在的延迟时长差异?我们都知道,这是因为写入内容会被缓存在SSD的DRAM缓冲区内,而读取则直接接入速度更慢的NAND本身。

尽管NAND的速度要远高于磁带,但其仍然无法同内存相比肩,这意味着IO速度依旧制约着代码编写方式。具体来讲,编程人员需要限制IO强度,而服务器/存储系统工程师则需要努力利用NAND缓存机制克服磁盘数据延迟,并利用DRAM缓存进一步提升NAND访问时耗。

多插槽、多核心CPU服务器本身很容易遭遇IO等待问题,这是因为其存储子系统的运作速度只相当于内存速度的数百分之一。在这种情况下,处理器需要闲置并等待存储完成操作后方可继续工作。

访问时间中的鸿沟

如果我们将一级缓存的访问时长规定为1秒,而后以此为基础进行等比计算。因此,磁带访问的相对时长将达到6年4个月19小时33分又20秒。而速度更快的美光9100 SSD的相对时长为2天18小时40分钟。尽管与磁盘相比优势明显,但仍然远远无法同DRAM访问速度标准相比--后者仅为6分钟40秒。

如此巨大的访问时间鸿沟催生了易失性内存与持久性存储之间的新事物,即英特尔与美光联手打造的3D XPoint内存--这是一种新的非易失性固态存储形式。

XPoint由相变记忆体材料构建而成,其采用硫化物晶体,并能够根据实际电压实现状态变更,从而引发电阻值切换。这种变更能够逆转,因此两种电阻值水平可被分别定义为1与0。该XPoint晶粒分为两层并采用通孔设计,这也是其3D名称的由来。

根据有关双方的说法,其量变机制与其它材料中由无状态到结晶态间的相变机制有所区别,但目前尚无更多进一步消息可供参考。

英特尔与美光双方发布的早期市场推广消息显示,其速度将达到普通闪存的1000倍,使用寿命亦为1000倍,而使用成本则在普通闪存与DRAM之间。

Objective Analysis公司的Jim Handy绘制了以下XPoint定位图:

这是一份平面图表,其中两条轴分别为每GB使用成本与传输带宽,可以看到3D XPoint的位置处于NAND及DRAM之间。

XPoint细节信息

与NAND不同,XPoint采用字节寻址机制而非块寻址机制。英特尔方面指出,其将推出Optane品牌的XPoint SSD(即NVMe接入驱动器)与XPoint DIMM,意味着XPoint芯片能够以DIMM封装形式直接接入内存总线,而不必经由NVMe XPoint驱动器所采用的速度更慢的PCIe总线。

英特尔公司研究员兼首席3D XPoint存储架构师Frank Hady在最近于圣迭戈大学召开的2016年第七届非易失性内存研讨会上提供了与Optane相关的部分细节数据。

我们将内容汇总如下:

• 采用20纳米制程;

• SLC (单层单元);

• 7微秒延迟,或者换算为7000纳秒;

• 78500(七比三随机)读取/写入IOPS;

• NVMe接口。

XPoint的传输带宽目前尚不明确。

如果我们据此整理出一份涵盖内存与存储介质的延迟表格,从一级缓存到磁盘,那么结果将如下所示:

其中延迟为7微秒的XPoint在速度上仅比DRAM慢35倍。这样的水平要远远优于NVMe NAND,其中美光的9100在写入与读取两方面分别较DRAM慢150倍与600倍。

如果我们选取以上表格中的前五条并将其整理为横向图,则如下所示:

很明显,XPoint与内存间的延迟差距要远小于NAND。XPoint可用于NAND(或者磁盘)的缓存技术方案,不过这种用法并没有什么颠覆性可言--毕竟缓存就是缓存,没什么新鲜的。或者,我们可以将其作为一种内存形式,意味着应用程序将能够直接操作XPoint当中的数据--而非DRAM。

以DIMM形式封装的XPoint芯片预计将拥有低于7微秒的延迟表现,其可能也正是英特尔方面提到的XPoint存储级内存(简称SCM)。

系统与软件转变

配合SCM,应用程序不再需要从持久性存储当中获取数据。取而代之的是将数据直接移动至XPoint之内。而这还只是XPoint作为存储级内存--或者说持久性内存--给系统及软件带来的转变之一。

其它转变包括:

• 开发能够识别持久性内存的文件系统;

• 支持存储级内存的操作系统;

• 设计新的处理器方案以使用混合型DRAM与XPoint内存。

我们也期待看到Linux对XPoint存储级内存加以支持。

微软方面目前正着手在Windows当中添加对XPoint存储级内存的支持能力。其将提供零复制访问机制并配备Direct Access Storage分卷,即DAX分卷。DAX分卷拥有将文件及应用程序映射至内存中的能力,从而保证无需经由现有IO堆栈即可实现访问。

基于磁盘驱动器时代的代码堆栈同样需要进行调整。过去缓慢的磁盘操作速度令代码执行效率显得不那么重要,但考虑到XPoint的个位数微秒级访问能力,堆栈效率将在未来成为决定最终速度的关键。

XPoint影响服务器与存储

配备XPoint的服务器将在很大程度摆脱由IO带来的束缚。其缓存机制将更具效率。使用SCM的服务器将能够在内存当中承载更为庞大的应用程序,而数据写入时间也将大幅缩短。

另外,XPoint型服务器也应该能够支持更多虚拟机或者容器,其具体数量将远高于采用XPoint NVMe SSD的服务器。

存储阵列将能够在XPoint缓存的帮助下提升响应速度,且速度水平高于XPoint SSD。预计其将采用远程直接内存访问机制配合NVMe链路,从而实现共享式XPoint直连存储。

Fusion-io公司也曾利用其PCIe闪存卡推出过存储级内存方案,但该公司规模太小,很难在操作系统层面带来SCM级别的变更。英特尔与美光联手则拥有足够的份量,而且两家公司也都充分意识到XPoint硬件及软件供应商生态系统的重要意义。

如果XPoint真的能够实现其做出的全部承诺,那么可以预见,服务器方案的整体执行效率将迎来极为显著的提升。

考虑到XPoint在初步面世后必然面临产量不足的问题,因此其它电阻式RAM(即ReRAM)技术可能也将拥有发展空间。根据我们掌握的情况,目前SanDisk与东芝正在协作探索这一领域,但尚拿不出可与XPoint相匹敌的成熟方案。

原文发布时间为:2016年04月25日

本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。

以内存级速度实现存储?XPoint正是我们的计划的更多相关文章

  1. NoSQL数据库:Redis内存使用优化与存储

    Redis常用数据类型 Redis最为常用的数据类型主要有以下五种: ●String ●Hash ●List ●Set ●Sorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Re ...

  2. C/C++程序内存的各种变量存储区域和各个区域详解

    转自 https://blog.csdn.net/jirryzhang/article/details/79518408 C语言在内存中一共分为如下几个区域,分别是: 1. 内存栈区: 存放局部变量名 ...

  3. 转:内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]

    内存区划分.内存分配.常量存储区.堆.栈.自由存储区.全局区[C++][内存管理][转载] 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放 ...

  4. C语言中float,double类型,在内存中的结构(存储方式)

    C语言中float,double类型,在内存中的结构(存储方式)从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以doubl ...

  5. 转 C/C++内存分配方式与存储区

    C/C++内存分配方式与存储区 C/C++内存分配有三种方式:[1]从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量.[2]在栈 ...

  6. @清晰掉 C++ 中的 enum 结构在内存中是怎么存储的?

     C++ 中的 enum 结构在内存中是怎么存储的? C++ C++ 中的 enum 结构在内存中是怎么存储的?里面存储的是常量值吗?   关于占用内存的大小,enum类型本身是不占内存的,编译器直接 ...

  7. C++中内存布局 以及自由存储区和堆的理解

    文章搬运自https://www.cnblogs.com/QG-whz/p/5060894.html,如有侵权请告知删除 当我问你C++的内存布局时,你大概会回答: "在C++中,内存区分为 ...

  8. 百亿级小文件存储,JuiceFS 在自动驾驶行业的最佳实践

    自动驾驶是最近几年的热门领域,专注于自动驾驶技术的创业公司.新造车企业.传统车厂都在这个领域投入了大量的资源,推动着 L4.L5 级别自动驾驶体验能尽早进入我们的日常生活. 自动驾驶技术实现的核心环节 ...

  9. Redis内存使用优化与存储

    抄自http://www.infoq.com/cn/articles/tq-redis-memory-usage-optimization-storage 本文将对Redis的常见数据类型的使用场景以 ...

随机推荐

  1. JavaScript中||和&&的运算

    一般来讲 && 运算和 | | 运算得到的结果都是 true 和 false ,但是 js 中的有点不太一样.当进行 a&&b 和 a| |b (如 1&&am ...

  2. c#声明数组

    声明二维数组时候,出现报错: string[][] dataTable; dataTable = new string[rows][cols]; 无效的秩说明符: 应为","或&q ...

  3. Android 添加键值并上报从驱动到上层

    转载:https://blog.csdn.net/weixin_43854010/article/details/94390803 Android 添加键值并上报从驱动到上层 平台 :RK3288 O ...

  4. Golang Web入门(1):自顶向下理解Http服务器

    摘要 由于Golang优秀的并发处理,很多公司使用Golang编写微服务.对于Golang来说,只需要短短几行代码就可以实现一个简单的Http服务器.加上Golang的协程,这个服务器可以拥有极高的性 ...

  5. Nuxt内导航栏的两种实现方式

    方式一 | 通过嵌套路由实现 在pages页面根据nuxt的路由规则,建立页面 1. 创建文件目录及文件 根据规则,如果要创建子路由,子路由的文件夹名字,必须和父路由名字相同 所以,我们的文件夹也为i ...

  6. Python设计模式(7)-建造者模式

    # coding=utf-8 class Report: def create_head(self): pass def create_body(self): pass class year_Repo ...

  7. 08-jmeter-plugins-manager.jar插件安装

    1.安装第三方插件:jmeter-plugins-manager 2.将此jar包下载好后放到jmeter的安装目录lib/ext文件夹内, 3.然后运行jmeter,选择菜单“选项”可见插件入口 4 ...

  8. docker安装GD扩展

    apt update #更新软件源 apt install -y libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev #安装各种库 docker-p ...

  9. Python变量详解

    Python变量详解 目录 Python变量详解 一.变量的定义 二.变量组成的三部分 2.1 变量名 2.1.1 变量名的命名规范 2.1.2 变量名的命名风格 2.2 赋值符号 2.3 变量值 三 ...

  10. 【论文研读】强化学习入门之DQN

    最近在学习斯坦福2017年秋季学期的<强化学习>课程,感兴趣的同学可以follow一下,Sergey大神的,有英文字幕,语速有点快,适合有一些基础的入门生. 今天主要总结上午看的有关DQN ...