1. 论文信息
- 文章来自IEEE International Symposium on High-Performance Computer Architecture, (HPCA), 2022
- MULTI-CLOCK: Dynamic Tiering for Hybrid Memory Systems
所有作者及单位
- Adnan Maruf, 佛罗里达国际大学(FIU)奈特基金会计算与信息科学学院
- Ashikee Ghosh, 佛罗里达国际大学(FIU)奈特基金会计算与信息科学学院
- Janki Bhimani, 佛罗里达国际大学(FIU)奈特基金会计算与信息科学学院
- Daniel Campello, Google
- Andy Rudoff, 英特尔公司
- Raju Rangaswami, 佛罗里达国际大学(FIU)奈特基金会计算与信息科学学院
2. Background
将PM作为第二级内存直接暴露给CPU是目前比较有希望的一个做法:如何把数据在正确时间放入正确分层中去。于是面临一个是大家关注的问题。
3. 解决了什么问题
动机:通过四个工作负载,统计归类50个采样页面的访问模式,得出层级友好页面是需要迁移的对象(空间局部性)。
同时一段时间访问过的页面在下一段时间被访问概率也很大(时间局部性)
然后说明了用frequency&recency识别到的页面也具有层级友好的特征。相比于静态分层,说明了动态分层的必要。最后把整个比较模糊的大问题转化为:试图解决分层系统中:如何根据frequency&recency来识别升级的热点页?如何在内核中设计一个简单、低开销而又高效的系统?
4. 其他学者解决这个问题的思路和缺陷
这些都是分层技术上的对比:
静态分层即一个内存页一旦被映射到一个分层,在其生命周期内就不会被重新分配到不同的分层。
[11]Nimble:只根据recency来选择页面,这篇的作者为了解决frequency决定把工作负载执行期分为观察窗口和性能窗口。得出观察窗口频率高的,在性能窗口概率也高。专注于透明大页(THP)迁移。应用程序需要通过Nimble的启动器运行以利用其页面迁移技术。MC在内置内核实现的功能。Nimble需要一个额外的启动器来运行内核上的任何工作负载。
[12]AutoTieringhint page fault的缺页异常来跟踪页面访问,并使用recency来识别热点页进行升级。尽管缺页异常可以提供高准确度的页面访问跟踪,但跟踪所有页面的成本很高,因为每一个页面故障都必须在访问页面之前进行处理。这是因为基于缺页的软件页面访问跟踪成本很高,而且跟踪页面历史位以识别冷页面的开销也很大。所以在后面工作负载测试中表现很差。
[19]Thermostat源代码不可用没有评估,通过poisoning页表项(PTE)和触发缺页异常来跟踪巨大的页面,并将冷页面迁移到较低的内存层。
[22]AMP(非统一内存访问架构NUMA,主板会分成不同的插槽,每一个插槽一组cpu,以及和这组cpu离得近的内存。)这在两个插座的NUMA机器中是不现实的,因为每个节点通常有自己的DRAM、PM和CPU。AMP使用一个节点,只用于DRAM的分配,其他节点只用于PM的分配。AMP是在Linux内核4.15版本上实现的,它不支持所需的KMEM DAX驱动(从内核v5.1开始提供),以便PM作为主内存在分层系统中使用。AMP的核心设计原则要求它扫描和剖析来自DRAM和PM层的所有内存页,这在实际系统的内核中是不现实的,因为在我们评估的工作负载中,内存页的数量可以增长到数亿。
对比于PM当前这款硬件的两种用法。
[7]Memory-mode:数据不能持久化,dram作为缓存不透明。缓存是需要从高层获取数据的,而这里提出的分层是两层都能被直接访问的。
[44]对象级需要改变应用程序API,而内核级别的修改不需要应用程序有何变化。
[32]提出了一种有效使用持久性内存作为NUMA节点的设计。这个分层设计同时意识到了DRAM和PM节点 ,并且只通过NUMA平衡处理匿名页面的升级/移动。
[33-36]不需要硬件,而且都是主存没有缓冲。
5. 围绕该问题作者如何构建解决思路
设计MULTI-CLOCK的主要假设是,最近被访问过一次以上的页面,在不久的将来更有可能被访问。
具体升级降级要求门槛就是那张图。(但是频繁程度不够吧?)及时更新页面引用状态的方式根据对内存页的访问模式不同而不同。无监督式:CPU在进程的页表入口中设置的页面引用位。
与CLOCK类似,升级是由每次系统守护程序kpromoted去完成的。它定期被唤醒,以扫描列表,更新它们,并将最近由无监督访问产生的升级列表中页迁移到更高层的页。
降级机制基于今天的虚拟内存系统中的页面驱逐技术。当内存达到内存压力时(该层与系统总内存量来计算)会去扫描每个列表。活动列表中的页面相对于非活动列表的比例超过了一个与该层可用内存量相关的阈值时,那么在活动列表中没有被标记为引用的页面将被移至非活动列表。最后,非活动列表被扫描,以寻找未被标记为引用的页面,并将其迁移到较低的层级。当没有更低层级列表可以迁移,就写回块存储。
6. 从结果看,作者如何有力证明他解决了问题
评估的目的是确定MULTI-CLOCK是否、何时以及如何能够提高应用工作负载的性能。
使用雅虎云服务基准(YCSB)[13]的六个不同的工作负载和GAP基准套件(GAPBS) [14] 的六个工作负载来讨论我们的结果。Memcached[3],一个使用大量主内存来维护其数据的内存缓存服务,作为YCSB的键值存储后端。 配置时内存要被全部消耗,并且消耗一部分PM。
MULTI-CLOCk在所有YSCB工作负载上都优于静态分层、Nimble、AT-CPM和AT-OPM。对GAPBS的执行时间也比其他方案减少。
分析了MULT-CLOCK和Nimble所升级的页面数量。MULTI-CLOCK每次扫描平均升级758页,最多扫描1024。而N是把1024作为固定值。如果那些将来不会再被重新访问的页面被提升到DRAM中,那么提升这些页面的开销会损害系统性能。第二次再次被访问的百分比比N高15%
实现了目标,低开销,特别是密集型应用。
7. 缺陷和改进思路
- 能耗方面摘要提了一下,后面也没说呀。
- 作者源码有一些问题,在运行高性能计算用MIP的时候会内核崩溃。
- 后面的性能评估对比了几种相关的工作,但是选择的workload也是比较局限的,GAPBS的论文都没有正式发出来。
8. 创新点
- 在内核上修改代码,不需要其他程序有什么修改。
- 使用升级列表和频率可以很好的利用层级友好页面的局部性。
9. 相关链接
- 作者公布的源码
- ndctl用户手册
- PM的AD模式下的kmem模式设置
- YCSB工作负载源码
- YCSB介绍与相关运行配置介绍
- ndctl下的daxctl安装源码下载
- 持久内存开发资料汇总
- Linux驱动编程中EXPORT_SYMBOL介绍(因为作者公布的源码里有这个报错)
- daxctl fails to reconfigure to system-ram when DAX modules built-in
- 持久内存配置简介,快速入门
- GAPBS工作负载下载和使用
10. 积累
当使用PM作为主存储器时,其持久性能力变得无关紧要(这里作者遵循原先的主存的设计,即易失性,抛弃了NVM数据持久的特点,后面提到的该产品Memory Mode,并且文献[10]说PMEP想要持久性靠的是clflush
指令,这个指令由于要排序开销很大),从而完全避免了其最大的性能开销[10]
有开源内核好像有一个选项可以计数随时间变化页面在层级间迁移的数量。