1. 论文信息
- 文章来自ACM Symposium on Operating Systems Principles, (SOSP), 2023
- Memtis: Efficient Memory Tiering with Dynamic Page Classification and Page Size Determination
所有作者及单位
- ATaehyung Lee, Young Ik Eom,(韩国)成均馆大学(SKKU)
- Sumit Kumar Monga,弗吉尼亚理工大学(六所提供预备役军官训练团项目的美国高等军事院校之一)
- Changwoo Min,Igalia公司(Open Source Consultancy and Development)
2. 其他学者解决这个问题的思路和缺陷
以前做分层内存主要考虑2点:1.怎么样去监控目前有哪些页面是热页面,因为热页面会随着时间而产生改变,同时局部性也不一定有效。2.什么时候什么办法将热/冷页面迁移到它该在的地方。
以前大家的方法基本分成以下3种来监控热页面:
- 缺页异常时将页面进行迁移或者收集数据,但是缺页异常在程序执行的关键路径上,此时再去执行其他的操作很容易产生更高的延迟。
- 基于页表的页面扫描,在虚拟地址和物理地址转换的过程中会使用页表,页表上有一个A位的访问位,每次页面被访问后都会置位。通过定期扫描页表,扫描后再清空置位来搜集页面访问信息。但是如下图所示,你对页表的扫描间隔、扫描的采样粒度会影响CPU开销以及准确度。
- 基于硬件的采样,不同设备都会有硬件计数器PMU以及PEBS,这些采样时可以记录物理地址和pid等信息,也会随着采样粒度更小而开销更大。除此之外,如果硬件设备更换,它的性能监控计数器(PMC)的寄存器地址可能会有变化。这时需要重新查看新硬件的编程手册,确定PMC寄存器的新地址,然后修改软件程序中的寄存器访问代码,将其映射到新的地址上。
页面放置也可以大致分为3种类型:
- 最近访问的页面,这依赖于时间局部性,但是它往往被记录的时间不够就不能了解这个页面很长一段时间的访问历史。
- 想要捕获页面的访问历史,目前的方法还比较局限,大家会设计位图或者一定的数据结构去记录,或者干脆是改进LRU.
- 还有的方法通过设置一个阈值来表示页面到底是冷的或者是热的,这就会容易出现如下图的情况,不同工作负载运行在上面,但是他们在不同时刻你定义的热要么多于DRAM(我们高性能但有限的快速内存,要么远远少于DRAM),这使得很多不同程度冷的页面也混合到了快速内存层,这就产生了无效的页面分类。
另外一点是地址转换的开销,当内存变得很大之后,TLB很小缓存的地址转换的条目相对覆盖率就低了。转换开销主要是由于TLB未命中时缓慢的page table walk造成的。TLB的命中速度很快,但page table walk可能需要四次内存访问才能查询分层页表。较新的处理器由于采用了更深的页表结构,需要多达五次内存访问。大页面通过两种方式减少转换开销。1.由于大页面的单个条目映射了更大的地址范围,因此可以通过增加TLB覆盖率来降低TLB未命中的频率。2.通过减少需要访问的页表级数,加快单个walk速度。
但是大家在使用大页面的时候往往一个大页面只有很小一部分小页面被访问,迁移大页面又必须承受昂贵的开销。比如下图横坐标是0到511,每个点代表一个大页面,(a)右上角的点表示一个大页中机会所有的小页面都被访问到了,同时这个大页总的被访问次数也很大。最坏的情况是(b)的右上角,那些大页面只有很少的小页面被访问,同时整体访问频率又很高,不如放它们做小页面单飞更好。
事实上笔者自己在测这个地址转换开销的时候,并没有发现会大到哪里去,也可能是我打开方式不对
3. 解决了什么问题
The biggest limitation of prior systems (tiered memory systems) is their inability to effectively classify page hotness across diverse memory configurations and workloads.
4. 围绕该问题作者如何构建解决思路
先放一个总体设计图,还是那几步,采样页面信息、分析、然后迁移。多了对于大页面的分析,分析大页面被拆分的好处。
PEBS采样的好处就是可以直接区分目前的地址是被当作小页还是大页了。同时这里硬件采样只采样了两个指令(事件),就还好一般不会找不到映射。这个后台线程根据单核CPU性能的3%控制采样的间隔。
为了平衡小页和大页记录热度的不公平(毕竟大页大一点被访问的概率也大一些),作者设计了热度因子。主要笔者觉得非常棒的点在于这种zipf分布的直方图,符合访问到热度分布,然后又将页面热度做了很多分层,适合不同的快速层内存容量。
设计冷热阈值是根据系统目前DRAM的含量来做的,从值最大的bin开始加,一直到装满DRAM则前一个bin就是热阈值,后面就是温阈值,由于温阈值只是作为热页面候选页,所以冷阈值就直接-1得到,只给温页面一个bin。不太理解为啥只给一个bin,这显得这个阈值一点也不动态,其实可能根本不需要这个T阈值,应该可以做出更灵活的方法同时如果热的bins加上最后一个bin马上就满了,那么选择不要最后那个bin了,给页面动态迁移留出空间。
笔者以前也想过这个问题,我收集了一批又一批数据,可是现有的热度会变啊,我以前的数据怎么办呢?这里作者将他们以到后一个bin做变冷的处理,很简单机智。同时页面迁移交给采样线程和迁移线程来做,做的时机就是采样和冷处理后。
最后是设计了大页面的拆分,绿色部分是收益,我们可以从箭头看到,白色直方图统计大页和小页,灰色直方图只统计小页,那么之间的差值就是如果他不是大页,那么热的bin还会增加多少。差值越大说明越不该用大页。于是设计了一个拆分大页面的阈值。
5. 从结果看,作者如何有力证明他解决了问题
作者实验环境:
- DRAM + NVM (Optane DCPMM, load: 300ns)
- DRAM + emulated CXL memory (cross NUMA DRAM with increased latency, load: 177ns)
- A single socket for our evaluations to avoid NUMA effects
- The ratio of fast to capacity tier memory size as 1:2, 1:8, and 1:16(In the 1:2 configuration, the fast tier size is set to 33% (1/3) of the resident set size (RSS) while in the 1:16 configuration, it is reduced to 5.9%(1/17).)
性能评估图显示好于7个分层内存,他们大多都发表于A类。
6. 缺陷和改进思路
在分层中使用混合页面的工作比较少,主要在于大页面带来的内存膨胀、内存碎片等问题,解决这些问题可能比使用大页面节省的开销更多。这篇工作只讨论拆分大页面,没有启用大页面的设计。同时在使用大页面的评估方面,还有好多前人的工作没讨论到。
采样时CPU的消耗、直方图的数目、计算阈值时的α、直方图的降温周期、页面拆分的参数β,对于参数敏感性的评估不充分。
作者好像没说清楚他每个数据是怎么存的?就是怎么做到知道哪个页面当前在哪个bin的,因为你迁移的时候需要用到,你拆分大页面的时候也需要用到。
7. 创新点
对现有的分层内存系统进行了比较全面的分析和总结。
Memtis的设计解决了作者发现的一个问题,即目前热页面采样不准确开销大、迁移并没有完全发挥DRAM效率。在不考虑大页面的情况下,Memtis相比于其他工作是有明显的优势的。
8. 积累
- 性能评估那张图可以多看看,和自己的工作看有没有出入。
- 性能评估分类比较完整的,workload可以借鉴借鉴。
- 开源