1. 论文信息
所有作者及单位
- Donghyun Gouk, Sangwon Lee, Miryeong Kwon, Myoungsoo Jung. KAIST CAMELab.
2. Background
Memory disaggregation是什么?
一种服务器内存架构,其核心思想是将服务器内存从计算节点(CPU)上分离出来,形成一个可独立扩展的内存资源池,然后再根据需要将内存资源动态分配给各个计算节点使用。(将内存资源解耦,使多个计算节点可以访问一个集中式内存池,而不必依赖本地内存。)
远端直接内存访问RDMA怎么做的?
对于后端网络控制,大多数分解工作采用远程直接内存访问(RDMA)[4,5,11–13,15,16]或类似的定制DMA协议[7,9,10]。图1显示了RDMA式数据传输(单侧RDMA)的工作原理。对于主机和内存节点端,RDMA都需要RDMA NIC(RNIC[23])等硬件支持,其设计目的是尽可能消除网络软件堆栈的干预。
为了在它们之间移动数据,每一侧的进程首先需要定义一个或多个存储区域(MR)并让MR到达底层RNIC。在此期间,RNIC驱动程序检查与MR页面关联的所有物理地址,并将它们注册到RNIC的内存转换表(MTT)。
由于这两个RNIC还在初始化时交换其MR的虚拟地址,因此主机可以简单地将内存节点的目标虚拟地址与数据一起发送以进行写入。然后,远程节点通过参考其MTT来转换地址,并将传入数据复制到MR的目标位置。通过RDMA的读取也可以以类似的方式执行。请注意,除了内存复制操作(对于DMA)之外,每一方的应用程序还需要准备数据到MR中或从MR中检索数据以进行数据传输,从而在本地DRAM中引入额外的数据副本[24]。
(说到底就是需要复制很多次吧)
基于页面的内存池——SWAP
基于页面的内存分解[4-10]通过依赖虚拟内存系统实现内存弹性。具体来说,这种方法会在出现缺页异常时将数据交换到远程内存节点而不是底层存储。主机kswapd下的分解驱动程序将传入的块地址转换为内存节点的虚拟地址,目标页面复制到RNIC的MR并向内存节点发出相应的RDMA请求。
当对远程内存的请求过多时,由于页面错误处理、I/O 放大和上下文切换的开销,基于页面的系统会遭受性能下降[16]。
基于对象的存储池——KVS
基于对象的内存分解系统[11-16]使用自己的数据库(例如键值存储(KVS))直接干预RDMA数据传输。基于对象的系统为主机和内存节点端创建两个MR,每个MR处理缓冲区数据和提交/完成队列(SQ/CQ)。采用KV哈希表,其条目指向相应的(远程)内存对象。每当应用程序发出Put(或Get)请求时,系统会将相应的值放入主机的缓冲区MR中,并通过RDMA写入SQ MR的远程端来提交它。由于内存节点不断轮询SQ MR,因此它可以识别该请求。然后,内存节点通过RDMA将值复制到其缓冲区MR,并通过写入主机的CQ MR来完成请求。
这种方法受到限制,因为它需要对遗留应用程序进行大量的源代码级修改。而且访问不是直接的,是通过提交完成队列间接交互的。
CXL优势
FlexBus指的是CXL定义的互连架构。CXL.mem允许主机通过PCIe总线直接访问底层内存,而不是通过像PCIe这样的外设互连协议。(CXL基于PCI Express 5.0物理层,速度高达 32GT/s。)
CXL最初的设计目的是实现跨不同处理器复合体的异构管理的卓越性,但业界和学术界都预计其缓存一致性能力可以帮助提高内存利用率并以低延迟缓解内存过度配置[20-22]。
3. 其他学者解决这个问题的思路和缺陷
我们可以根据现有的内存分解运行时如何管理主机和内存服务器之间的数据,将其大致分为两种不同的方法:i)基于页面和ii)基于对象。基于页面的方法[4-10]利用虚拟内存技术来使用分解内存,而无需更改代码。在发生页面错误时,它通过网络将驻留在主机本地DRAM上的页面缓存数据与远程内存系统进行交换。另一方面,基于对象的方法使用自己的数据库(例如键值存储)从远程处理分解内存,而不是利用虚拟内存系统[11-16]。这种方法可以解决地址转换带来的挑战(例如,页面错误、上下文切换和写放大),但它需要大量的源代码级别修改和接口更改。
虽然有很多变体,但所有现有方法都需要通过远程直接内存访问(RDMA)[4,5,11–13,15,16](或类似的细粒度网络接口 [7,9,10,17])将数据从远程内存移动到主机内存。此外,它们甚至需要管理主机或内存节点中本地缓存的数据。不幸的是,数据移动及其伴随操作(例如页面缓存管理)引入了冗余内存副本和软件结构干预,这使得分解内存的延迟比本地DRAM访问的延迟长多个数量级。
4. 解决了什么问题
尽管CXL展现出以低成本和高性能实现内存分解的巨大潜力,但它尚未投入生产,并且没有平台将内存集成到内存池网络中。基于CXL的内存分解与直接访问。
5. 围绕该问题作者如何构建解决思路
5.1架构设计
CXL设备设计和实现为每个模块都能够拥有许多带有自己的硬件控制器的DRAM DIMM。我们的CXL设备采用多个DRAM控制器,通过传统DDR接口连接DRAM DIMM。然后,其CXL控制器通过许多PCIe通道将内部DRAM模块暴露给FlexBus。
在当前架构中,设备的CXL控制器解析传入的基于PCIe的CXL数据包(称为CXL flits),将其信息(地址和长度)转换为DRAM请求,并使用DRAM控制器从底层DRAM为它们提供服务。
5.2系统集成
图2显示了CXL设备的内部DRAM如何通过CXL映射(暴露)到主机的内存空间。
主机CPU的系统总线包含一个或多个CXL根端口(RP),它们连接一个或多个作为端点(EP)设备的CXL设备。
- 我们的主机端内核驱动程序首先通过PCIe事务查询基址寄存器(BAR)及其内部存储器(称为主机管理设备存储器(HDM))的大小来枚举CXL设备。
- 根据检索到的大小,内核驱动程序将BAR和HDM映射到主机的保留系统内存空间中,并让底层CXL设备知道它们的BAR和HDM(基地址)在主机系统内存中的映射位置。
- 当主机CPU通过load/store指令访问HDM系统内存时,请求会被传递到相应的RP,RP将请求转换为CXL flit。由于HDM映射到系统内存的不同位置,因此HDM的内存地址空间与EP内部DRAM的内存地址空间不同。因此,CXL控制器通过简单地从中扣除HDM的基地址来转换传入的地址,并将转换后的请求发送到底层DRAM控制器。结果通过CXL交换机和FlexBus返回至主机。请注意,由于HDM访问没有软件干预或内存数据副本,因此DIRECTCXL可以以较低的访问延迟向主机公开CXL设备的内存资源。
(意思是通过这一步,主机系统映射CXL.mem的地址了。)
5.3CXL网络交换机
图3a说明了DIRECTCXL如何使用一个或多个CXL设备从主机中分解内存资源,图3b显示了其中我们的CXL交换机组织。
主机的CXL RP直接连接到CXL交换机或CXL设备的上游端(USP)。CXL交换机的下游端口(DSP)还连接另一个CXL交换机的USP或CXL设备。请注意,我们的CXL交换机采用多个USP和DSP。通过设置内部路由表,我们的CXL交换机的结构管理器(FM)重新配置交换机的交叉开关,将每个USP连接到不同的 DSP,从而创建从根(主机)到终端(CXL设备)的虚拟层次结构。由于CXL设备可以采用一个或多个控制器和许多DRAM,因此它还可以定义多个逻辑设备,每个逻辑设备将其自己的HDM暴露给主机。这样,不同的主机可以连接到CXL交换机和CXL设备。请注意,每个CXL虚拟层次结构仅提供从一个到另一个的路径,以确保没有主机共享HDM。
5.4程序怎么看CXL的内存
与RDMA相比,一旦主机和CXL设备之间建立了虚拟层次结构,主机上运行的应用程序就可以通过引用HDM的内存空间直接访问CXL设备。然而,它需要软件运行时/驱动程序来管理底层CXL设备并在应用程序的内存空间中公开其HDM。因此,我们支持DIRECTCXL 运行时,它将HDM的地址空间简单地分成多个段,称为 cxl-namespace
。然后允许应用程序将每个CXL命名空间作为内存映射文件(mmap)进行访问。
为啥是映射文件????
图4显示了运行时的软件堆栈以及应用程序如何通过cxl命名空间使用分解内存。当检测到CXL设备时(在PCIe枚举时),DIRECTCXL驱动程序会创建一个入口设备(例如 /dev/directcxl
)以允许用户通过ioctl
管理cxl命名空间。如果用户向/dev/directcxl
请求cxl命名空间,则驱动程序会通过引用其HDM段表来检查HDM上的(物理)连续地址空间,该表的条目包括段的偏移量、大小和引用计数(记录如何许多cxl命名空间指示此段)。由于多个进程可以访问该表,因此其标头还保留必要的信息,例如自旋锁、读/写锁和表条目摘要(例如,有效条目号)。一旦DIRECTCXL驱动程序根据用户请求分配了一个段,它就会为mmap创建一个设备(例如 /dev/cxl-ns0
)并更新段表。用户程序可以使用mmap
和vm_area_struct
将cxl-namespace
映射到其进程虚拟内存空间。
请注意,DIRECTCXL软件运行时是为直接访问CXL设备而设计的,这与持久内存开发工具包(PMDK[25])的内存映射文件管理的概念类似。然而,它的命名空间管理比PMDK更简单、更灵活。例如,PMDK的命名空间与NVMe命名空间的理念非常相似,由文件系统或具有固定大小的DAX进行管理[26]。相比之下,我们的cxl命名空间更类似于传统的内存段,它直接暴露给应用程序而无需使用文件系统。
5.5原型实现
图5a说明了我们用于分解内存资源的CXL网络拓扑设计,实际系统中的相应实现如图5b所示。有n台计算主机通过CXL交换机连接m台CXL设备;在我们的原型中,n和m为4,但这些数字可以通过使用更多CXL开关来扩展。具体来说,每个CXL设备原型均基于我们定制的附加卡(AIC)CXL内存刀片构建,该刀片采用16nm FPGA和8个不同的DDR4 DRAM模块(64GB)。在FPGA中,我们制造了一个CXL控制器和八个DRAM控制器,每个控制器管理CXL端点和内部DRAM通道。到目前为止,还没有支持CXL的处理器架构,我们还使用RISC-V ISA构建自己的内部主机处理器,该处理器采用四个乱序核心,其末级缓存(LLC)实现CXL RP。每个支持CXL的主机处理器都在高性能数据中心加速卡中实现,充当主机的角色,可以单独运行Linux 5.13和DIRECTCXL。我们通过PCIe背板向四台主机公开四个CXL设备(32个DRAM模块)。我们通过多一个实现DIRECTCXL的CXL交换机的加速器卡来扩展背板。该交换机实现了FM,可以创建多个虚拟层次结构,每个虚拟层次结构以灵活的方式连接主机和CXL设备。
处理器端的CXL引擎和CXL交换机还没有商业化的CXL2.0 IP。因此,我们从头开始构建了所有DIRECTCXL IP。主机端处理器需要高级配置和电源接口(ACPI[27])来进行CXL2.0枚举(例如RP位置和RP的保留地址空间)。由于RISC-V尚不支持 ACPI,因此我们通过将此类信息添加到设备树中来启用CXL枚举[28]。
咦~