图片无法显示,请右键点击新窗口打开图片

CXL 引入了 MH-SLD 之后,可以很好的让多主机实现同时共享一个 CXL Type3 设备,但对于池化管理来说,一个 CXL Type3 设备 1:1 映射到 SLD 设备里,这对资源的弹性使用不利,在有的场景希望可以向 MLD 一样,既可以提供更细粒度的资源,同时希望更大的带宽,于是 CXL 引入了 MH-MLD 设备.

图片无法显示,请右键点击新窗口打开图片

Multi-headed MLD(MH-MLD) 允许多个主机通过多个链接同时连接到一个逻辑设备, 与传统的单一逻辑设备(如 SLD/MLD)不同,MH-MLD 可以在多个主机之间实现更灵活的内存访问和共享. MH-MLD 可以将一个物理设备虚拟成多个逻辑设备,然后让每个逻辑设备拥有多个连接口(称为’头’),每个头同时与不同的主机接口连接,这样的架构可以实现多主机同时访问 MH-MLD 设备,从而实现内存的并向共享. MH-MLD 还具有如下特点:

  • 提高资源利用率: 通过允许多个主机同时访问同一个逻辑设备,MH-MLD 可以提高内存的利用率,减少资源浪费
  • 降低延迟: 由于多个主机可以直接访问同一个内存资源,MH-MLD 有助于降低数据传输延迟,提高系统性能
  • 灵活性: MH-MLD 允许根据具体的工作负载需求动态调整资源分配,提高了系统的灵活性和适应性
  • 高带宽: MH-MLD 设备可以有多个物理设备的切片构成,因此多个主机可以并行访问多个物理设备

图片无法显示,请右键点击新窗口打开图片

对于 MLD 设备来讲,其可以将一个 CXL Type3 物理设备划分成多个逻辑设备,也可以将多个物理设备的切片合并成一个逻辑设备,但其只能连接到一个主机 VH 的 vPPB 上,但 MH-MLD 在具有 MLD 设备的特点前提下,还可以让多个主机的接口同时连接到同一个 MH-MLD 设备上,这比 MH-SLD 具有更好的共享特性.

图片无法显示,请右键点击新窗口打开图片

MH-MLD 设备由 Fabric Manager(FM) 负责管理,FM 可以通过静态或动态方式将 MH-MLD 设备绑定到不同主机 VH 的 vPPB 上. 例如在主机初始化之前,FM 先将 MH-MLD 绑定(Bind)到指定主机 VH 的 vPPB 上,然后主机上电初始化就可以发现该 CXL Type3 设备. FM 也可以在主机运行过程中,通过热插(Hotplug)方式将一个 MH-MLD 动态绑定到指定主机 VH 的 vPPB 上,同理也可以通过热拔(Hotremove)方式将一个 MH-MLD 动态从指定主机 VH 的 vPPB 上解绑(Unbind).

MH-MLD Practice

图片无法显示,请右键点击新窗口打开图片

BiscuitOS 提供了 MH-MLD 的实践环境,其 CXL 拓扑如上图, BiscuitOS 使用两个虚拟机作为两个服务器主机,并使用 QEMU 的 QMP 充当 Fabric Manager(FM). 在初始状态下,CXL Type3 设备作为 MH-MLD 设备并绑定到两个主机的 VH 上. 在两个主机上电之后,FM 可以根据需求将 MH-MLD 绑定到指定 VH 的 vPPB 上,也可以从指定 VH 的 vPPB 上进行解绑. 接下来在 BiscuitOS 上进行实践, 请参考如下命令:

# 切换到 BiscuitOS 项目目录
cd BiscuitOS
# 选择开发环境,如果已经选择过可以跳过,这里与 linux 6.10 X86 为例
make linux-6.10-x86_64_defconfig
# 通过 Kbuild 选择需要部署的应用程序
make menuconfig

  [*] DIY BiscuitOS/Broiler Hardware  --->
      [*] CXL: Compute Express Link
            CXL Hardware Topology (CXL2.0: x2 Host(VH) + MH-MLD)  --->
  [*] Package  --->
      [*] HETEROGENEOUS MEMORY MANAGEMENT
          [*] CXL MH-MLD: Multi Headers MLD  --->

# 配置完毕保存,然后进行部署
make

# 切换到实践案例所在目录
cd output/linux-6.10-x86_64/package/BiscuitOS-CXL-MHMLD-default
# 准备依赖工具
make prepare
# 编译实践案例
make download
make build

图片无法显示,请右键点击新窗口打开图片

当第一个主机启动之后,使用 cxl 命令查看 CXL 拓扑结构,可以看到已经绑定的两个 CXL Type3 设备,接着使用 lspci 命令查看 PCIe 总线,可以看到 CXL SWITCH(BDF 0E:00.0) 之下有绑定的 CXL Endpointer 设备. 接下来新启动一个终端来启动第二个主机,参考如下命令:

# 切换到 BiscuitOS 项目目录, 同理以 linux 6.10 X86 为例
cd BiscuitOS/output/linux-6.10-x86_64
# 直接启动第二个主机
./RunBiscuitOS-CXL.sh

图片无法显示,请右键点击新窗口打开图片

当第二个主机启动之后,使用 cxl 命令查看 CXL 拓扑结构,可以看到 MH-MLD 对应的 CXL Type3 设备被识别到,接着使用 lspci 命令查看 PCIe 总线,可以看到 CXL SWITCH(BDF 0E:00.0) 之下绑定 MH-SLD 的 CXL Endpointer 设备. 此时两个主机已经环境已经部署完毕,两个主机 VH 的 vPPB 都绑定同一个 MH-MLD, 一共两个 MH-MLD 设备, 接下来在两个主机上使用同样的命令初始化 CXL Type3 设备,然后同时对共享内存进行访问,使用如下命令:

图片无法显示,请右键点击新窗口打开图片

  • cxl create-region -d decoder0.0 -m mem0 -s 512M -t ram -w 1 -g 4096 -u: 命令用于创建一个 CXL Region
  • cxl enable-region region0: 创建完毕之后使用该命令使能 CXL Region
  • daxctl reconfigure-device –mode=devdax dax0.0 –force: 将 CXL Type3 设备模式修改为 DEVDAX
  • BiscuitOS-CXL-SLD-default READ: 从 CXL Type3 设备上读取数据
  • BiscuitOS-CXL-SLD-default WRITE <MESSAGE>: 向 CXL Type3 设备写入数据

执行完这些命令之后,可以看到主机一可以正常访问 MH-MLD 映射的 CXL Type3 设备,主机一并向设备写入 “2024-10-04-18-12”, 此时主机二可以直接读取到 “2024-10-04-18-12” 字符串,同理主机二写入 “THIS IS HOSTB”, 主机一可以直接读到 “THIS IS HOSTB”. 以上便是 MH-MLD 实现的 CXL Type3 设备池化共享机制.

图片无法显示,请右键点击新窗口打开图片