关注了就能看到更多这么棒的文章哦~
Weighted interleaving for memory tiering
By Jonathan Corbet
October 25, 2023
ChatGPT translation
https://lwn.net/Articles/948037/
kernel里过去这些年一直都可以控制如何在有多个NUMA node的系统里进行内存分配。最近NUMA node已经成为表示不同等级的内存的一个服务了,这些node节点也被根据性能特性来分成不同的tier。尽管内存分配策略可以在NUMA-node级别来控制page的分配位置,但是kernel没有提供任何方式来把这些策略跟memory tiers关联起来。
现在的计算机不再仅仅具有“内存”。系统现在可以包含多种类型的内存,各自具有完全不同的性能特征。持久内存(persistent memory)的数量很大,但相对较慢。CXL内存可能更快,尽管仍不如普通DRAM快,而且在系统的生命周期内可能会随时加入或者移除。高带宽内存(high-bandwidth memory)可以比普通DRAM更快。设备也可以将其自己的内存提供给系统的内存总线。每个内存提供者都会用系统中一个或多个不带CPU的NUMA节点来表示。
层级化(tiering)是将这些节点分组成具有相似性能的多个level级别(或称tiers层级)的过程,然后努力在每个层级中采用最优策略来放置内存;这是一个正在进行中的工作。内核在6.1版中首次正式引入了内存层级的概念,当时Aneesh Kumar K.V.提出的这个系列被合并。内核现在为每个节点分配一个“抽象距离(abstract distance)”,反映了其相对性能;默认情况下,所有节点的抽象距离都是512。某个存储设备的抽象距离如果比这个值低,那么预期速度就会被默认DRAM的速度更快,而抽象距离更高表示更慢的内存。需要注意的是,抽象距离是由将内存提供给系统的驱动程序设置的;它不受管理员的直接控制。
在内存初始化的时候,内核将其放到不同的层级中组织起来,对于任何给定的节点,可以通过将其抽象距离除以128来获取其层级号。具有默认抽象距离512的普通内存都会位于第四层。因此,比DRAM更快的内存有四个层级的空间,以及更多层级都是速度更慢的。
内核可以根据层级来决定page放置到哪里;关于如何在层级之间移动页面已经进行了很多工作。当页面未使用时,它们可以降级到更慢的层级,而不是彻底回收掉;这是一个相对简单的决策,适用于现有的内存管理实践。然而,决定何时将页面提升到更快的内存则要复杂一些。这项工作重点放在在内存使用一段时间后将内存移动到正确的层级,以评估其相对繁忙程度。
Price的补丁系列是基于层级化机制的基础上,但针对的是不同的问题:在首次分配页面时,什么是页面的最佳/原始放置位置?具体来说,它解决了NUMA交错(interleaving)做法,这种方式中内存分配会分布在内存策略集所指定的一组NUMA节点之间,目的是从系统上的一组CPU中获得一致性能。NUMA交错已经使用多年,但相对较简单;它将页面平均放置到应用程序设置的内存策略中提供的一组节点上。交错没有层级的概念,也不能在把内存分配偏向到任何一个节点上去。
这组补丁给每个NUMA层级增加了一个“权重”的概念。权重是相对于每个CPU的,因此从CPU 0看到的第2层的权重可能与从CPU 10看到的权重不同。这些权重确定了分配决策应该如何倾向于每个层级;对于给定层级的更高权重将导致更多的页面分配在包含在该层级内的节点上。与抽象距离不同,层级权重由管理员控制,是通过下面这样的命令来设置的:
echo 0:20 > /sys/devices/virtual/memory_tiering/memory_tier2/interleave_weight
这个例子会将CPU 0看到的第2层的权重设置为20。默认情况下,所有层级的权重都是1。
这些权重由NUMA交错代码在分配页面时使用。如果系统有两个层级,第4层(普通DRAM结束的地方)和第8层(更慢的内存),并且这些层级对于当前CPU的权重分别设置为20和10,那么交错分配在第4层上放置的页面数量将是在第8层上的两倍。需要注意的是,尽管应用程序指定了其NUMA分配策略(它想要在哪些节点上分配内存),但权重完全由管理员控制。
尽管在层级化之间提升和降级的目标是将最常使用的页面放置在最快的内存上,但加权分配有不同的目标——因为内核无法在分配时知道哪些页面将被最频繁地使用。相反,它的意图是尝试在内存控制器之间获得内存使用的最佳分割,以最大程度地利用每个内存控制器的带宽。把某个页面从快速内存移动到更慢的层级,尽管被移动的这个页面仍然是在被频繁使用的,但如果最终结果是保持两个层级都在繁忙地传输数据,那么整体性能也会提高。
根据Price的说法,这种方法有效:
观察到新提出的多层交错与传统的DDR和CXL层节点之间的1:1交错方法相比,带宽利用率显著增加(165%),其中85%的带宽分配给DDR层,15%分配给CXL层,使用MLC -w2选项。
(MLC是Intel专有的内存延迟检查工具)。
这是这个补丁系列的第二个版本(第一个是由Ravi Jonnalagadda在九月底发布的)。关于实现的细节已经有很多评论,但整体上来说似乎没有反对意见。由于所有层级都以相同的权重开始,除非管理员明确更改了系统的配置,否则NUMA交错不会发生任何变动。因此在细节问题得到解决之后,这项工作似乎没有理由不继续推进。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
欢迎分享、转载及基于现有协议再创作~
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~