原文来自微信公众号“编程语言Lab”:语言运行时的混合内存支持
搜索关注 “编程语言Lab”公众号(HW-PLLab)获取更多技术内容!
欢迎加入 编程语言社区 SIG-Runtime 参与交流讨论(加入方式:添加文末小助手微信,备注“加入SIG-Runtime”)。
作者 | 吴明瑜
编辑 | Hana
声明:本文档中的所有观点仅代表个人观点,不代表所在研究机构立场
作者简介
大家好,我是吴明瑜,是上海交通大学的老师,我的主要研究兴趣为操作系统和语言运行时,我所在的实验室是并行与分布式系统研究所。我的研究工作更偏系统一些,因为语言运行时本身是一个程序语言和系统的交叉领域。今天带来的分享会更偏系统方面,主要关注如何为语言运行时提供混合内存支持。
个人主页:https://ipads.se.sjtu.edu.cn/zh/pub/members/mingyu_wu/
并行与分布式系统研究所:https://ipads.se.sjtu.edu.cn/zh/index.html
视频回顾
SIG-Runtime技术沙龙回顾|语言运行时的混合内存支持
NVM 简介
由于近年来硬件设备的进步 —— 非易失内存 (Non-Volatile Memory, NVM),使得业界对 混合内存 的概念越来越关注。
那什么是非易失内存 (NVM) 呢?
简单来讲,NVM 相当于一个普通内存的持久化。
NVM 既有 DRAM 的字节可寻址 (可以一个 byte 一个 byte 地去选址) ,也有 DRAM 的访存速度 (NVM 的访存速度基本上来说和 DRAM 差不了多少,现在测出来的数据就两三倍,大概是这么一个差别) 。
除此之外,NVM 还结合了传统存储 (比如我们常用的机械硬盘,固态硬盘) 持久化的特性,你写到 NVM 设备上的内容是持久化的,掉电重启后还可以读到。另一个优势和存储也有点像,即 NVM 的容量是比较大的。现在我们能买到的 NVM 设备,最小的都是 128G,当然还有更大的。
以上是 NVM 的一些优点。NVM 其实已经发展了好些年了,只是在更早的时候,比如上世纪 90 年代,或者是 21 世纪初,那时候没有这样的设备,但大家有一些构想。
最近一些年,有人做了 DRAM 和 SSD 配合的一个早期的 NVM 设备,其实就是在普通内存上挂一个后台的固态硬盘,再加一个电容。当你关机或者掉电后,电容会发挥作用,暂时供电。这个过程里,我们会将 DRAM 的数据都写到 SSD 上。所以在那个时候你将这个设备关机,就可以看到内存系统这边会亮灯,然后就开始向 SSD 写数据。
近些年,新介质在逐渐成熟。英特尔在 2015 年宣布了一种 NVM 技术 —— 3D XPoint 1,并且在这个技术上构建了新的 NVM 设备。该设备已经商用 (Intel Optane)。
NVM 可以替代 DRAM 吗
这样的 NVM 设备是否可以用来代替原本的普通内存 (DRAM) 呢?
个人认为,虽然 NVM 有很多优点,但至少现在还是不会代替 DRAM 的,因为与 DRAM 比,NVM 还是有不少缺陷的。
首先,NVM 的访存速度还是略逊于 DRAM,NVM 的带宽也比较小,持久性也会差一些 (更容易写坏) 。在此前提下,NVM 的成本也并没有得到很好的控制。在 NVM 出现后的早期,大家希望可以替代 DRAM 从而降低成本,可是目前的情况来看,成本并没有太大差别。
Device | Capacity | Price | Price per GB |
---|---|---|---|
Optane DCPM | 128GB | $633.22 | 4.94 |
Kingston FURY KF426S16IB/32 |
32GB | $163.99 | 5.12 |
目前来看,NVM 想要完成替代还需要一段时间。因此,大家在尝试一个更加实用的选择,即去构建一个 混合内存子系统。简单来说就是把 DRAM 和 NVM 放在一起,做成一个混合内存的架构。
如上图示,这样的混合架构有两个特征,一是用了 NVM 后整个内存的容量大大提高,此外 NVM 还提供了持久化的保证,至少我们将数据从 DRAM 写到 NVM 这块空间之后,我们的数据是有持久化的保证。这是目前大家认为比较主流的一种方法,可以给系统或者服务器提供一个混合内存的架构支持。
语言运行时 & 混合内存
那么,语言的运行时 (比如 JVM,或者 Python,JavaScript,Go 等语言都) 可以去尝试使用混合内存的架构。
对于 JVM 来说,混合内存架构可能是利好的,这是因为目前很多内存密集型应用或是使用 Java 编写的,或是在 JVM 上运行的。Apache 生态下有很多堆内存需求较大的应用,比如 Hadoop,Spark,Flink 等。以 Spark 为例,Spark 的标识就是 in-memory computing 的框架,专门提供一些内存缓存机制从而将数据缓存在内存里,应用会吃掉很多内存。这种情况下,用混合内存其实是一个比较利好的方式。过去可能一台机器放不下的数据,有了 NVM 后,就可以直接放下了。
另一方面,持久化的特性也是可以发挥作用的,尤其对于以前的内存数据库 (