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

在传统服务器架构里,多台服务器可以通过网络交换机连接到整个机房,每个服务拥有自己的内存、CPU、存储和 GPU,服务器之间相互独立,服务器之间只有通过网络才能进行通信实现资源交换. 当需要为服务器扩容时,只能通过动态热插到指定服务器,新插入的内存仅仅作用于指定服务器. 在现代服务器集群里,资源池化的概念越来越重要,服务器可以弹性的从资源池里获得和释放所需的资源,也可实现资源的共享与独占.

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

在 CXL 1.0 还没有支持池化和热插拔,服务器集群如果需要扩容,则需要手动将内存条热插到服务器的 DIMM 插槽上,以此为服务器进行扩容,扩容后的内存依旧和本机的内存形成内存孤岛,无法与其他服务器共享资源,资源的利用率不高, 服务器之间交互数据还是需要通过 TOR SWITCH 走网络或者 RDMA. 当集群不需要内存时,则将内存条从 DIMM 插槽上移除,以此进行缩容. 该阶段的池化还是需要人为介入且资源受限的.

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

CXL 2.0 开始支持池化,通过提供 SharingPooling 功能,能在多台服务器上提供共享 CXL 内存,也可以提供独占的 CXL 内存,灵活满足不同的内存需求. 由于 CXL 2.0 的池化能力是有限的,如上图,在一个机架构成的集群里,由服务器和 CXL 内存服务器和 TOR SWITCH 构成,当服务器需要拓展内存时,可以从 CXL 服务器(CXL 内存池)里进行扩容,当需要缩容内存时,可以将内存归还给 CXL 服务器. 在该架构下,服务器之间的存储还是依赖独立的存储介质,该介质可以位于服务器内部形成存储孤岛,也可以有服务器集群提供服务. 另外服务器之间的数据交互可以通过网络(RDMA) 或者共享池化内存. 该阶段的池化局限在一个机柜内.

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

CXL 3.0 开始支持 P2P 和多级 CXL SWITCH 级联,那么 CXL 设备既可以充当内存,也可以充当持久存储(PMEM)或临时存储(DDR), 另外由于支持 P2P,那么 CXL 设备也可以直接被 GPU 使用,CXL 内存可以作为显存同时被多个 GPU 共享. 在该阶段的池化会越来越接近真正的池化,服务器不再包含所有的硬件,而是有专有服务器构成,例如只有 CPU CORE 的服务器、只有内存的服务器、只有存储的服务器、以及只有 GPU 的服务器,这些服务器通过 CXL SWITCH 进行互联. 但一个任务下发之后,池化管理关键根据任务的需求分配指定数量的 CPU、内存、存储和 GPU,然后在这些资源上处理任务,任务完成之后再将资源归还给不同的池子. 在该阶段不再存在孤岛资源,所有的资源都可以共享和独享, 但受限于 CDPF 距离和稳定,池化只能位于一个机柜或距离相近的几个机柜之间,跨机房的池化还是无法实现.

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

在 CXL3.0 支持 CXL SWITCH 级联的功能之后,可以让多台机柜进行连接,以此构成不同的池子,接着在通过不同的交换机网络与核心网相连,进而通过光纤基站与散落在不同地域的服务器构成不同地域的池子. 该阶段池化具有更高效的资源利用率,以及更可靠的多地备份和容灾机制. 以下是对不同池化能力的描述:


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

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

BiscuitOS 提供了 CXL 池化的实践环境,其 CXL 拓扑如上图, BiscuitOS 使用两个虚拟机作为两个服务器主机,并使用 QEMU 的 QMP 充当 Fabric Manager(FM). 在初始状态下,CXL Type3 物理设备作为 MLD 设备虚拟暴露出两个逻辑设备,两个逻辑设备并未绑定到任何主机的 VH 上. 在两个主机上电之后,FM 可以根据需求将 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: x1 VCS + x1 Type3 PMEM)  --->
            [*] CXL POOL
  [*] Package  --->
      [*] HETEROGENEOUS MEMORY MANAGEMENT
          [*] CXL POOL(MEMORY/STORAGE/CPU/GPU)  --->

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

# 切换到实践案例所在目录
cd output/linux-6.10-x86_64/package/BiscuitOS-CXL-POOL-default
# 注意!第一次部署,给内核打补丁,并重编译内核
patch -d ../../linux/linux -p1 < BiscuitOS-CXL-POOL-default/CXL-FAMFS.patch
cd ../../linux/linux/
scripts/config --disable CONFIG_FAMFS
cd -
make kernel
# 准备依赖工具
make prepare
# 编译实践案例
make download
make build

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

当第一台 BiscuitOS 启动之后,使用 “lspci-common -vt” 查看当前的硬件拓扑结构,开发者可以在 HOST 下面使用如下命令向 BiscuitOS 添加不同的池化资源,命令如下:

# 切换到池化管理关键
cd /BiscuitOS/output/linux-6.10-x86_64/package/BiscuitOS-CXL-POOL-default/BiscuitOS-CXL-POOL-default
# 热插一个 CPU
./FManager.sh HOTPLUG HOST1 CPU
# 插入一个 MEMORY
./FManager.sh HOTPLUG HOST1 MEMORY
# 插入一个 STORAGE
./FManager.sh HOTPLUG HOST1 STORAGE
# 插入一个 GPU
./FManager.sh HOTPLUG HOST1 GPU

当热插完毕之后,还要在 BiscuitOS 是热插的池化资源生效,可以参考如下命令:

# 使能内存池化资源
RunBiscuitOS.sh HOTPLUG MEMORY
 
# 使能存储池化资源
RunBiscuitOS.sh HOTPLUG STORAGE
VFS WRITE "THIS IS BiscuitOS"
VFS READ
 
# 使能 GPU 池化资源
RunBiscuitOS.sh HOTPLUG GPU
GPU

以上便是 BiscuitOS CXL 池化实践案例,开发者可以根据需求查看源码实现过程.

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