刚刚,Meta(原 Facebook)工程师团队在博客发展示了一种叫“透明内存卸载” (Transparent Memory Offloading,简称 TMO)的全新 Linux 内核功能,可为每台 Linux 服务器节省 20% 至 32% 的内存。据悉,该功能已于 2021 年在 Facebook/Meta 服务器中投入使用,团队已成功地将 TMO 的操作系统组件升级到 Linux 内核中。
透明内存卸载(TMO)是 Meta 针对异构数据中心环境推出的的解决方案,它引入了一种新的 Linux 内核机制,可实时测量由 CPU、内存 和 I/O 之间的资源短缺而导致的工作损失。在这些信息的指导下,TMO 在没有任何应用程序先验知识的情况下,自动调整要卸载到异构设备(如压缩内存或 SSD)的内存量。
也就是说,TMO 会根据设备的性能特征和应用程序,来对较慢内存访问的敏感性来出做调整。除了应用程序容器外,TMO 还从提供基础架构级功能的 sidecar 容器中全面识别卸载时机。
卸载时机
近年来,大量更便宜的非 DRAM 内存技术(如 NVMe SSD)已被成功部署在数据中心或正在开发的数据中心。此外,新兴的非 DDR 内存总线技术【如 Compute Express Link(CXL)】也提供了类似内存的访问语义,并接近 DDR 性能。数据图显示的内存存储层次结构说明了各种技术是如何相互堆叠的。这些趋势的结合,为内存分层提供了新的机会,这在过去是不可能的。
使用内存分层,访问频率较低的数据将迁移到速度较慢的内存中。应用程序本身、用户空间库、内核或虚拟机监控程序可以驱动迁移过程。Meta 的 TMO 功能工作专注于内核驱动的迁移或交换,它可以透明地应用于许多应用程序,而无需修改应用程序。
尽管概念简单,但内核驱动的对延迟敏感数据中心应用程序的交换在超规模上仍具有挑战性。Meta 构建了 TMO,这是一个用于集装箱化环境的透明内存卸载解决方案。
解决方案:透明内存卸载
TMO 的组成:
- 压力暂停信息(PSI),一个 Linux 内核组件,用于实时测量由于 CPU、内存和 I/O 之间的资源短缺而导致的工作损失。Meta 首次实现了可直接测量应用程序对内存访问速度减慢的敏感性,而不必求助于脆弱的低级别指标,如页面提升率。
- Senpai 是一个用户空间代理,它可以施加轻微的主动式内存压力,跨不同的工作负载和异构硬件有效地卸载内存,对应用程序性能的影响最小。
- TMO 以阈下内存压力级别执行内存卸载以交换,周转率与文件缓存成比例。这与在严重内存压力下作为紧急溢出进行交换的历史行为形成对比。
DRAM 的成本占服务器成本的一小部分,这促使 Meta 在 TMO 上开展工作。数据图显示了 DRAM、压缩内存和 SSD 存储的相对成本。Meta 根据代表其生产工作负载平均值的 3 倍压缩率来估计压缩 DRAM 的成本。
据预计,DRAM 的成本将增长到 Meta 基础设施支出的 33%,同时 DRAM 功耗遵循类似的趋势将达到服务器基础架构功耗的 38%。
在压缩 DRAM 的基础上,Meta 还为所有生产服务器配备了功能强大的 NVMe SSD。在系统级别,NVMe SSD 占服务器成本的比例不到 3%(大约是当前一代服务器压缩内存的 3 倍)。数据图显示,在各代中,iso 容量到 DRAM、SSD 的成本仍低于服务器成本的 1%——每字节成本大约比压缩内存低 10 倍。
尽管比 DRAM 便宜,但压缩内存和 NVMe SSD 的性能特征较差。好在典型的内存访问模式为卸载到较慢的介质提供了大量机会。数据图中显示了“冷”应用程序内存,过去 5 分钟内未访问的页面的百分比。这种内存可以卸载到压缩内存或 SSD 中,而不会影响应用程序性能。
总体而言,冷存储平均约占 Meta 服务器总内存的 35%。然而,它在不同的应用程序中变化很大,从 19% 到 62% 不等。这突出了对各种应用程序行为具有鲁棒性的卸载方法的重要性。
除访问频率之外,卸载解决方案还需要考虑卸载哪种类型的内存。应用程序访问的内存包括两大类:匿名和文件备份。匿名内存由应用程序以堆或堆栈页的形式直接分配。文件支持的内存由内核的页面缓存分配,以代表应用程序存储经常使用的文件系统数据。
TMO 设计概述
TMO 包含跨用户空间和内核的多个部分,“Senpai ”作为用户空间代理位于卸载操作的核心,在围绕观察到的内存压力的控制循环中,它使用内核的回收算法来识别使用最少的内存页,并将它们移出卸载后端。在此过程中,PSI(压力失速信息)内核组件量化并报告内存压力,回收算法则通过内核的 cgroup2 内存控制器定向到特定的应用程序。
Senpai
Senpai 位于 PSI 指标之上,它使用压力作为反馈,以确定驱动内核内存回收的力度。如果容器测量值低于给定的压力阈值,Senpai 将提高回收率;如果压力降到以下,Senpai 就会缓解。压力阈值得到校准,这样分页开销在功能上不会影响工作负载的性能。
交换算法
TMO 是在不影响工作负载的低压力级别下卸载内存的,但尽管 Linux 在压力下退出了文件系统缓存,但它似乎“不愿”将匿名内存移出到交换设备。即使存在已知的冷堆,并且文件缓存的速度超过了 TMO 压力阈值,配置的交换空间也会处于令人沮丧的空闲状态。
因此,TMO 引入了一种新的交换算法,该算法利用了这些驱动器的优势,无需恢复仍使用旋转存储介质的传统设置,可通过跟踪系统中文件系统缓存重构的速率并按比例进行交换来实现。也就是说,对于每个重复需要从文件系统读取的文件页,内核都会尝试交换掉一个匿名页,这样就为翻页腾出了空间。如果发生交换插入,Recall 会再次推回文件缓存。
目前,Meta 根据应用程序的内存可压缩性及其对内存访问速度减慢的敏感性,在压缩内存和 SSD 支持的交换之间手动选择卸载后端。尽管可以开发工具来自动化该过程,但更基本的解决方案需要内核管理卸载后端的层次结构(如自动使用 zswap 处理较热的页面,使用 SSD 处理较冷或压缩性较差的页面,以及将来将 NVM 和 CXL 设备折叠到内存层次结构中)。内核回收算法应该在这些内存池之间动态平衡,Meta 正在积极研究这个体系结构。
随着 CXL 等即将推出的总线技术提供类似内存的访问语义,内存卸载不仅可以帮助卸载冷存储,还可以帮助卸载热存储。Meta 也正积极关注该体系结构,以利用 CXL 设备作为内存卸载后端。