Dynamic Capacity Service for Improving CXL Pooled Memory Efficiency——论文阅读

IEEE Micro 2023 Paper CXL论文阅读笔记整理

问题

传统系统面对大容量和高带宽内存需求时存在的挑战:

  • 内存墙。计算系统的最新趋势表明,内存性能的提高没有跟上计算性能的步伐。扩展内存带宽和容量的一个可行解决方案是增加中央处理器(CPU)中的内存通道数量。但这需要CPU设计开销,从而导致成本增加和可靠性降低的问题。由于实现复杂性的增加,提高动态随机存取存储器(DRAM)的数据速率以获得更高的存储器带宽是具有挑战性的。

  • 内存过度提供。由于工作负载的资源需求(例如CPU核数和内存大小)变化,并且在主机之间也有所不同,因此云规模系统中的大量内存被搁置。例如,在微软的Azure中有25%的内存滞留。内存分解是缓解这一问题的常见方法。

Compute Express Link(CXL)池内存作为一种可行的内存分解解决方案,提供了内存扩展和缓解内存过度提供。有效使用池内存的基本功能是根据主机的需求动态地从池中分配或释放内存,本文将此功能称为动态容量服务(DCS)。

CXL内存池的架构如图1所示,基于多头CXL设备或CXL交换机。支持:内存加载/存储语义、高可扩展性、高资源利用率。

本文工作

本文介绍了工业界第一个针对CXL池内存的DCS实现之一。实现基于现场可编程门阵列(FPGA)的CXL池存储器原型和完整的软件堆栈。还介绍了DCS实施过程中的经验教训。

DCS硬件架构

DCS引擎支持动态容量分配和释放,如图2所示。包括:内存管理单元(MMU)、邮箱、内存段表、内存保护单元(MPU)、安全擦除器。

  • 内存管理单元:CXL池内存在逻辑上划分为预定义大小的内存段(默认为128 MB),MMU根据主机的请求分配或释放内存段,如图3。(1)通过邮箱接收来自主机的内存分配/释放请求。(2)更新存储器区段表来分配/释放所请求的存储器区段。(3)返回对请求的响应,包括执行状态、分配或释放的节的数量以及所涉及的节标识符(ID)的列表。

  • 邮箱:主机通过CXL.io向邮箱发送16位命令(在CXL规范允许的供应商特定字段中定义自定义DCS命令),MMU读取命令并执行相应的操作。

  • 内存段表:由MMU更新,如图4(a),在主机的请求内存分配时,MMU会分配所请求的内存节数,并将节的所有者字段设置为主机ID。MMU在释放请求时会将所请求的节的所有者域设置为0。

  • 内存保护单元:MPU参考内存段表,决定是否授权CXL.mem读/写事务,如图4(b)。

  • 安全擦除器:在释放的内存部分重新分配给其他主机之前,对其执行归零或随机化。

DCS软件架构

DCS软件框架包括:CXL池内存检测和管理、DCS引擎驱动程序、支持DCS的Kubernetes。

  • CXL池内存检测和管理:通过EFI BIOS将CXL池存储的物理地址公开为软保留型内存,设备驱动程序将地址空间初始化为仅限内存的非均匀内存访问(NUMA)节点(或zNUMA节点)。CXL池内存中的内存分配或释放单位是一个内存段,在64位x86机器上,其大小默认为128 MB。DCS利用Linux的内存热插拔功能将分配的CXL池内存注册为系统内存。

  • DCS引擎驱动程序:初始化阶段完成后,所有内存段离线。对于要使用CXL池内存的主机,主机应该获得访问内存单元部分中的CXL池存储器的许可。接收到许可的内存部分就会联机,并由Linux内核中的内存管理子系统进行管理。主机和CXL池内存之间的通信是通过CXL邮箱机制。

  • 支持DCS的Kubernetes:使用Kubernete,一种容器编排工具。如图5,Kubernetes集群由master和多个worker组成。作者在worker中修改了Kubelet和device-plugin。device-plugin将池内存的每个部分枚举为多个内存设备,以跟踪可用的内存资源,然后通过Kubelet与master共享可用性。master中的调度器在检查资源可用性后选择一个工作程序来放置pod。如果所选的worker没有足够的内存资源来运行容器pod,master会向worker发送分配请求。一旦工作者收到分配请求,设备插件就会从CXL池内存中获得该部分的许可,之后进行内存热插拔。在pod执行完成后,设备插件会拔下部分并更新资源可用性。

DCS API

API支持三个命令:获取内存段状态、设置内存段分配、设置内存段释放,如图6。

  • 获取内存段状态:(1)主机将“获取内存段状态”命令发送到邮箱。(2)邮箱返回总内存分区计数和可用分区计数,并返回一条成功消息。

  • 设置内存段分配:主机请求CXL池内存根据CXL池内的可用内存段和当前所需的内存容量来分配内存段,或者释放不再需要的内存段。(1) 主机向邮箱请求带有输入有效负载的“设置内存段分配”命令,该有效负载是所需的内存节数和分配策略。(2) MMU读取请求的命令。(3) MMU根据输入的有效载荷更新存储器部分表。(4) MMU返回响应消息,包括分配的区段计数、区段计数、区段范围列表。(5) 主机读取存储在邮箱中的响应消息。

  • 设置内存段释放:设置内存段的释放操作与设置内存段分配类似,不同之处在于,可以根据发布策略执行安全擦除。安全擦除时:(1)MMU请求对安全擦除器进行归零或随机化。(2)安全擦除器根据请求执行归零或随机化。应用了安全擦除的内存部分无法重新分配。

FPGA实现

在连接到多个主机的基于FPGA的CXL池内存原型中实现了DCS。该原型最多可通过CXL接口连接到四台主机,由一个DCS引擎和四个DDR4 DIMM(最高512 GB)组成。通过连接两个英特尔未来一代的CPU服务器来评估性能。

实验

实验配置:

实验表明,DCS可以根据需要动态分配和释放内存资源,从而显著提高系统内存利用率。

总结

针对CXL扩展池内存,从软件和硬件方面实现了动态容量服务(DCS),根据主机的需求动态地从池中分配或释放内存。DCS硬件引擎支持动态容量分配和释放,包括:内存管理单元(MMU)、邮箱、内存段表、内存保护单元(MPU)、安全擦除器。DCS软件框架支持用户使用CXL池内存,包括:CXL池内存检测和管理、DCS引擎驱动程序、支持DCS的Kubernetes。并实现了用于传输请求的API,支持三个命令:获取内存段状态、设置内存段分配、设置内存段释放。最终基于FPGA实现了DCS原型,可以适用于不同孽畜大小的节点组成内存池,并提高系统内存利用率。

  • 53
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妙BOOK言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值