论文阅读:Memtis: Efficient Memory Tiering with Dynamic Page Classification and Page Size Determination

来源: SOSP 2023

摘要

数据中心工作负载推动的不断填筑的内存需求是新型内存技术创新的驱动力。而分层内存是一种有前景的解决方案,它利用具有不同容量、延迟和成本特性的多种内存类型,以在满足内存需求的同时降低服务器硬件成本。

以往关于内存分层的研究往往做出次优(通常是有问题的)页面放置决策,因为它们依赖于各种启发式方法和静态阈值,而没有考虑整体内存访问分布。此外,由于大页面内的访问倾斜,决定应用程序的适当页面大小也很困难,因为大页面并不总是有益的。

作者提出了Memtis,这是一个分层内存系统,它采用明智的决策方法来进行页面放置和页面大小确定。Memtis利用已分配页面的访问分布来优化快速层容量的热数据集近似。此外,Memtis通过检测快速层内存的低效使用并在必要时进行分割,动态确定页面大小,使应用程序能够使用大页面同时避免其缺点。

评估显示:Memtis 的性能比最先进的分层系统高出最多 169%,比最好的系统高出最多 33.6%。

正文

背影与介绍

由于DRAM 技术的扩展限制,主内存对应用程序性能与服务器成本有显著的影响。而现有的内存结构无法与当前对内存需求的增长进行匹配。

而非 DRAM 内存技术,比如 NVM 与 CXL 的进步为解决这一问题提供了新的机会。而现有的内存类型分层技术有着较高的访问延迟和大内存应用较高的地址转换成本。这很有可能会显著的降低性能。所以,理想的分层内存系统应该:

  1. 将合适的数据放在合适的位置。
  2. 减轻地址转换成本,从来最大程序的减少高容量分层内存的性能下降。

理想的分层内存系统应将经常访问的热页放在快速层内存(如本地DRAM)中,而将冷页放在容量层内存(如NVM、CXL连接的内存)中。但是,先前系统的最大局限性在于无法在不同内存配置和工作负载中有效地分类页面热度。它们依赖各种启发式方法和/或预先配置的阈值来识别热页。结果,识别出的热页数量往往小于或大于快速层容量,因此无法将最热的页面放置在快速层内存中。

使用大页是减少地址转换开销和增加TLB覆盖范围的标准做法。然而,在分层内存系统中,使用大页可能会浪费宝贵的快速层内存。

作者发现,大页中并非所有子页都同样热。对于某些工作负载,一些子页很少被访问或根本不被访问。如果整个大页由于其几个非常热的子页而被提升到快速层,那么很少或根本不访问的子页所占用的快速层内存空间就会被浪费。在这种情况下,将这种高度倾斜的大页拆分并只将热子页提升到快速层会更有益。在分层内存系统中,没有一刀切的页面大小。

作者提出了 Memtis,这是第一个在有限 CPU 开销内同时实现基于访问分布的页面旋转和基于倾斜度感知的页面大小确定的分层内存系统。

为了最大限度地利用快速层内存,Memtis通过考虑页面的整体访问频率分布,动态确定页面是热、温还是冷。Memtis使用页面访问直方图收集分布信息,CPU开销(❤️%)和内存开销(<0.195%)可以忽略不计。然后,它动态决定热、温和冷页面的阈值,并将页面放置在适当的内存层中。

Memtis自动平衡内存访问成本和地址转换成本。为了决定页面大小,Memtis考虑了大页中子页的访问频率。默认情况下,Memtis使用大页来减少地址转换成本。然而,如果大页中只有一小部分子页被频繁访问(即高度倾斜的大页),从而掩盖了快速层的访问优势并浪费宝贵的快速层内存,Memtis会将这样的大页拆分成多个基本页,并只将热子页迁移到快速层。(由于这种大页拆分是一种涉及数据复制和TLB射击的昂贵操作,Memtis会仔细估算最大收益,并仅根据估算的收益拆分最倾斜、最热的大页。)

此外,Memtis可以使用处理器事件采样(Intel PEBS)跟踪细粒度的子页级内存访问。为了避免采样方法的过高CPU开销,作者提出了一种动态调整内存访问采样间隔的技术。

最后,所有Memtis操作 - 内存访问跟踪、页面迁移和大页拆分/合并 - 都在后台异步执行,因此Memtis永远不会减慢关键路径。

贡献

  1. 作者发现:
    1. 热度检测不够理想,导致大部分快速层内存包含非最热页面
    2. 大页内子页的访问频率通常高度倾斜,因此很少访问的子页浪费了宝贵的快速层内存
  2. 提出了 Memtis,这是第一个在有限CPU(❤️%)和内存(<0.195%)开销内解决上述问题的分层内存系统。Memtis利用页面访问分布做出最佳分层决策,并根据大页的子页访问倾斜度动态选择页面大小。
  3. 评估:使用 8 个代表性的应用,将 Memtis 与最先进的 6 个系统进行比较,同时改变快速层和容量层的比例,Memtis 平均优于其他系统 33.6%。同时,通过基于倾斜度动态拆分大页,Memtis 实现了高达 19.9%的性能提升,并将内存膨胀减少了高达 45.4%

分层系统的分析

作者从跟踪内存访问,决定页面放置位置,缓解地址转换开销三个方面,对当时分层系统进行了全面的分析。

并得出以下三个结论:

  1. 使用页面故障跟踪内存访问会在关键路径上产生高延迟。此外,基于页表的方法在空间(即大页面)和时间(即扫描间隔)维度上都是粗粒度的,提供不准确的访问跟踪。另一方面,基于事件的内存访问采样(如Intel PEBS)报告确切的访问地址,但其开销随采样频率的增加而成比例增加。因此,对于允许细粒度访问监控(如子页面访问)并能很好地扩展到大内存大小的分层内存系统来说,高效和准确的内存访问跟踪至关重要。
  2. 为了实现最佳页面放置,分层内存系统应使用准确的热度指标,并根据工作负载特征和内存配置(例如,快速层容量)调整热度标准。此外,它应该在关键路径之外(不在页面故障处理程序中)迁移页面,以最小化额外的延迟。
  3. 单一页面大小无法适用于所有情况。分层内存系统应该根据页面热度和大页面利用率动态决定适当的页面大小。要实现这一点,细粒度的访问跟踪至关重要。

Memtis 的设计

对于细粒度,轻量级的访问跟踪

Memtis 使用 PEBS 对内存访问进行采样。由于其包含精确的内存地址,Memtis 可以支持细粒度的访问跟踪,而不管操作系统页面大小如何。Ksampled 是一个由 Memtis 的内核后台线程,用于处理采样地址并更新两个不同直方图中的内存访问统计数据:页面访问直方图和模拟基本页面直方图。Memtis 可以动态调整内存访问采样频率,以确保其 cpu 开销低于阈值(3%)。

Memtis 维护内存页面的热度,利用率和偏斜度。计算所有页面类型(基本页面,大页面,大页面中的子页面)的热度,相比之下,利用率和偏斜度仅为大页面维护。

热度表示使用页面访问计数的指数移动平均值(EMA)的访问趋势。页面 i 的热度因子 HiH_iHi 由页面的访问计数 CiC_iCi 和页面类型定义如下:

Hi={Ci,if page i is a huge pageCi×nr_subpages,if page i is a base page H_i = \begin{cases} C_i, & \text{if page } i \text{ is a huge page} \\ C_i \times nr\_subpages, & \text{if page } i \text{ is a base page} \end{cases} Hi={Ci,Ci×nr_subpages,if page i is a huge pageif page i is a base page nr_subpages 是构成大页面的子页面数量。由于大页面比基本页面更可能被访问,所以通过 Ci∗nr_subpagesC_i * nr\_subpagesCinr_subpages 来补偿基本页面的热度。Ksmapled 对每个 PEBS 样本将页面 i 的 CiC_iCi 增加 1。CiC_iCiHiH_iHi 将在冷却过程中定期减半以计算 EMA。

页面访问直方图默认由 16 个箱组成,每个箱表示特定范围的热度因子 HiH_iHi,遵循指数尺度;第 n 个箱子的热度因子范围为 [2n,2(n+1)][2^n,2^(n+1)][2n,2(n+1)],最后一个箱没有上限。每个箱的值(y)表示热度范围内不同页面数量(以 4 KB 为单位)。

指数尺度箱紧凑,且指数尺度简化了冷却过程中直方图管理,因为冷却将访问计数减半。此外,它还可以很好匹配了页面访问的非线性特性—热点页面的访问次数比温页或多有几个数量级。使用等分箱设计很难捕捉到这种非线性页面访问频率。

更新页面访问直方图非常高效。当 ksample 更新页面的热度因子 HiH_iHi 时,它会检查新热度因子是否落入不同箱中。假设最初 HiH_iHi 落入箱 6,而增加了 CiC_iCi 后,落入了箱 7,则 ksample 将减少箱 6 中的页面计数并增加箱 7 中的页面计数。

Memtis 管理两个直方图——页面访问直方图和模拟基本页面直方图(或简称基本页面直方图)。Memtis 使用页面访问直方图确定热点页面,并使用基本页面直方图确定页面大小。

基于直方图的热点集分类

Memtis 使用页面访问直方图维护所有分配页面的热度分布。这个直方图表示访问计数落在特定访问计数范围内的不同页面数量(y 轴)与访问计数范围(x 轴)。Memtis 利用访问直方图了解热度分布,从而做出最佳的分层决策,将最热的页面放置在快速层以最小化访问延迟。

Memtis 将热点集大小保持在快速层容量附近,以便快速层可以容纳所有热点页面。而冷页面位于容量层。当迁移开销超过快速层访问延迟的好处时,Memtis 避免迁移温页面。

Memtis 使用专用的每内存节点迁移线程(kmigrated)在后台进行页面提升/降级,以避免延长关键路径和性能下降。Memtis 的整个过程——包括页面访问跟踪、热度分类、提升和降级——都在后台进行,从不延长关键路径。

Memtis 维护热,温,冷阈值,分别表示为 ThotT_{hot}ThotTwarmT_{warm}TwarmTcoldT_{cold}Tcold。这些阈值是页面访问直方图的箱索引。令页面 i 的箱索引为 BiB_iBi,则 Bi>=ThotB_i >= T_{hot}Bi>=Thot 时,它会被放置在快速层。如果 Bi<=TcoldB_i <= T_{cold}Bi<=Tcold,它会被移动到容量层。否则,就是温页面,难以决定页面的热度,因此,Memtis 不会迁移此类页面,而是将其留在原地。

ksampled 定期根据直方图中编码的页面访问分布调整阈值。

  • 热点页面大于快速层容量时
    ksampled 尽可能扩展 Thot 以保持热点页面在更高的箱中,直至快速层溢出。识别的热点集大小(s)可能小于快速层容量(MSfast),因为 Memtis 以指数尺度组织直方图箱。如果识别的热点集大小足够接近快速层容量(s>MSfast∗αs > MS_{fast} * \alphas>MSfastα),Memtis 可以充分利用快速层,并将少量未使用的内存保留用于未来页面分配和提升。α\alphaα 经验性的设置为 0.9。只要有空闲的快速层内存,Memtis 就会在其上分配页面。
  • 热点页面不够接近快速层容量时
    Memtis 可能在快速层内存中保留任意冷页面。在这种情况下,一些即将成为热点的页面可能会被降级,但在变热后会很快被提升回快速层。这会产生不必要的迁移流量,并掩盖我们动态页面放置的好处。为解决此问题,我们引入了温阈值 TwarmT_{warm}Twarm。当 s<=MSfast∗αs <= MS_{fast}*\alphas<=MSfastα 时,TwarmT_{warm}Twarm 会被设置为 Thot−1T_{hot}-1Thot1。Memtis 使用 TwarmT_{warm}Twarm 排除快速层中接近热点阈值的页面作为降级候选。在计算完 TwarmT_{warm}Twarm 后,TcoldT_{cold}Tcold 会被设置为 Twarm−1T_{warm}-1Twarm1。最初,ThotT_{hot}ThotTwarmT_{warm}TwarmTcoldT_{cold}Tcold 分别设置为 1、1 和 0。新分配页面的初始热度设置为当前的热度阈值(ThotT_{hot}Thot),以防止它们立即被选为降级候选。

当采样页面的总容量与快速层容量相近时启动适应过程。而计算这些的间隔被设置在 100000 个采样事件。即,每 100000 次采样执行一次适应。

由于页面的内存访问趋势可能会随时间变化而变化,所以 Memtis 会衰减旧访问的影响,并对最后访问给予更多权重。所以 Memtis 会定期将每个页面的访问计数 CiC_{i}Ci 减半。这个冷却过程实际上是在计算 HiH_iHi 的指数移动平均值(EMA),衰减因子为 0.5. 由于以指数方式配置直方图箱,冷却只需要将直方图的每个箱左移一个箱位,然后,kmigrated 扫描页面列表并将每个页面的访问计数减半。对于大页面,kmigrated 还对每个子页面的元数据进行冷却。

Memtis 根据采样内存访问的数量执行冷却。冷却周期必须足够大,因为它决定了反映在直方图中的采样内存访问总数。Memtis 每两百万条记录执行一次冷却,这对于千兆字节级的快速层内存大小来说已经足够大。

Memtis 为每个内存层创建一个 kmigrated 内核线程,并在后台执行所有的提升和降级操作。Memtis 为容量层维护一个提升列表,为快速层维护一个降级列表。提升列表仅包含热点页面,而降级列表则包含温热和冷页面。当ksampled处理内存访问样本时,它会将页面的热度因子(𝐻𝑖)与𝑇ℎ𝑜𝑡进行比较,如果页面是热点,则将其移动到提升列表中。当kmigrated通过将页面访问计数减半来进行冷却时,一些页面可能变得温热或冷,此时kmigrated会将它们移动到降级列表中。

kmigrated 每隔500毫秒被唤醒一次。容量层的 kmigrated 检查容量层中是否有热点页面以及快速层中是否有可用空间。如果有,它会将容量层中的热点页面提升到快速层。当快速层中的可用内存低于空闲空间阈值时,快速层的 kmigrated 开始降级。作者将空闲空间阈值设置为快速层大小的2%,以便未来的页面分配和提升。kmigrated 从快速层的降级列表中选择牺牲页面。它首先将降级列表中的冷页面(Hi ≤ Tcold)降级到容量层。如果在降级冷页面后获得了足够的空闲空间,kmigrated 就会停止。否则,它会将温页面降级到容量层,直到获得足够的空闲空间。因此,Memtis 能够在快速层中保留尽可能多的温页面。

考虑偏斜的页面大小确定

默认使用 Linux 中透明大页面(THP)来减少地址翻译成本,然而,单一大页面并不适用于所有工作负载,如图 3 b 所示。当大页面中只有一小部分子页面被频繁访问时,最好拆分这样的页面并仅将热点子页面迁移到快速层。

Memtis 使用模拟基本页面直方图估算仅使用基本页面时的最大命中率,并将估算的最大命中率与从采样的 PEBS 记录中获得的实际命中率进行比较。这个差距(绿色的部分)近似于大页面拆分的潜在效益。如果潜在效益很大,则 Memtis 选择子页面访问偏斜度高的大页面作为拆分候选。

它在后台拆分大页面,并根据大页面中维护的子页面访问信息将每个拆分的子页面放置在适当的内存层。由于拆分大页面是一个耗时操作,所以 Memtis 在观察长期页面访问趋势后才做出拆分决策。

Memtis 使用两个变量来估计,分别是实际测量命中率(𝑟𝐻𝑅)和估计命中率(𝑒𝐻𝑅)。由于𝑟𝐻𝑅表征了快速层的当前利用率,如果𝑟𝐻𝑅远低于𝑒𝐻𝑅,则可以通过拆分偏斜的巨型页面并用热点基础页面填充快速层内存来提高命中率。

当 ksample 处理一个采样的内存访问时,会检查该地址是否位于快速层中,如果是,ksample 增加 rHRrHRrHR

而 Memtis 维护一个模拟的基础页面直方图来估计 eHReHReHR。基础页面直方图以 4 KB 页面粒度管理内存访问分布,而不管实际操作系统管理的页面大小。基础页面直方图的更新和冷却方式与常规页面访问直方图相同。使用基础页面直方图,Memtis使用算法1计算其阈值,例如 ThotBPT^{BP}_{hot}ThotBP。每当 ksampled 更新页面元数据时,它会检查相应的4KB(子或基础)页面是否比 ThotBPT^{BP}_{hot}ThotBP 更热。如果是,Memtis增加𝑒𝐻𝑅的命中计数。

当采样记录的数量超过分配页面总数的 14\frac{1}{4}41 时(对于 4 GB (220∗4KB2^{20}*4KB2204KB)的大小,至少 100 万个记录),Memtis 会计算 eHR,并且只有当潜在收益(eHR-rHR)足够大时,Memtis 才会触发巨型页面拆分程序。

拆分数量的计算公式:
Ns=min((eHR−rHR)×ΔLLfast×nr_samples×βavg_samples_hp,nr_samplesavg_samples_hp) N_s = min((eHR-rHR)\times \frac{\Delta L}{L_{fast}} \times \frac{nr\_samples\times \beta}{avg\_samples\_hp},\frac{nr\_samples}{avg\_samples\_hp}) Ns=min((eHRrHR)×LfastΔL×avg_samples_hpnr_samples×β,avg_samples_hpnr_samples)

  • 容量层的延迟为 LcapL_{cap}Lcap,快速层的延迟为 LfastL_{fast}Lfast,其差距为 ΔL\Delta LΔL
  • nr_samplenr\_samplenr_sample 为样本总数,avg_samples_hpavg\_samples\_hpavg_samples_hp 为巨页内采样访问的平均值
  • β\betaβ 为缩放因子
  • min 的作用:在拆分的数量不能超过不同巨页的数量

当预期收益更高,两个内存层之间的延迟差距更大,以及访问巨页更多时,Memtis 会更积极的拆分更多巨页。

拆分哪些巨页

Memtis 使用子页访问倾斜度来决定拆分。巨页 i 的倾斜因子定义如下:

Si=∑j=0nr_subpagesHij2Ui2 S_i = \frac{ \sum_{j=0}^{nr\_subpages}H_{ij}^2}{U^2_i} Si=Ui2j=0nr_subpagesHij2

  • UiU_iUi 为利用率因子,表示巨页中热子页(ThotBP<=HijT_{hot}^{BP}<= H_{ij}ThotBP<=Hij)的数量
  • HijH_{ij}Hij 为巨页 i 的第 j 个子页的热度因子
  • UiU_iUiHijH_{ij}Hij 进行平方:这种非线性的单调递增变换有助于区分倾斜的访问模式和均匀热的访问模式。

Kmigrated 在每个冷却间隔更新每个大页的倾斜因子,因为冷却扫描整个页面,其周期足够长以捕捉长期访问行为。为了高效选择前 NsN_sNs 个高度倾斜的页面,Memtis 在冷却期间构建了一个倾斜因子数组,其中每个条目包含一个倾斜范围内的大页列表。然后从数组中选择前 NsN_sNs 个大页

被选中的拆分候选页面随后被移动到拆分队列,kmigrated 对拆分队列中的大页进行分割。具体而言,它使用子页面热度因子 HijH_{ij}Hij 将每个拆分候选页面内的子页面分类为热页和冷页。当 Memtis 拆分大页时,它会取消映射并释放全零(从未更新过)的子页面以减少内存使用。最后,它将每个子页面迁移到适当的内存层级。

由于将基本页面合并成大页也是昂贵的操作,所以Memtis 仅在所有组成基本页面都是热页时才进行合并。合并很少发生,因为 Memtis 启用了透明大页(THP)并保守地分割已分配的大页。

评估

显示了详细的基准测试描述,包括内存大小和分配的大页面比例。

显示了使用 NVm 作为容量层时分层内存系统的性能比较。Memtis 在几乎所有情况下表现最佳。作者的实验结果表明,Memtis在各种内存设置和访问模式下表现良好。

各模块的有效性

热点集分类

表明:Memtis 在运行时识别出的热点,暖点,冷点内存的数量。总体而言,识别出的热点集大小非常接近快速层大小(由黑色虚线表示)。

使用暖集减少内存迁移

Memtis 有效地减少了内存迁移流量。由于暖页面可能会变得更冷或更热,Memtis 通过不迁移这些暖页面(如图 10 所示,降低了 2.7% 到 64.8%)可以减少大量的迁移流量。

此外,拆分大页面在一定程度上减少了迁移流量,因为迁移了更小尺寸的页面。

大页面的拆分的影响

显示了 Silo 和 Btree 基准测试随时间的性能。

Btree 的整体性能提高了 10.4%。对于 Btree,由于大页面会导致严重的内存膨胀,Memtis 在接近 800 秒时检测到偏斜的大页面并开始将其拆分。这将吞吐量提高了高达 19.9%(在 2410 秒时)并将 RSS 减少了 28.96%(38.3GB→27.2GB)

比较了三种命中率:

  • eHR:仅使用基页面时的估计命中率
  • rHR:采用巨大页面拆分的实际命中率
  • rHR-ns:不使用巨大页面拆分的 Memtis-ns 的实际命中率

可以看到在大多数情况下,rHR 都对命中率有提升

使用 CXL 内存的性能

使将 Memtis 与 TPP 做比较,如下:

Memtis 在所有评估的基准测试中都优于 TPP,所以作者相信 Memtis 在 CXL 内存最终可用时将是有益的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值