Pre-research report

对于NVRAM+DRAM混合内存,我认为分成两个部分,即

  • NVRAM和DRAM之间的关系
  • 将NVRAM作为主存的策略。
    接着详细说明每部分

NVRAM和DRAM之间的关系:

我看到的几篇文献,几乎都是将DRAM作为NVRAM的cache来使用,这里又有两种方式:

  • 将一些需要经常查找的数据放到DRAM中,以及预留一些free list用于加速访问。
  • 将DRAM作为系统的L4Cache,而NVRAM作为系统的主存。

我个人比较偏向后一种。这里尽管将DRAM作为L4Cache,但是和Dram-Based System中的cache 不同,这里的DRAM和NVRAM属于同一层级,系统可以直接访问NVRAM(DAX(Direct Access)&XIP(eXecute In Place))。

而直接套用已有的cache系统有如下问题:

  • 使用效率较高的set-associate cache策略会导致一次访存操作两次访问DRAM(由于tag体积较大,无法放入SRAM中),使用direct-mapped cache 策略则会造成cache hit rate较低。
  • NVRAM和DRAM之间的带宽宝贵,频繁的拷贝数据会导致带宽被占满,影响系统性能。

参考文献加上个人思考,我有以下的想法

  • 前提
    • 粒度 NVRAM:4KB,DRAM 64B
  • 分层cache,将DRAM 分成两部分
    • 3/4 -> 作为Direct mapped cache(1st level)
    • 1/4 -> 作为set-associate cache (2nd level)
    • 提供tag cache,以2nd level cache 访存
    • 提供hot data map,以减少DRAM和NVRAM之间的数据拷贝。
      数据访问流程见下图:
混合内存访问流程图

其中有几点需要额外说明的:

  • Tag cache 和 hot data table由于entry较少,占用储存空间较小,可以放在Sram上。其设计目的是为了提高访问2nd Dram cache的性能
  • 访问first-level cache miss的时候,将其move进second-level cache中,而不是放到NVRAM中
  • 访问second-level cache hit的时候,不将其移动进first-level cache,而更新tag cache的内容。
  • 在first和second level cache都Miss的情况下,访问NVM,每次访问都会更新hot table,只有访问频率大于threshold的页才会被移入DRAM中
  • 实行动态threshold,在DRAM空间较多以及Cache Hit rate 较低的时候,降低Threshold。在内存带宽占用较高的时候,提高Threshold。

DRAM和NVRAM的位置确定之后,这个问题演变成了用NVRAM来做主存。接着分析第二点:

将NVRAM作为主存的挑战

直接替换DRAM为NVRAM会出现的问题:

  • 原子读写
  • 现有系统乱序访存指令。
  • 断电导致的数据部分写入,重新上电之后数据不一致。
  • NVRAM读写性能不对称。
  • NVRAM写寿命限制

下面是我目前看到的文献对上述问题的解决方案:

  • 原子读写
    • 加电容是一种十分简单且有效的方法,可以保证64B的原子写。
  • 现有系统乱序访存指令
    • Clflushopt(cache line flush opt version),clwb(cache line write back),PCOMMIT(make data store in NVM persistently). 这几个指令配合使用可以使得访存指令不乱序。
    • 通过软件设立一些epoch,每个epoch内访存指令可以乱序,但是其对结果不产生影响,epoch之间保证一定是顺序的。
  • 断电导致的数据不一致
    • 传统方法有journal和shadow paging,但是其都有着性能较低的问题
    • MS提出的short-circuit shadow paging,利用了NVRAM的byte address属性,很好的降低了传统shadow paging的cascade update的性能损耗。并且实现起来相对简单。
    • NOVA内存文件系统采用了log-struct + light journal 来保证数据的一致性。利用NVRAM的byte address和random access较快的特点提高性能。
      • 对元数据的修改,原子操作就可以进行
      • 对单个节点的修改,因为对每个inode都采用了log结构,同样可以通过原子操作来修改
      • 对多个节点的修改,通过journal来实现
      • 依赖严格的顺序写来提供原子性。
  • NVRAM读写性能不对称
    • 华中科大在OSDI18上提出了level hash的策略来保证写优化和数据一致性
    • 其在每个bucket中加入指示位,只有指示位为1的时候数据有效,每次更新数据时最后更新指示位,这样保证了一致性
      • 修改数据采用类似log-struct FS的方法,在后面插入而不是原地更新
    • 其提供了层次hash的方法,并且采取双映射。且在每个bucket中设置4个slot,最大程度降低collision的可能。
    • 提出了一种很好的resize hash table的方法。降低resize时的数据拷贝
  • NVRAM写寿命
    • 这一点部分paper中提到PCM固件自身就已经带读写平衡
    • 可以参考SSD的FTL的思想,做一个地址映射和内部数据迁移

我的想法
显然level hash的方法很诱人,也是我认为最好的方法,但是其实现难度较高,原文中也说相应领域的探索较少。对初学者的我来说,不是很好的选择。而MS提出的BPFS,其short-circuit shadow paging提出时间较早,很多论文也cite了它。说明也是一种很好的解决方法。并且树类型文件系统也较容易实现。因此:

  • 对Write Reorder问题,可以采用Intel的新指令来解决。很多Paper都采取这一解决方法。
  • 对保持一致性这方面,套用BPFS的short-circuit shadow paging 方案。
  • 对读写优化以及磨损平衡,则暂时不考虑。

问题

  • 传统的内存管理机制是用页表+Link list 来解决。用树结构来管理内存,不知道其可操作性是不是现在的我能carry的。
  • 没有看simulator的使用,因为每个simulator都包含大量文档,不知道实验室有没有已经熟悉的simulator,可以更快的上手。
  • 上述思路基本上都是看到的一些paper优点的集合,自己创新的东西不多。
  • 针对老师所说metadata过大,您发的文献加上我自己搜的都没有对这个问题的讨论(可能是我没看全)。相关文献大都讨论架构优化和数据一致性的问题,这里我也是按着这两点来提出自己的思路。

你可能感兴趣的:(Pre-research report)