admin管理员组

文章数量:1027758

CXL 实践指南:关于内存扩展,需要知道的是...

全文概览

在人工智能(AI)和机器学习(ML)领域,数据处理的需求呈指数级增长,对内存容量和性能提出了前所未有的挑战。传统的DRAM解决方案在成本、容量和扩展性方面面临瓶颈。Compute Express Link(CXL)作为一种新兴的互连技术,通过提供高速、低延迟的连接,为解决这些挑战带来了新的希望。本文深入探讨了CXL技术在AI/ML应用中的潜力,并提供了一份实践指南,旨在帮助读者了解如何利用CXL技术释放AI和ML的性能。

本文将介绍CXL的软件生态,包括Linux内核和QEMU对CXL的支持进展,以及各种有用的工具和软件。同时,我们将探讨应用程序如何利用CXL技术来处理大型数据集,包括内存扩展、内存池化和内存共享等方式。此外,本文还将介绍如何对包含CPU、内存、GPU和CXL组件的系统进行性能基准测试和可观测性分析。最后,我们将探讨在异构内存系统中管理数据放置和移动的策略,包括延迟优化和带宽优化。通过本文的阅读,读者将能够全面了解CXL技术在AI/ML领域的应用,并掌握利用CXL技术提升AI和ML性能的实践方法。

阅读收获

  • 了解CXL技术在AI/ML领域的应用前景和优势。
  • 掌握利用CXL技术进行内存扩展、池化和共享的方法。
  • 熟悉CXL相关的软件工具和性能测试方法。
  • 理解异构内存系统中数据放置和移动策略。

CXL 的软件生态

Fig-1 Linux 内核与QEMU技术路线图

Fig-1 Linux 内核与QEMU技术路线图

路线图展示了 Linux 内核和 QEMU 对 Compute Express Link (CXL) 规范不同版本的支持进展。

  • CXL 版本支持: 路线图涵盖了从 CXL 1.1 到最新的 CXL 3.1 版本。随着时间的推移,新的 CXL 规范版本逐渐得到支持。
  • Linux 内核支持: 从主流内核版本 5.18 开始,逐步增加了对 CXL 的支持,引入了 Kernel TPP,在 6.9 版本中引入了 Kernel Weighted Interleaving 预计在6.12版本,引入 CXL Dynamic Capacity Device Support 特性。
  • QEMU 支持: QEMU 在 7.2 版本初步引入了 CXL 2.0 的支持,包括基础的 CXL 开关、内存交织和 Type 3 设备支持。在 8.0 版本进行了重大扩展,增加了对 CXL 2.0 HDM 解码器和 QoS 能力结构的支持。随后的版本继续改进和扩展 CXL 支持,例如在 9.0 版本引入了对 Type 1 和 Type 2 设备的额外支持以及 MMIO 缓存,并在 9.1 版本添加了对 CXL 3.0 Type 3 设备及相关能力的支持。

如何理解QEMU在CXL发展中发挥的作用?

QEMU 对 CXL 功能的支持在推动 CXL 应用落地阶段发挥了非常关键的作用,主要体现在以下几个方面:

  1. 为软件开发提供平台:
    • 在 CXL 硬件广泛可用之前,软件开发者(包括操作系统驱动开发者、中间件开发者和应用开发者)需要一个环境来编写、测试和调试利用 CXL 功能的代码。
    • QEMU 通过模拟 CXL 设备(如 CXL Type 1/2/3 设备、CXL 开关等),为这些开发者提供了一个可行的开发和测试平台。他们可以在 QEMU 虚拟机中运行 Linux 内核(包含 CXL 驱动),开发和验证应用程序如何与模拟的 CXL 内存、设备进行交互。
  2. 加速软件生态系统成熟:
    • 新的硬件技术需要配套的软件生态系统才能被广泛应用。QEMU 的仿真使得与 CXL 相关的操作系统驱动、虚拟化层支持(如通过 vI/O 将模拟的 CXL 设备暴露给客户机)、管理工具等软件组件能够并行甚至超前于硬件开发进行。
    • QEMU 对不同 CXL 版本(2.0, 3.0)和不同特性(内存交织、Type 3 设备、HDM 解码器、QoS、MMIO 缓存)的支持,意味着开发者可以在 QEMU 中逐步实现和测试这些复杂的 CXL 功能在软件层面的处理逻辑。
  3. 降低开发和测试门槛:
    • 真实的 CXL 硬件,特别是早期版本和复杂配置(如涉及开关、多个设备、内存池)的硬件,可能昂贵且不易获取。
    • QEMU 提供了更经济、更易于配置和管理的虚拟环境,使得更多开发者和研究人员能够参与 CXL 相关的软件开发和功能验证,无需依赖昂贵的物理硬件。

Fig-2 CXL 相关的工具和软件

Fig-2 CXL 相关的工具和软件

图片列举了与 CXL (Compute Express Link) 技术相关的各种有用的工具和软件,并将它们分为了几个主要类别:

  1. 管理工具: 包含了一些标准的 Linux 命令(如 dmesg, lspci)以及专门用于管理 CXL 设备和 DAX (Direct Access) 的工具(cxl, daxctl, lstopo),用于查看设备信息、管理命名空间等。
  2. Fabric 管理: 这部分列出了用于管理 CXL Fabric 的工具,包括通用的实验室工具(Jack Rabbit Labs)、厂商提供的特定 API 和工具,以及一些特定的 fabric 管理软件(fm_cxl, cxl-fabric-manager)。其中一些可能是技术预览或需要额外补丁。
  3. 内存分层工具: 这部分涉及利用 CXL 内存进行分层的软件和 BIOS 设置。包括 Linux 内核的 AutoNUMA、numactl 工具,以及内核支持的特定 CXL 内存特性(如 TPP、加权 NUMA 交织)。此外还提到了 MemVerge 的内存管理软件以及 Intel 和 AMD 平台相关的 BIOS 选项。
  4. 遥测工具: 这部分列出了用于监控 CXL 内存和系统性能的工具,包括 MemVerge 的软件、CPU 厂商提供的性能监控工具 (Intel PCM, AMD μProf),以及通用的 Linux 性能分析工具 (perf & eBPF)。
  5. 仿真工具: 重点提到了 QEMU 作为 CXL 仿真的平台,支持 CXL 的内存扩展、共享和动态容量设备等特性,其中一些高级特性可能需要补丁或处于技术预览阶段。

Fig-3 CXL 内存扩展的3种方案

Fig-3 CXL 内存扩展的3种方案

图片展示了应用程序如何利用 CXL 技术来处理大型数据集的三种主要方式:内存扩展、内存池化和内存共享。

  1. 内存扩展 (Memory Expansion):
    • 这是最简单的模式,将 CXL 内存设备直接连接到单个主机,作为额外的内存资源。
    • 通过操作系统(在图中表示为内核层的 NUMA 节点)将 CXL 内存呈现给应用程序。
    • 应用程序本身可能是未修改的,由操作系统或特定的内存管理软件(如 MemVerge Memory Machine)负责利用新增的 CXL 内存进行数据存储。这实质上是增加了主机的总内存容量。
  2. 内存池化 (Memory Pooling):
    • 这种模式允许多个主机共享一个或多个 CXL 内存设备,这些设备组合成一个内存池。
    • 主机通过 Fabric 连接到这个内存池。
    • 每个主机可以根据需要从内存池中动态分配一部分内存来使用。图中显示主机 #1 通过一个内存设备(Memory Appliance)访问 CXL 内存设备,这些设备共同组成了内存池。这提高了内存资源的利用率和灵活性。
  3. 内存共享 (Memory Sharing):
    • 这种模式允许多个主机直接访问和共享同一块 CXL 内存区域。
    • 应用程序(图中标识为 ShMem Application)通过共享内存机制(在 Linux 中通常通过 /dev/shmem 这样的设备表示)访问共享的 CXL 内存设备。
    • 这种方式适用于需要多个应用程序或多个主机之间高速、低延迟地共享数据的场景,例如分布式数据库或高性能计算。

延伸阅读

• 文章:《SMART Modular:CXL Factor 动态》

• 主要内容:介绍了CXL技术在内存扩展中的应用,特别是在2024/2025年阶段,CXL 1.1和2.0版本被用于支持服务器的内存扩展。通过CXL扩展卡或E3.S模块,服务器可以增加更多的内存容量,提高灵活性和效率,降低系统成本达50%-60%。同时讨论了CXL 3.1版本在内存共享中的应用,支持直接和交换式的内存共享连接,使得不同的计算资源(如CPU、GPU等)可以通过CXL 3.1实现更加动态和高效的内存共享,进一步提升系统性能和资源利用率。

• 文章:《Xconn:CXL 2.0 交换机实现内存共享》

• 主要内容:描述了CXL 2.0技术在内存池化中的应用,多个服务器可以通过CXL 2.0交换机连接到一个整合了交换功能的内存池设备中,实现内存资源的动态分配和高效利用,提升系统性能和资源利用率。


Fig-4 Type 3 形态下 CXL 内存访问方式

Fig-4 Type 3 形态下 CXL 内存访问方式

图片详细展示了 CXL Type 3 .mem 设备在系统架构中的集成方式,从硬件到用户空间的层次结构,并暗示了其发展演变。

  1. 硬件层集成: 底部描绘了不同类型的 CXL 内存设备,包括标准的 CXL 内存设备、动态容量设备 (DCD)、共享内存设备和持久性 CXL 内存设备。硬件层面负责内存的交织和分区,这可以通过 BIOS、CXL 开关或特定的设备(如 JBGPA, Appliance)实现。不同的设备或区域被分配到不同的“区域”(Region)。
  2. 中间件集成: 通过运行在用户态的中间件将 CXL 内存呈现为 NUMA 节点(无论是系统内存还是 CXL 设备)或 DAX (Direct Access) 设备(通过 /dev/daxX.Y 字符设备)或持久性内存设备(通过 /dev/pmemX.Y 块设备)。内核处理内存的访问(包括读写),并提供管理 CXL 设备和区域的命令(如 cxl list, cxl create-region 等)。操作系统可以选择将 CXL 内存作为 System RAM 的补充或作为 DAX 设备使用。
  3. 用户空间直接访问: 顶层是应用程序。应用程序可以通过标准的内存分配函数(如 malloc())、内存映射(如 mmap())或文件 I/O(对持久性内存设备上的文件系统进行读写)来访问 CXL 内存。应用程序可以是未修改的,依赖于操作系统或中间件/SDK(如 numactl, libc/libnuma)来利用 CXL 内存;也可以是专门为利用 CXL 特性而优化的应用程序。

图详细解释了 CXL Type 3 内存设备的软件/硬件栈,说明了数据如何在不同层之间流动,以及操作系统和管理工具如何将 CXL 内存抽象并暴露给应用程序,从而实现内存的扩展、池化和共享等高级功能。它也突显了多种访问方式(NUMA, DAX, 块设备)和管理手段(内核命令,用户空间工具)。

Note

硬件系统创新伴随着从硬件环境集成、系统级软件定义,到最后的直接访问,这一过程需要经历大量软件适配和场景检验,不是一蹴而就的。目前来看,不少服务器厂商在硬件集成层面(如BIOS)已增加对CXL的支持,但场景还非常有限,究其原因在于:现阶段可直接读取CXL内存的文件系统和用户态软件,仍需要大量改造工作,这无形中阻碍CXL的广泛应用。

CPU、内存和 GPU 性能基准测试

Fig-5 系统性能压测和观测工具

Fig-5 系统性能压测和观测工具

图片介绍如何对包含 CPU、内存、GPU 和 CXL 组件的系统进行性能基准测试和可观测性分析。

  1. 系统组件: 图的中心展示了 CPU 连接到 DRAM、CXL,并与 GPU 相连,反映了现代异构计算系统的架构,其中 CXL 作为 CPU 和其他设备(如 CXL 内存)之间的高速互连。
  2. 性能测试工具: 图片列出了用于衡量系统不同方面性能的工具:
    • 基准测试工具: 用于运行特定的测试来衡量带宽、计算能力等,包括针对 NVIDIA GPU 的 nvbandwidth 和 CUDA 示例,以及专门用于 CXL 和通用应用程序的基准测试工具。
    • 可观测性工具: 用于实时或事后监控系统资源使用和性能指标。这部分工具按组件分类,涵盖了 GPU(如 nvtop, nsys)、CPU 和内存(如 mpstat, htop, iostat, AMD μProf),以及 NUMA 相关的统计信息(如 numastat, perf, Intel PCM, AMD μProf)。
  3. NUMA 测试矩阵: 右侧的“测试矩阵”暗示了在进行性能测试时,需要考虑系统的 NUMA (Non-Uniform Memory Access) 拓扑结构,尤其是在多插槽 CPU 系统中,内存访问延迟和带宽会因 NUMA 节点的不同而异。

图片展示了两个实际的基准测试示例,用于衡量系统中的内存带宽性能,特别是与 GPU 计算相关的场景。

  1. NVIDIA nvbandwidth 示例: 左侧的例子使用 NVIDIA 提供的 nvbandwidth 工具来测试从 CPU (主机) 到 GPU (设备) 使用 memcpy_ce (一种复制引擎) 的内存复制带宽。命令的输出显示了工具版本、系统环境信息(CUDA 运行时和驱动版本、GPU 型号)以及测得的带宽值(约为 25.17 GiB/s)。它也提示可能需要额外的系统调优来达到理论峰值带宽。
  2. CUDA Bandwidth_Check 示例: 右侧的例子展示了如何运行一个 CUDA 示例程序 (./main) 来检查带宽,并结合使用了 numactl 工具将进程绑定到特定的 CPU 和内存节点(这里是节点 1)。循环执行多次是为了获取一系列测量结果。输出显示了每次运行测得的带宽值,这些值都在 25 GiB/s 附近波动。这个例子强调了在多 NUMA 节点系统中,利用 numactl 进行进程和内存绑定对于性能测试和优化是重要的。

Fig-7 CXL 扩展下的系统性能

Fig-7 CXL 扩展下的系统性能

图片展示了三星 CMM-B 内存池化设备如何应用于计算工作负载,特别是通过加速 TPC-C 基准测试来体现其性能优势。

  1. 系统架构: 左侧的架构图描绘了 CMM-B 系统如何作为一个独立的内存设备(或内存设备),通过 CXL.mem 接口连接到多个计算系统。一个单独的管理控制台通过网络对这个内存设备进行管理。三星 CXL 内存模块盒中包含多个 CXL 内存模块 (E1.S CMM-D)。
  2. 性能优势: 中间和右侧的图表对比了使用传统 DRAM 和使用基于 CXL 的 MemVerge Memory Machine X 时的性能。在针对数据库工作负载的 TPC-C 基准测试中,使用 CXL 内存池化方案(Memory Machine X)相比仅使用 DRAM,在不同的客户端数量下,实现了更高的每秒事务数 (TPS) 和更低的 P95 延迟。
  3. 量化效益: 图片明确列出了使用该方案带来的量化效益:每秒事务数提高高达 60%,P95 延迟降低高达 40%。这表明 CXL 内存池化能够显著提升这类计算密集型应用的性能。
  4. 测试环境: 底部提供了进行基准测试的系统配置细节,包括 CPU 型号、核心数量、DRAM 总量和规格、CXL 内存总量以及使用的操作系统和软件版本。

Note

比DRAM更大请求量、更低时延的结论,应该是建立在两组对照实验上:

  • 单 512GB DRAM的测试环境,此数据为右图 DRAM 基线性能数据;
  • 512GB DRAM+ 512GB CXL DRAM,CXL扩展后的分级缓存环境。 否则从Xconn的时延数据来看,CXL设备的性能与DRAM之间仍存在明显差距。

《XConn:CXL内存应用的带宽和时延》

  • 主要内容:文章详细分析了CXL技术的访问时延,指出直连CXL访存时延是直连内存的2倍,跨节点访问直连CXL内存是直连内存时延的3倍,CXL池化内存的访问时延是直连内存的4倍,跨节点访问CXL池化内存是直连内存时延的6倍。文章还提到,不同平台上的CXL内存访问时延测试数据表明,平台2的跨节点CXL访存时延较低,可能是由于CPU之间的通信优化。

内存布局与移动策略

Fig-8 CXL 数据分层策略,延迟or带宽优先

Fig-8 CXL 数据分层策略,延迟or带宽优先

图片展示了在异构内存系统(如包含 DRAM 和 CXL 内存)中管理数据放置和移动的两种主要策略:延迟优化和带宽优化。

  1. 内存分层概念: 图中核心思想是将不同性能(通常是延迟和带宽)的内存设备组织成不同的“层级”。应用程序的数据可以根据其访问模式或特性,被放置在最适合的层级上。
  2. 延迟优化分层: 这种策略侧重于最小化数据访问延迟。它通过识别“热”数据(频繁访问的数据)和“冷”数据(不频繁访问的数据)来工作。热数据被智能地放置在速度更快、延迟更低的内存层级(如 DRAM),而冷数据则可以移动到容量更大、成本更低但延迟较高的层级(如 CXL 内存),以最大化性能并有效利用资源。
  3. 带宽优化: 这种策略侧重于最大化数据传输带宽。它根据不同内存层级之间的带宽能力比例来决定数据的放置。例如,如果 DRAM 和 CXL 内存之间存在一定的带宽比,那么数据也会按照这个比例分布到这两个层级上,以优化整体的带宽利用率。这种策略可能适用于需要高吞吐量的应用。

图片通过对比这两种策略,解释了如何根据不同的性能目标(低延迟 vs. 高带宽)来智能地管理应用程序数据在异构内存系统(利用了 CXL)中的位置和迁移,从而提升整体系统性能。这体现了利用 CXL 等技术构建分层内存系统的软件管理复杂性和优化方向。


Fig-9 加权NUMA 内存管理策略

Fig-9 加权NUMA 内存管理策略

图片介绍了“加权 NUMA 交织”这一内存管理策略,该策略旨在优化带宽利用率,尤其适用于包含 CXL 设备的异构内存环境。

  1. 策略目标与可用性: 加权 NUMA 交织是由 MemVerge 和 SK hynix 贡献到 Linux 内核(6.9 及更新版本)的新功能。它的核心目的是在由不同类型的内存(如 DRAM 和通过 CXL 连接的内存)组成的系统中,更有效地利用总带宽。
  2. 工作原理: 该策略允许系统管理员或应用程序根据需求为不同的 NUMA 节点(这些节点对应于不同的内存设备)设置“权重”。内存分配时,系统会根据这些权重比例在各个节点上分配页面,而不是简单地在所有节点间平均交织。权重可以理解为每轮分配中,各个节点获得页面数量的比例。
  3. 性能考量: 图 1 的“冰球杆曲线”显示了吞吐量和延迟之间的典型关系:在达到一定吞吐量之前,延迟变化不大,但一旦超过某个阈值(即带宽开始饱和),延迟会急剧增加。这表明带宽是影响性能的关键因素,尤其是在高负载下。加权交织通过优化带宽利用来应对这一挑战。

图片介绍了 Linux 内核中 NUMA 服务质量 (QoS) 的概念和实现方式。

  1. 功能与目的: NUMA QoS 是一项在 Linux 内核 6.8 及更新版本中提供的功能。它允许应用程序不再仅仅根据节点的物理位置选择内存分配,而是可以根据每个 NUMA 节点的实际性能特征(如带宽和延迟)来做出更智能的决策。这对于在具有不同性能属性的异构内存系统(例如包含 CXL 内存的系统)中优化应用程序性能非常重要。
  2. 性能特征暴露: 内核通过 /sys 文件系统将每个 NUMA 节点对本地发起者(通常是 CPU)的性能特征暴露出来。这些信息位于特定的路径下,例如 /sys/devices/system/node/nodeY/access0/initiators/,其中 nodeY 代表具体的 NUMA 节点。在这个路径下,可以找到诸如 read_bandwidthread_latencywrite_bandwidthwrite_latency 等文件,它们提供了该节点内存的读取和写入性能指标。
  3. 应用程序如何使用: 应用程序或其上层的库和中间件可以读取 /sys 文件系统中暴露的这些性能数据,然后利用这些信息决定将数据分配到哪个 NUMA 节点,从而达到优化性能或满足特定 QoS 要求的目的。

NUMA QoS 提供了一种机制,使得操作系统和应用程序能够感知并利用不同 NUMA 节点的性能差异来指导内存分配,这对于在日益复杂的、包含 CXL 等技术的异构内存系统中实现精细化的性能调优和资源管理至关重要。


延伸思考

这次分享的内容就到这里了,或许以下几个问题,能够启发你更多的思考,欢迎留言,说说你的想法~

  • CXL技术在AI/ML领域还有哪些潜在的应用场景?
  • 如何评估CXL内存的投资回报率?
  • 在实际应用中,如何选择合适的内存布局和移动策略?

#CXL内存扩展 #CXL软件生态

原文标题:CXL for AI/ML: A Practical Guide to Unleashing AI and ML Performance

Notice:Human's prompt, Datasets by Gemini-2.0-flash-thinking

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-30,如有侵权请联系 cloudcommunity@tencent 删除实践数据系统性能内存

CXL 实践指南:关于内存扩展,需要知道的是...

全文概览

在人工智能(AI)和机器学习(ML)领域,数据处理的需求呈指数级增长,对内存容量和性能提出了前所未有的挑战。传统的DRAM解决方案在成本、容量和扩展性方面面临瓶颈。Compute Express Link(CXL)作为一种新兴的互连技术,通过提供高速、低延迟的连接,为解决这些挑战带来了新的希望。本文深入探讨了CXL技术在AI/ML应用中的潜力,并提供了一份实践指南,旨在帮助读者了解如何利用CXL技术释放AI和ML的性能。

本文将介绍CXL的软件生态,包括Linux内核和QEMU对CXL的支持进展,以及各种有用的工具和软件。同时,我们将探讨应用程序如何利用CXL技术来处理大型数据集,包括内存扩展、内存池化和内存共享等方式。此外,本文还将介绍如何对包含CPU、内存、GPU和CXL组件的系统进行性能基准测试和可观测性分析。最后,我们将探讨在异构内存系统中管理数据放置和移动的策略,包括延迟优化和带宽优化。通过本文的阅读,读者将能够全面了解CXL技术在AI/ML领域的应用,并掌握利用CXL技术提升AI和ML性能的实践方法。

阅读收获

  • 了解CXL技术在AI/ML领域的应用前景和优势。
  • 掌握利用CXL技术进行内存扩展、池化和共享的方法。
  • 熟悉CXL相关的软件工具和性能测试方法。
  • 理解异构内存系统中数据放置和移动策略。

CXL 的软件生态

Fig-1 Linux 内核与QEMU技术路线图

Fig-1 Linux 内核与QEMU技术路线图

路线图展示了 Linux 内核和 QEMU 对 Compute Express Link (CXL) 规范不同版本的支持进展。

  • CXL 版本支持: 路线图涵盖了从 CXL 1.1 到最新的 CXL 3.1 版本。随着时间的推移,新的 CXL 规范版本逐渐得到支持。
  • Linux 内核支持: 从主流内核版本 5.18 开始,逐步增加了对 CXL 的支持,引入了 Kernel TPP,在 6.9 版本中引入了 Kernel Weighted Interleaving 预计在6.12版本,引入 CXL Dynamic Capacity Device Support 特性。
  • QEMU 支持: QEMU 在 7.2 版本初步引入了 CXL 2.0 的支持,包括基础的 CXL 开关、内存交织和 Type 3 设备支持。在 8.0 版本进行了重大扩展,增加了对 CXL 2.0 HDM 解码器和 QoS 能力结构的支持。随后的版本继续改进和扩展 CXL 支持,例如在 9.0 版本引入了对 Type 1 和 Type 2 设备的额外支持以及 MMIO 缓存,并在 9.1 版本添加了对 CXL 3.0 Type 3 设备及相关能力的支持。

如何理解QEMU在CXL发展中发挥的作用?

QEMU 对 CXL 功能的支持在推动 CXL 应用落地阶段发挥了非常关键的作用,主要体现在以下几个方面:

  1. 为软件开发提供平台:
    • 在 CXL 硬件广泛可用之前,软件开发者(包括操作系统驱动开发者、中间件开发者和应用开发者)需要一个环境来编写、测试和调试利用 CXL 功能的代码。
    • QEMU 通过模拟 CXL 设备(如 CXL Type 1/2/3 设备、CXL 开关等),为这些开发者提供了一个可行的开发和测试平台。他们可以在 QEMU 虚拟机中运行 Linux 内核(包含 CXL 驱动),开发和验证应用程序如何与模拟的 CXL 内存、设备进行交互。
  2. 加速软件生态系统成熟:
    • 新的硬件技术需要配套的软件生态系统才能被广泛应用。QEMU 的仿真使得与 CXL 相关的操作系统驱动、虚拟化层支持(如通过 vI/O 将模拟的 CXL 设备暴露给客户机)、管理工具等软件组件能够并行甚至超前于硬件开发进行。
    • QEMU 对不同 CXL 版本(2.0, 3.0)和不同特性(内存交织、Type 3 设备、HDM 解码器、QoS、MMIO 缓存)的支持,意味着开发者可以在 QEMU 中逐步实现和测试这些复杂的 CXL 功能在软件层面的处理逻辑。
  3. 降低开发和测试门槛:
    • 真实的 CXL 硬件,特别是早期版本和复杂配置(如涉及开关、多个设备、内存池)的硬件,可能昂贵且不易获取。
    • QEMU 提供了更经济、更易于配置和管理的虚拟环境,使得更多开发者和研究人员能够参与 CXL 相关的软件开发和功能验证,无需依赖昂贵的物理硬件。

Fig-2 CXL 相关的工具和软件

Fig-2 CXL 相关的工具和软件

图片列举了与 CXL (Compute Express Link) 技术相关的各种有用的工具和软件,并将它们分为了几个主要类别:

  1. 管理工具: 包含了一些标准的 Linux 命令(如 dmesg, lspci)以及专门用于管理 CXL 设备和 DAX (Direct Access) 的工具(cxl, daxctl, lstopo),用于查看设备信息、管理命名空间等。
  2. Fabric 管理: 这部分列出了用于管理 CXL Fabric 的工具,包括通用的实验室工具(Jack Rabbit Labs)、厂商提供的特定 API 和工具,以及一些特定的 fabric 管理软件(fm_cxl, cxl-fabric-manager)。其中一些可能是技术预览或需要额外补丁。
  3. 内存分层工具: 这部分涉及利用 CXL 内存进行分层的软件和 BIOS 设置。包括 Linux 内核的 AutoNUMA、numactl 工具,以及内核支持的特定 CXL 内存特性(如 TPP、加权 NUMA 交织)。此外还提到了 MemVerge 的内存管理软件以及 Intel 和 AMD 平台相关的 BIOS 选项。
  4. 遥测工具: 这部分列出了用于监控 CXL 内存和系统性能的工具,包括 MemVerge 的软件、CPU 厂商提供的性能监控工具 (Intel PCM, AMD μProf),以及通用的 Linux 性能分析工具 (perf & eBPF)。
  5. 仿真工具: 重点提到了 QEMU 作为 CXL 仿真的平台,支持 CXL 的内存扩展、共享和动态容量设备等特性,其中一些高级特性可能需要补丁或处于技术预览阶段。

Fig-3 CXL 内存扩展的3种方案

Fig-3 CXL 内存扩展的3种方案

图片展示了应用程序如何利用 CXL 技术来处理大型数据集的三种主要方式:内存扩展、内存池化和内存共享。

  1. 内存扩展 (Memory Expansion):
    • 这是最简单的模式,将 CXL 内存设备直接连接到单个主机,作为额外的内存资源。
    • 通过操作系统(在图中表示为内核层的 NUMA 节点)将 CXL 内存呈现给应用程序。
    • 应用程序本身可能是未修改的,由操作系统或特定的内存管理软件(如 MemVerge Memory Machine)负责利用新增的 CXL 内存进行数据存储。这实质上是增加了主机的总内存容量。
  2. 内存池化 (Memory Pooling):
    • 这种模式允许多个主机共享一个或多个 CXL 内存设备,这些设备组合成一个内存池。
    • 主机通过 Fabric 连接到这个内存池。
    • 每个主机可以根据需要从内存池中动态分配一部分内存来使用。图中显示主机 #1 通过一个内存设备(Memory Appliance)访问 CXL 内存设备,这些设备共同组成了内存池。这提高了内存资源的利用率和灵活性。
  3. 内存共享 (Memory Sharing):
    • 这种模式允许多个主机直接访问和共享同一块 CXL 内存区域。
    • 应用程序(图中标识为 ShMem Application)通过共享内存机制(在 Linux 中通常通过 /dev/shmem 这样的设备表示)访问共享的 CXL 内存设备。
    • 这种方式适用于需要多个应用程序或多个主机之间高速、低延迟地共享数据的场景,例如分布式数据库或高性能计算。

延伸阅读

• 文章:《SMART Modular:CXL Factor 动态》

• 主要内容:介绍了CXL技术在内存扩展中的应用,特别是在2024/2025年阶段,CXL 1.1和2.0版本被用于支持服务器的内存扩展。通过CXL扩展卡或E3.S模块,服务器可以增加更多的内存容量,提高灵活性和效率,降低系统成本达50%-60%。同时讨论了CXL 3.1版本在内存共享中的应用,支持直接和交换式的内存共享连接,使得不同的计算资源(如CPU、GPU等)可以通过CXL 3.1实现更加动态和高效的内存共享,进一步提升系统性能和资源利用率。

• 文章:《Xconn:CXL 2.0 交换机实现内存共享》

• 主要内容:描述了CXL 2.0技术在内存池化中的应用,多个服务器可以通过CXL 2.0交换机连接到一个整合了交换功能的内存池设备中,实现内存资源的动态分配和高效利用,提升系统性能和资源利用率。


Fig-4 Type 3 形态下 CXL 内存访问方式

Fig-4 Type 3 形态下 CXL 内存访问方式

图片详细展示了 CXL Type 3 .mem 设备在系统架构中的集成方式,从硬件到用户空间的层次结构,并暗示了其发展演变。

  1. 硬件层集成: 底部描绘了不同类型的 CXL 内存设备,包括标准的 CXL 内存设备、动态容量设备 (DCD)、共享内存设备和持久性 CXL 内存设备。硬件层面负责内存的交织和分区,这可以通过 BIOS、CXL 开关或特定的设备(如 JBGPA, Appliance)实现。不同的设备或区域被分配到不同的“区域”(Region)。
  2. 中间件集成: 通过运行在用户态的中间件将 CXL 内存呈现为 NUMA 节点(无论是系统内存还是 CXL 设备)或 DAX (Direct Access) 设备(通过 /dev/daxX.Y 字符设备)或持久性内存设备(通过 /dev/pmemX.Y 块设备)。内核处理内存的访问(包括读写),并提供管理 CXL 设备和区域的命令(如 cxl list, cxl create-region 等)。操作系统可以选择将 CXL 内存作为 System RAM 的补充或作为 DAX 设备使用。
  3. 用户空间直接访问: 顶层是应用程序。应用程序可以通过标准的内存分配函数(如 malloc())、内存映射(如 mmap())或文件 I/O(对持久性内存设备上的文件系统进行读写)来访问 CXL 内存。应用程序可以是未修改的,依赖于操作系统或中间件/SDK(如 numactl, libc/libnuma)来利用 CXL 内存;也可以是专门为利用 CXL 特性而优化的应用程序。

图详细解释了 CXL Type 3 内存设备的软件/硬件栈,说明了数据如何在不同层之间流动,以及操作系统和管理工具如何将 CXL 内存抽象并暴露给应用程序,从而实现内存的扩展、池化和共享等高级功能。它也突显了多种访问方式(NUMA, DAX, 块设备)和管理手段(内核命令,用户空间工具)。

Note

硬件系统创新伴随着从硬件环境集成、系统级软件定义,到最后的直接访问,这一过程需要经历大量软件适配和场景检验,不是一蹴而就的。目前来看,不少服务器厂商在硬件集成层面(如BIOS)已增加对CXL的支持,但场景还非常有限,究其原因在于:现阶段可直接读取CXL内存的文件系统和用户态软件,仍需要大量改造工作,这无形中阻碍CXL的广泛应用。

CPU、内存和 GPU 性能基准测试

Fig-5 系统性能压测和观测工具

Fig-5 系统性能压测和观测工具

图片介绍如何对包含 CPU、内存、GPU 和 CXL 组件的系统进行性能基准测试和可观测性分析。

  1. 系统组件: 图的中心展示了 CPU 连接到 DRAM、CXL,并与 GPU 相连,反映了现代异构计算系统的架构,其中 CXL 作为 CPU 和其他设备(如 CXL 内存)之间的高速互连。
  2. 性能测试工具: 图片列出了用于衡量系统不同方面性能的工具:
    • 基准测试工具: 用于运行特定的测试来衡量带宽、计算能力等,包括针对 NVIDIA GPU 的 nvbandwidth 和 CUDA 示例,以及专门用于 CXL 和通用应用程序的基准测试工具。
    • 可观测性工具: 用于实时或事后监控系统资源使用和性能指标。这部分工具按组件分类,涵盖了 GPU(如 nvtop, nsys)、CPU 和内存(如 mpstat, htop, iostat, AMD μProf),以及 NUMA 相关的统计信息(如 numastat, perf, Intel PCM, AMD μProf)。
  3. NUMA 测试矩阵: 右侧的“测试矩阵”暗示了在进行性能测试时,需要考虑系统的 NUMA (Non-Uniform Memory Access) 拓扑结构,尤其是在多插槽 CPU 系统中,内存访问延迟和带宽会因 NUMA 节点的不同而异。

图片展示了两个实际的基准测试示例,用于衡量系统中的内存带宽性能,特别是与 GPU 计算相关的场景。

  1. NVIDIA nvbandwidth 示例: 左侧的例子使用 NVIDIA 提供的 nvbandwidth 工具来测试从 CPU (主机) 到 GPU (设备) 使用 memcpy_ce (一种复制引擎) 的内存复制带宽。命令的输出显示了工具版本、系统环境信息(CUDA 运行时和驱动版本、GPU 型号)以及测得的带宽值(约为 25.17 GiB/s)。它也提示可能需要额外的系统调优来达到理论峰值带宽。
  2. CUDA Bandwidth_Check 示例: 右侧的例子展示了如何运行一个 CUDA 示例程序 (./main) 来检查带宽,并结合使用了 numactl 工具将进程绑定到特定的 CPU 和内存节点(这里是节点 1)。循环执行多次是为了获取一系列测量结果。输出显示了每次运行测得的带宽值,这些值都在 25 GiB/s 附近波动。这个例子强调了在多 NUMA 节点系统中,利用 numactl 进行进程和内存绑定对于性能测试和优化是重要的。

Fig-7 CXL 扩展下的系统性能

Fig-7 CXL 扩展下的系统性能

图片展示了三星 CMM-B 内存池化设备如何应用于计算工作负载,特别是通过加速 TPC-C 基准测试来体现其性能优势。

  1. 系统架构: 左侧的架构图描绘了 CMM-B 系统如何作为一个独立的内存设备(或内存设备),通过 CXL.mem 接口连接到多个计算系统。一个单独的管理控制台通过网络对这个内存设备进行管理。三星 CXL 内存模块盒中包含多个 CXL 内存模块 (E1.S CMM-D)。
  2. 性能优势: 中间和右侧的图表对比了使用传统 DRAM 和使用基于 CXL 的 MemVerge Memory Machine X 时的性能。在针对数据库工作负载的 TPC-C 基准测试中,使用 CXL 内存池化方案(Memory Machine X)相比仅使用 DRAM,在不同的客户端数量下,实现了更高的每秒事务数 (TPS) 和更低的 P95 延迟。
  3. 量化效益: 图片明确列出了使用该方案带来的量化效益:每秒事务数提高高达 60%,P95 延迟降低高达 40%。这表明 CXL 内存池化能够显著提升这类计算密集型应用的性能。
  4. 测试环境: 底部提供了进行基准测试的系统配置细节,包括 CPU 型号、核心数量、DRAM 总量和规格、CXL 内存总量以及使用的操作系统和软件版本。

Note

比DRAM更大请求量、更低时延的结论,应该是建立在两组对照实验上:

  • 单 512GB DRAM的测试环境,此数据为右图 DRAM 基线性能数据;
  • 512GB DRAM+ 512GB CXL DRAM,CXL扩展后的分级缓存环境。 否则从Xconn的时延数据来看,CXL设备的性能与DRAM之间仍存在明显差距。

《XConn:CXL内存应用的带宽和时延》

  • 主要内容:文章详细分析了CXL技术的访问时延,指出直连CXL访存时延是直连内存的2倍,跨节点访问直连CXL内存是直连内存时延的3倍,CXL池化内存的访问时延是直连内存的4倍,跨节点访问CXL池化内存是直连内存时延的6倍。文章还提到,不同平台上的CXL内存访问时延测试数据表明,平台2的跨节点CXL访存时延较低,可能是由于CPU之间的通信优化。

内存布局与移动策略

Fig-8 CXL 数据分层策略,延迟or带宽优先

Fig-8 CXL 数据分层策略,延迟or带宽优先

图片展示了在异构内存系统(如包含 DRAM 和 CXL 内存)中管理数据放置和移动的两种主要策略:延迟优化和带宽优化。

  1. 内存分层概念: 图中核心思想是将不同性能(通常是延迟和带宽)的内存设备组织成不同的“层级”。应用程序的数据可以根据其访问模式或特性,被放置在最适合的层级上。
  2. 延迟优化分层: 这种策略侧重于最小化数据访问延迟。它通过识别“热”数据(频繁访问的数据)和“冷”数据(不频繁访问的数据)来工作。热数据被智能地放置在速度更快、延迟更低的内存层级(如 DRAM),而冷数据则可以移动到容量更大、成本更低但延迟较高的层级(如 CXL 内存),以最大化性能并有效利用资源。
  3. 带宽优化: 这种策略侧重于最大化数据传输带宽。它根据不同内存层级之间的带宽能力比例来决定数据的放置。例如,如果 DRAM 和 CXL 内存之间存在一定的带宽比,那么数据也会按照这个比例分布到这两个层级上,以优化整体的带宽利用率。这种策略可能适用于需要高吞吐量的应用。

图片通过对比这两种策略,解释了如何根据不同的性能目标(低延迟 vs. 高带宽)来智能地管理应用程序数据在异构内存系统(利用了 CXL)中的位置和迁移,从而提升整体系统性能。这体现了利用 CXL 等技术构建分层内存系统的软件管理复杂性和优化方向。


Fig-9 加权NUMA 内存管理策略

Fig-9 加权NUMA 内存管理策略

图片介绍了“加权 NUMA 交织”这一内存管理策略,该策略旨在优化带宽利用率,尤其适用于包含 CXL 设备的异构内存环境。

  1. 策略目标与可用性: 加权 NUMA 交织是由 MemVerge 和 SK hynix 贡献到 Linux 内核(6.9 及更新版本)的新功能。它的核心目的是在由不同类型的内存(如 DRAM 和通过 CXL 连接的内存)组成的系统中,更有效地利用总带宽。
  2. 工作原理: 该策略允许系统管理员或应用程序根据需求为不同的 NUMA 节点(这些节点对应于不同的内存设备)设置“权重”。内存分配时,系统会根据这些权重比例在各个节点上分配页面,而不是简单地在所有节点间平均交织。权重可以理解为每轮分配中,各个节点获得页面数量的比例。
  3. 性能考量: 图 1 的“冰球杆曲线”显示了吞吐量和延迟之间的典型关系:在达到一定吞吐量之前,延迟变化不大,但一旦超过某个阈值(即带宽开始饱和),延迟会急剧增加。这表明带宽是影响性能的关键因素,尤其是在高负载下。加权交织通过优化带宽利用来应对这一挑战。

图片介绍了 Linux 内核中 NUMA 服务质量 (QoS) 的概念和实现方式。

  1. 功能与目的: NUMA QoS 是一项在 Linux 内核 6.8 及更新版本中提供的功能。它允许应用程序不再仅仅根据节点的物理位置选择内存分配,而是可以根据每个 NUMA 节点的实际性能特征(如带宽和延迟)来做出更智能的决策。这对于在具有不同性能属性的异构内存系统(例如包含 CXL 内存的系统)中优化应用程序性能非常重要。
  2. 性能特征暴露: 内核通过 /sys 文件系统将每个 NUMA 节点对本地发起者(通常是 CPU)的性能特征暴露出来。这些信息位于特定的路径下,例如 /sys/devices/system/node/nodeY/access0/initiators/,其中 nodeY 代表具体的 NUMA 节点。在这个路径下,可以找到诸如 read_bandwidthread_latencywrite_bandwidthwrite_latency 等文件,它们提供了该节点内存的读取和写入性能指标。
  3. 应用程序如何使用: 应用程序或其上层的库和中间件可以读取 /sys 文件系统中暴露的这些性能数据,然后利用这些信息决定将数据分配到哪个 NUMA 节点,从而达到优化性能或满足特定 QoS 要求的目的。

NUMA QoS 提供了一种机制,使得操作系统和应用程序能够感知并利用不同 NUMA 节点的性能差异来指导内存分配,这对于在日益复杂的、包含 CXL 等技术的异构内存系统中实现精细化的性能调优和资源管理至关重要。


延伸思考

这次分享的内容就到这里了,或许以下几个问题,能够启发你更多的思考,欢迎留言,说说你的想法~

  • CXL技术在AI/ML领域还有哪些潜在的应用场景?
  • 如何评估CXL内存的投资回报率?
  • 在实际应用中,如何选择合适的内存布局和移动策略?

#CXL内存扩展 #CXL软件生态

原文标题:CXL for AI/ML: A Practical Guide to Unleashing AI and ML Performance

Notice:Human's prompt, Datasets by Gemini-2.0-flash-thinking

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-30,如有侵权请联系 cloudcommunity@tencent 删除实践数据系统性能内存

本文标签: CXL 实践指南关于内存扩展,需要知道的是