异构内存设备
下面收集了目前用于做异构内存的设备以及他们的特点:
缩写 名称 访问方式
RDMA 通过内存总线和处理器直接相连 DDR4
PCM 变相存储器 通过内存总线和处理器直接相连
ReRAM 电阻式存储器 通过内存总线和处理器直接相连
Optane PM(3D-XPoint) 通过内存总线和处理器直接相连 DDR-T
DCPMM的一些特性只与它的内部结构和存储技术有关。因此,近期DCPMM研究得出的指南并不广泛适用于其他类型的PMEM。遵循这些指导方针可能会得到一个高度专门化的系统,该系统可以很好地与DCPMM一起工作,但与其他PMEM不兼容。为了防止这种过度专业化,认为系统设计者应该正确地理解这些特性的根本原因,以及它们如何适用于未来不同类别的PMEM。
Abstract
在过去的几十年里,DRAM(动态随机存取存储器)的性能和容量一直遵循摩尔定律,从而跟上了CPU技术的进步。然而,一个基于DRAM的系统,会因为容量、成本和电力消耗的特性受限于现代的工作量。新型非易失性存储器(Non-volatile Memory,NVM)具有传统外存系统持久性和传统内存系统字节可寻址的特点,有望实现高密度、接近零的静态能源消耗和更低的每字节成本。这篇文章对当前混合内存系统的设计进行了总结。The survey covers different aspects of the Hybrid Main Memory Design,包括系统架构、内存管理粒度、监控方法、和迁移算法。此外在抽象混合内存硬件设备的基础上,本文还总结了应用程序感知的混合内存系统,并且指出现有工作中存在的不足。
Keywords
Main Memory,Hybrid Memory,Heterogeneous Memory,Tiered Memory
Introduction
The unrelenting growth of the memory needs of emerging datacenter applications.但是随着DRAM容量增速放缓,单个DRAM容量有限,扩大容量规模需要依赖主板插槽数量的增加。而这又带来了延迟和带宽的损失。与此同时DRAM的成本也逐年上升[X 图1],这使得内存设备的TCO占到了37.1。目前新兴的非易失性主存储器技术和non-DDR memory bus technologies的出现,有效减缓了DRAM与慢速持久存储(即磁盘和SSD)间延迟与容量的差异,有希望从根本上改变存储系统的格局。
尽管新型计算有很多优势,但由于其相对较高的写入延迟、写入能耗和有限的写入持久性,它目前还不能直接替代DRAM。为了充分发挥两者在混合内存系统中的优势,在性能提升、节能降耗、磨损均衡、数据持久性等方面存在许多开放的研究问题。为了解决这些问题,近年来已经有许多关于内存层次结构的设计[xxx]和内存管理[xxx]方案的研究。这些研究成果带来了混合内存架构、操作系统和编程模型的创新,提供了丰富的思路和工具。
由于硬件技术的迅速发展,以往的综述已经不能完整的反应整个领域的现状。随着intel 傲腾持久内存从上市到停产和CXL1.0到CXL3.0功能的扩充,对混合内存研究的测重也有所不同。本文对现有工作的回顾可以帮助更清晰的了解领域的发展以及现状。读者可以将一些现有发方法和工具应用到实际生产环境中。对目前工作优点和局限性的讨论也将帮助研究人员更深入地思考。
我将从以下5个角度对现有工作进行介绍:
- 第3段介绍混合内存的系统架构,作为混合内存系统设计的基石。
- 第4段介绍了混合内存的管理粒度,大致包括以对象、数据结构、物理页、Hugepage等大小。内存管理粒度的选择影响着第5段和第6段监控方法和算法的设计。不同管理粒度各有优劣。
- 第5段介绍对混合内存中对内存对象或者页面的监控,通过监控信息辅助算法决定内存对象或者页面的调度(应该在何时位于何种内存介质中)。
- 第6段介绍内存迁移算法。
- 第7段介绍应用程序感知的混合内存系统并讨论目前此类系统存在的挑战和对今后工作的展望。
系统架构
对系统架构的讨论大致可分为两个角度和4个模式。一个角度是只考虑单个socket的情况,在这个情况下又分为分层内存、缓存、以及前两者混合的架构模式。另一种角度是讨论新加入的非CPU绑定的NUMA节点对现有NUMA架构造成的影响,一些以前设计的优化策略可能反而变得对系统有害。
分层架构
分层架构是指NVM通常作为DRAM的后备存储使用,两者构成内存的分层系统。这样做可以提供大容量的存储,同时保持DRAM的高速访问性能。但是管理复杂,为了使得分层系统的性能更接近DRAM,需要精心设计替换算法。
缓存架构设计
DRAM被用作NVM的缓存,映射部分NVM内容以提高性能。这样的管理相对简单,不必像分层系统那样做页面的迁移,利用程序局部性掩盖NVM设备延迟和带宽的劣势。但当程序有极差的局部性时,命中率不高,效果不佳。
两种架构各有利弊,为获取互补优势,一个思路是结合分层缓存的概念。即部分DRAM用作NVM缓存,同时剩余的部分DRAM作为NVM上一层的快速内存层。这样的动态设计可以更灵活使用内存以达到更高的效率,但设计实现复杂度将远远大于前面两种并且不合适的设计甚至带来更差的效果。
NUMA架构下的异构内存
在NUMA系统中,根据页的物理地址映射决定将页放置在哪个节点上,以优化访问延迟。但混合内存系统中,由于NVM和DRAM的访问延迟差异很大,页放置位置的选择会更加复杂,需要考虑区分页的访问特性来决定放置在NVM还是DRAM上。混合内存的加入使得NUMA系统的页管理面临更大的挑战。需要更聪明地区分页的特征,动态地在内存层级之间迁移,以发挥多层内存体系结构应有的优势。
但是目前对于NUMA架构的研究和单个socket的研究是相隔离的,单个socket策略必然会对整个NUMA策略产生影响。
管理粒度
在x86指令集架构下的系统默认的管理粒度是4KB也就是Page结构体的大小。然而一些研究者们发现采用更大或者更小的管理粒度对于混合内存系统而言可以取得更好的性能收益。
当内存变得很大之后,TLB很小缓存的地址转换的条目相对覆盖率就低了,地址转换的开销增大。转换开销主要是由于TLB未命中时缓慢的page table walk造成的。TLB的命中速度很快,但page table walk可能需要四次内存访问才能查询分层页表。较新的处理器由于采用了更深的页表结构,需要多达五次内存访问。大页面通过两种方式减少转换开销。1.由于大页面的单个条目映射了更大的地址范围,因此可以通过增加TLB覆盖率来降低TLB未命中的频率。2.通过减少需要访问的页表级数,加快单个walk速度。
但是使用大页面往往容易造成内存膨胀和内存碎片,同时不恰当的迁移大页面带来的开销也容易使得系统开销超过地址转换的开销节省。比如每个页面中的热数据只占应用程序总内存足迹的一小部分,但却导致了应用程序总内存引用的很大比例。所以也有些工作提出了如何在适当的时候拆分大页面以及只在较慢的内存层使用大页面。
一些研究者发现一部分应用对象在不同的执行阶段表现出高度突变的内存访问频率。很大一部分的应用程序的对象都比页小得多同时显示出较长的生命周期。因此他们在编译阶段对程序代码进行分析,提前预估访问模式,决定内存应该从哪种内存介质被分配。在程序动态运行时,依据前一阶段的访问模式对后一阶段进行对象粒度的迁移,节约迁移成本。但是这样的做法依赖于源码,也就是说没有源码的情况下很难通过修改的编译器去提前捕获程序的特征。
内存监控
对对象粒度的访问频繁程度统计主要由运行时被指向的指针做分析。而对于物理页面大致分成以下3种方法来监控热页面。
缺页异常时将页面进行迁移或者收集数据,但是缺页异常在程序执行的关键路径上,此时再去执行其他的操作很容易产生更高的延迟。
基于页表的页面扫描,在虚拟地址和物理地址转换的过程中会使用页表,页表上有一个A位的访问位,每次页面被访问后都会置位。通过定期扫描页表,扫描后再清空置位来搜集页面访问信息。但是对页表的扫描间隔、扫描的采样粒度会影响CPU开销以及准确度。
基于硬件的采样,不同设备都会有硬件计数器PMU以及PEBS,这些采样时可以记录物理地址和pid等信息,也会随着采样粒度更小而开销更大。除此之外,如果硬件设备更换,它的性能监控计数器(PMC)的寄存器地址可能会有变化。这时需要重新查看新硬件的编程手册,确定PMC寄存器的新地址,然后修改软件程序中的寄存器访问代码,将其映射到新的地址上。
迁移算法
页面迁移算法各种各样,很难将他们分类为不同类别。比较常见的是根据上次是否被访问或者某段时间被访问的次数进行迁移。目前Linux内核二次机会LRU链表就是依据此进行的页面回收。基于默认的单层内存,人们很容易想到在两层内存层种都使用LRU链表。确实有大部分工作基于LRU链表做出改进,并且也取得了显著的效果,比如图4通过在底层增加一个链表使得局部性更好的被保留,系统吞吐量相比于不做迁移最高提升接近2.5倍。但是如果缺少时间局部性,或者被记录的时间不够就不能了解这个页面很长一段时间的访问历史。想要捕获页面的访问历史,目前的方法还比较局限。
还有的方法通过设置一个阈值来表示页面到底是冷的或者是热的。固定阈值可能的缺陷是在不同时刻定义的热页面多于DRAM(即高性能但有限的快速内存)或者热页面远远小于DRAM,这使得很多不同程度冷的页面也混合到了快速内存层,这就产生了无效的页面分类。为了避免出现以上情况,最近的研究采用了动态阈值的方式,将页面依照实际系统DRAM量分为不同程度的冷热页面,由于提高了DRAM层的利用效率,整个性能也获得不错提升。
但其实使用的方法真没法分类,太多了都是依据各自要解决的问题为出发点设计的。
应用程序感知
设计应用程序感知的混合系统一个前提在于服务器运行同一种或者某几种特定的工作负载。这些工作都尝试从一些关键视角入手,比如工作负载和应用特征、数据本地化、内存访问模式等,在混合内存系统上进行数据放置、任务 Mapping 和内存访问优化,以期获得更好的性能。
考虑特定工作负载特征,进行负载均衡感知的数据放置。如Merchandiser提出了面向任务并行HPC应用的混合内存数据放置方法,可以提高负载均衡。Liu分析内存访问相似性,改进不规则应用在分布式系统上的性能。Wang根据应用适合的线程数以及内存层优化了HPC程序的数据放置。 HNgraph在NUMA系统中进行图处理任务的数据和任务放置优化。
在云数据中心规模下,提供透明的内存卸载机制,以充分利用混合内存系统。Google和Meta分别从系统架构和数据中心视角探讨了这一问题。
引用
:tear: 可以在笔者的英文综述里对照,不想放了30+篇