怎么用CXL加速数据库?· SIGMOD‘25

本文要介绍的是 SIGMOD’25 最佳工业论文《Unlocking the Potential of CXL for Disaggregated Memory in Cloud-Native Databases》。阿里云 PolarDB 团队基于 CXL 实现了 PolarDB 共享内存池,对比原有的 RDMA 方案实现了倍级性能提升。

背景

传统数据库是存算一体架构,如果要扩展资源,CPU 核、内存、存储必须一起扩,这带来了资源利用率低、成本高的问题。

比如,一台配置为 128 个 CPU 核 + 512 GB 内存 + 2 TB 存储的服务器上部署了一个数据库,业务高峰期只使用了 70% 的 CPU、60% 的内存,但存储已经接近 100%,必须再扩容一台服务器。这下,存储容量的问题解决了,但连带着增加了 CPU 和内存的成本,它们本无需扩容。

业界解决该问题的主要手段为分离池化,也即云原生架构。

存储率先完成了分离。目前,存算分离已成为云原生数据库的主流架构,实现了低成本存储扩容。随着软硬件的发展,分离内存也逐渐流行了起来,旨在提升内存利用率。

数据库中,Buffer Pool 是内存消耗的大头,它将热数据缓存在内存里,能够有效提升数据库的读写性能。但受限于单机内存容量,Buffer Pool 无法做到很大,而且多节点间无法共享,限制了性能的进一步提升。有了内存分离技术,我们就能构建一个更大的全局共享 Buffer Pool,实现多写架构,提供更高的读写吞吐量。

分离就意味着远程通信,传统的 TCP/IP 通信方式存在用户态和内核态多次上下文切换和数据拷贝。虽然 DPDK 加速 TCP 能够实现内核旁路,但需要 CPU 在用户态轮训处理数据包、解析协议栈,效率仍是不高。

所以,目前数据库实现内存分离的主流技术方案是基于 RDMA 通信,绕过 CPU 实现远程内存读写。但基于 RDMA 实现共享内存池的方案也有它的局限。

RDMA 共享内存池的局限

(一)读写放大

虽然 RDMA 性能比 TCP 更高,但比起本地 DRAM 内存访问,还是差了不少。所以,现有的基于 RDMA 内存分离数据库通常会设置本地 Buffer Pool,作为远端内存池的近端缓存。

然而,RDMA 属于消息语义,数据库通过 RDMA 读取远端内存池时,会以 page 为粒度,从而带来读写放大的问题。

当本地 Buffer Pool 缓存缺失时,读取 page 中的某一行,需要从远端加载对应的 page 到本地;更新 page 中的某一行,需要先从远端把对应的 page 加载到本地,本地更新后,再将 page 写回到远端。带来了很多非必要的 RDMA 带宽浪费。

CXL协议在PCIe配置空间的基础上进行了扩展,以支持其特有的功能,包括缓存一致性、共享内存访问和低延迟通信等。这些扩展通过引入新的配置结构和扩展功能来实现,使CXL设备能够在保持与PCIe兼容性的同时提供更高级的功能。 在PCIe中,配置空间用于设备的初始化、发现和功能配置。CXL在此基础上定义了额外的配置寄存器和能力结构,以支持CXL特定的功能。这些扩展通常通过设备的扩展能力(Extended Capability)结构实现,允许软件识别和配置CXL支持的高级特性。例如,CXL设备可以通过扩展配置空间提供对CXL.io、CXL.cache和CXL.mem协议层的支持信息[^2]。 具体来说,CXL的配置空间扩展包括以下几个方面: 1. **CXL能力结构**:CXL定义了新的能力结构,用于描述设备支持的CXL协议版本、支持的功能(如缓存一致性或内存共享)以及相关的控制和状态寄存器。这些结构可以通过PCIe的扩展能力机制进行访问,确保与现有PCIe软件栈的兼容性[^4]。 2. **DVSEC(Designated Vendor-Specific Extended Capability)**:CXL使用DVSEC机制来定义特定于CXL的扩展配置空间。DVSEC允许设备供应商定义自定义寄存器块,用于配置和控制CXL特有的功能。例如,DVSEC可以用于配置CXL.cache的缓存一致性域或管理CXL.mem的内存访问权限[^2]。 3. **CXL控制器配置**:CXL控制器的集成需要在配置空间中提供额外的寄存器,用于控制CXL链路的初始化、状态监控以及协议层的选择。例如,配置寄存器可以用于启用或禁用特定的CXL协议层(如CXL.io或CXL.cache),并设置其运行参数[^4]。 4. **内存池管理配置**:为了支持CXL.mem协议中的共享内存访问,CXL设备的配置空间还包括用于内存池管理的寄存器。这些寄存器可用于定义内存池的大小、访问权限以及地址映射规则,使主机和设备能够高效地共享内存资源[^4]。 以下是一个简化的示例代码片段,展示了如何通过PCIe的扩展能力机制访问CXL的配置空间: ```c #include <stdio.h> #include <pci/pci.h> int main() { struct pci_access *pacc; struct pci_dev *pdev; pacc = pci_alloc(); // 初始化PCI库 pci_init(pacc); // 初始化PCI访问 pci_scan_bus(pacc); // 扫描所有总线 // 假设找到一个CXL设备 pdev = pci_get_dev_by_slot(pacc, 0x00, 0x10, 0x00); // 示例设备地址 if (pdev) { pci_read_block(pdev, 0x100, buffer, sizeof(buffer)); // 读取扩展配置空间 // 解析buffer中的CXL能力结构和DVSEC信息 pci_free_dev(pdev); } pci_cleanup(pacc); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值