NetDIMM: Low-Latency Near-Memory Network Interface Architecture

文章标题:NetDIMM: 低延迟近内存网络接口架构
作者/机构:Mohammad Alian, Nam Sung Kim, 伊利诺伊大学厄巴纳-香槟分校

A1 主要贡献

本文旨在解决数据中心网络中两个核心瓶颈:PCIe互连的高延迟开销和网络软件栈中的数据移动开销。传统的网络设计主要关注带宽,但现代数据中心应用(如内存缓存、高性能计算)对延迟极为敏感。研究指出,PCIe子系统的延迟可以占到整体通信延迟的77.2%至90.6%。此外,在DMA缓冲区和应用程序内存空间之间复制数据也构成了显著的性能瓶颈。

为了应对这些挑战,本文提出了一种名为NetDIMM(Network attached DIMM)的新型近内存网络接口卡(NIC)架构。NetDIMM的核心思想是将NIC芯片集成到双列直插内存模组(DIMM)的缓冲设备中,并利用高速DDR5内存通道将NIC与处理器互连,从而完全取代高延迟的PCIe链路。

图1:当前主流网络接口架构与NetDIMM的对比
图1:当前主流网络接口架构与NetDIMM的对比

研究目标与核心创新点如下
* 消除PCIe瓶颈:NetDIMM使用内存通道替代PCIe链路来连接NIC和处理器,从根本上消除了PCIe带来的延迟开销。
* 内存内加速网络栈数据移动:通过将NIC置于靠近DRAM模组的位置,NetDIMM加速了NIC和DRAM之间的DMA传输。更重要的是,它支持内存内缓冲区克隆(in-memory buffer cloning),从而高效地完成网络栈中的数据移动,避免了传统的CPU介入的数据复制。
* 应用透明的网络栈加速:NetDIMM在只需对Linux内核进行最小修改的情况下运行内核软件栈,因此可以无缝支持未经修改的用户空间应用程序,实现了对应用的透明加速。
* 减少网络流量对内存的干扰:NetDIMM利用其本地内存通道传输数据包,减少了对主机内存通道的占用。此外,通过将数据包的头部和载荷分离处理,减少了对片上CPU缓存资源的污染。

如图1所示,与传统的PCIe NIC和集成式NIC(iNIC)相比,NetDIMM通过消除昂贵的PCIe事务并利用NIC与DRAM的物理邻近性进行数据移动,显著改善了通信延迟。评估结果显示,与采用PCIe NIC的基线网络相比,NetDIMM平均将单包延迟降低了49.9%。

A3 背景知识与设计动机

2.1 网络架构

服务器网络硬件架构。在一台典型的服务器中,NIC通过PCIe链路连接到处理器。现代NIC普遍采用数据直接I/O(DDIO)技术【9, Intel Data Direct I/O Technology (Intel DDIO): A Primer】来减少收发网络数据包时的内存带宽占用。DDIO允许NIC的DMA引擎直接将接收到的数据包传输到处理器末级缓存(LLC)中的一个专用区域,而不是主存DRAM。同样,在发送数据包时,DMA引擎也直接从LLC中读取数据。然而,DDIO区域通常只占LLC容量的一小部分(约10%),在高收发速率下很容易被耗尽。此外,多个网络功能共享DDIO空间可能导致DMA泄漏【68, ResQ: Enabling SLOs in Network Function Virtualization, 2018, NSDI】,并且如果没有上限限制,DDIO可能污染其他应用程序的缓存【67, DMA cache: Using on-chip storage to architecturally separate I/O data from CPU data for improving I/O performance, 2010, HPCA】。

图2:服务器网络架构
图2:服务器网络架构

数据包收发流程。以太网NIC使用主存中的环形缓冲区(即描述符环)来解耦处理器和NIC之间的数据包生产与消费速率。为实现超低延迟,网络通常部署在轮询模式【5, Data Plane Development Kit; 51, Architectural breakdown of end-to-end latency in a TCP/IP network, 2009, International journal of parallel programming】下以避免中断处理的开销。数据包的传输(TX)和接收(RX)流程如下:
* 发送(TX):(T1) 驱动程序的发送函数被调用。 (T2) 驱动程序通过写NIC配置寄存器来设置DMA传输。 (T3) NIC的DMA设备从DRAM(或LLC)中获取下一个可用的TX描述符,然后执行另一次DMA将数据包传输到NIC。 (T4) 数据包通过以太网链路发送出去,并更新TX环的尾指针。
* 接收(RX):(R0) 目的NIC接收到数据包。 (R1) NIC从DRAM或LLC中获取下一个可用的RX描述符。 (R2) 数据包通过DMA传输到RX描述符的缓冲区。 (R3) 更新RX描述符环的信息。 (R4) 轮询驱动程序被通知有新包到达。 (R5) 创建一个新的套接字缓冲区(SKB),用RX环缓冲区中的数据进行初始化,移除以太网头部,然后将剩余部分发送到上层网络协议栈。

2.2 异步内存访问

NVDIMM技术。非易失性双列直插内存模组(NVDIMM)技术利用内存通道这一系统中最快的互连方式,为主机提供持久化和高容量的内存。根据JEDEC标准,NVDIMM分为三种类型:
1. NVDIMM-N:由字节可寻址的DRAM和备用的NAND闪存组成。主机内存控制器只与DRAM部分交互,其访问时延与普通DDR DIMM相同。
2. NVDIMM-F:直接向处理器暴露NAND闪存,没有DRAM。由于闪存时延较长,内存通道需要降速以匹配其时序。
3. NVDIMM-P:采用一种新颖的内存通道协议,支持异步、乱序的内存访问完成,结合了NVDIMM-N和NVDIMM-F的优点。它同时向主机地址空间暴露DRAM和NAND闪存。

图3:(a) NVDIMM-P架构, (b) NVDIMM-P的异步内存访问
图3:(a) NVDIMM-P架构, (b) NVDIMM-P的异步内存访问

DDR5对异步访问的支持。由于NAND闪存等持久性存储介质的访问时序与DRAM不同,传统的DDR协议无法直接访问。DDR5规范被设计用来支持异构介质,允许常规DIMM和NVDIMM-P混合使用。为了支持NVDIMM-P,DDR5规范引入了异步内存事务【1, A prelude to nonvolatile DIMM technology. Future of NVDIMM-P】。如图3(b)所示,对NVDIMM-P的读访问延迟是不确定的。一个读请求以一个包含完整地址和请求ID的读命令(XRD)开始。与DRAM操作不同,每个NVDIMM-P请求都有一个ID以支持乱序完成。当数据准备好后,NVDIMM-P通过响应引脚(RSP)发出一个就绪命令(RDY),并附上原始请求ID。内存控制器随后发出发送命令(SEND)来读取数据,数据最终连同请求ID一起出现在数据总线(DQ)上。

2.3 Linux内存管理

内存地址映射。系统通过解码物理地址的不同位来计算其在DRAM中的通道、Rank、Bank、行和列。内存映射有三种模式:
1. 单通道模式:内存通道位映射到物理地址的最高位,连续地址被映射到同一个内存通道。
2. 多通道模式:连续的内存地址在多个内存通道之间交错存储。
3. Flex模式:提供灵活的内存映射配置,允许部分地址空间工作在多通道模式,其余部分在单通道模式。这对于安装了不同类型DIMM(如DDR5和NVDIMM-P)的非对称内存配置特别有用【16, Single- and Multichannel Memory Modes, Intel】。

Linux内核内存分配。Linux将具有相同属性的物理内存位置分组到不同的区域(zone)中。主要的内存区域包括:ZONE_DMA(用于DMA)、ZONE_DMA32(用于32位设备的DMA)、ZONE_HIGHMEM(高地址内存)【7, High memory, Wikipedia】和ZONE_NORMAL(常规映射页)。kmalloc()函数用于在内核中分配内存,类似于用户空间的malloc()。此外,Linux提供了一系列API用于以页为单位进行内存分配,例如核心函数__alloc_pages(),这些API在网络栈中被广泛用于分配套接字缓冲区的页区域【62, TCP/IP Architecture, Design, and Implementation in Linux, 2009, John Wiley & Sons】。

3. 设计动机

PCIe和数据拷贝的开销。传统的客户端-服务器应用中,完成一次请求-响应交互需要16次单向PCIe事务。尽管已有研究尝试减少PCIe事务数量【34, Network Interface Design for Low Latency Request-Response Protocols, 2013, USENIX ATC; 50, Platform IO DMA transaction acceleration, 2011, CACHES; 52, A new server I/O architecture for high speed networks, 2011, HPCA】,但它们仍然无法避免PCIe的往返延迟。CPU和NIC的集成(iNIC)是一个有前景的方案。如图4所示,与离散式NIC(dNIC)相比,iNIC将网络延迟降低了21.3%至38.6%。这明确显示了移除CPU和NIC之间PCIe链路的好处。

图4:不同NIC配置下各种大小数据包的单向延迟比较
图4:不同NIC配置下各种大小数据包的单向延迟比较

零拷贝的优势与局限性。通过让NIC直接访问应用程序缓冲区(零拷贝),可以进一步降低延迟。对于iNIC,零拷贝技术将10字节和2000字节数据包的延迟分别降低了28.8%和52.3%。然而,零拷贝网络存在几个严重问题:(L1)可能引入安全漏洞【63, Performance review of zero copy techniques, 2012, IJCSS】,并且固定应用程序页面可能导致主存耗尽,虚拟内存操作的开销也可能抵消其收益【27, ZeroCopy: Techniques Benefits and Pitfalls】。(L2)将功能完备的NIC集成到CPU中会显著增加处理器的面积和功耗。(L3)在高网络速率下,iNIC会污染片上资源(如LLC),并对其他并发应用造成内存干扰。对于只依赖包头信息的网络功能(如转发),将整个数据包载荷存入片上资源是一种浪费【32, {VFP}: A Virtual Switch Platform for Host {SDN} in the Public Cloud, 2017, NSDI】。

图5:不同内存压力水平下的Iperf带宽
图5:不同内存压力水平下的Iperf带宽

网络流量对内存系统的干扰。为了说明网络流量对内存和缓存造成的干扰,我们进行了一项实验,使用Intel内存延迟检查器(MLC)【40, Intel Memory Latency Checker v3.5】向内存子系统注入不同速率的请求。如图5所示,iperf【10, Iperf: The ultimate speed test tool for TCP, UDP and SCTP】的TCP带宽随着MLC造成的内存压力增加而显著下降。在最大内存压力下(每内存通道15.1GBps),iperf的带宽仅为无干扰时的27.9%。这表明网络性能对内存子系统的干扰非常敏感,反之亦然。

选择内存通道作为新互连。理想的架构应完全移除PCIe事务,并通过一个更低延迟的互连来交换数据,同时不损害网络带宽并减少内存干扰。内存通道是现代服务器中延迟最低的片外互连,并提供高带宽(例如DDR4通道带宽为12.8GBps)。此外,它是一个成熟的标准互连技术。基于这些特性,我们提出将NIC放置在DIMM的缓冲设备上,构建一个近内存NIC架构。该设计解决了dNIC和iNIC的所有局限性:(1) 利用内存通道消除PCIe开销;(2) 支持内存内缓冲区克隆;(3) 分离包头和载荷以减少LLC污染;(4) 使用独立的内存通道访问网络缓冲区以减少主机内存通道干扰。

A2 方法细节

4.1 NetDIMM 硬件架构

总体架构。NetDIMM是一种低延迟的近内存网络架构,它基于NVDIMM-P架构(见2.2节)和近内存处理概念,旨在改善处理器、内存和NIC之间的数据传输延迟。如图6所示,NetDIMM可以与传统的DDR5 DIMM混合安装在同一个内存通道上,这得益于DDR5对异步内存请求完成的支持【15, Overcoming System Memory Challenges with Persistent Memory and NVDIMM-P, JEDEC】。NetDIMM的组织结构类似于图3(a)中所示的NVDIMM-P。

图6:NetDIMM架构
图6:NetDIMM架构

NetDIMM缓冲设备内部结构。如图6(a)所示,NetDIMM缓冲设备包含以下主要组件:
* (nNIC):一个集成的网络接口卡。
* (nMC):一个或多个内存控制器,用于访问NetDIMM本地的DRAM模组。
* (nController):扩展了NVDIMM-P控制器的逻辑,增加了NetDIMM的路由和管理功能。
* (DDR5 PHY接口):DDR5物理接口和协议引擎,功能类似于典型的NVDIMM-P设备。
* (nCache):一个双端口SRAM缓冲区,用于缓存存储在本地DRAM模组中的接收(RX)数据。
* (nPrefetcher):一个下一行预取器,用于将RX数据包从本地DRAM预加载到nCache。
* (支持RowClone的DRAM):支持内存内数据复制的DRAM设备。

内存访问管理。NetDIMM的本地DRAM容量被暴露在主机内存地址空间中,由主机操作系统统一管理,这与NVDIMM-P的统一地址空间类似。由于nNIC和DDR5 PHY都可以通过nMC独立访问本地DRAM,nController负责在它们之间进行仲裁,并优先处理nNIC的访问。从主机内存控制器(MC)访问本地DRAM的延迟是不确定的,原因有二:(R1)主机MC不知道NetDIMM本地DRAM模组的状态;(R2)nMC在nNIC和PHY之间共享。

图7:从主机处理器角度看NIC内存访问的空间和时间局部性
图7:从主机处理器角度看NIC内存访问的空间和时间局部性

利用访问局部性。我们观察到主机处理器与NIC之间的内存访问模式具有很强的规律性、空间和时间局部性。如图7所示,接收一个1514字节的数据包会产生一连串对DMA缓冲区的内存请求,这些请求在很短的时间内访问连续的地址。NetDIMM中的nCache和nPrefetcher组件正是利用了这一特性来改善主机MC访问NetDIMM地址空间的延迟。

接收(RX)数据包处理。当nNIC从外部接收到一个数据包时,它会通知nController。nController执行与传统NIC中DMA引擎相同的功能,将数据包从nNIC的RX缓冲区转移到位于NetDIMM本地DRAM中的描述符环。在传输过程中,nController会将每个接收到的数据包的第一个缓存行(64字节)写入nCache。这样做的理由是,所有传输协议的头部大小都小于64字节,网络软件栈处理数据包通常只需要头部信息。对于转发、防火墙等网络功能,应用仅根据头部信息做决策,无需访问载荷。

载荷处理与预取。当接收到的数据包的载荷被访问时(例如,复制到用户空间缓冲区),NetDIMM的PHY会收到一连串对连续地址的读请求,其访问模式与图7所示类似。这种模式可以被一个简单的下一行预取器(nPrefetcher)轻松预测。nPrefetcher会预取接下来的n个缓存行并存入nCache。因此,即使NetDIMM不主动缓存RX数据包的载荷,在最坏情况下,读取整个RX数据包也最多只会经历一次nCache未命中。为了避免在仅访问头部时污染nCache,我们为nCache的每个缓存行添加了一个标志位。当新数据包的第一个缓存行存入nCache时,该位置位。nPrefetcher检查此标志,仅在标志未置位时才进行预取。

主机读写请求处理。当收到来自全局内存通道的读请求时,nController会检查请求的数据是否在nCache中。如果命中,数据将立即从nCache读出并发送给主机MC。如果未命中,nController会向nMC创建一个读请求,数据从本地DRAM读出后,使用2.2节中描述的异步协议发送给主机。写请求则绕过nCache,直接排队到nMC的写队列中。

nCache设计细节。nCache是一个包容性的组相联缓存结构。它的数据在被访问一次后即被移除,因为RX数据包被读取后会存储在主机处理器的缓存或主存的其他位置,短期内再次被访问的可能性很小。当一个nCache组已满时,采用随机替换策略。nCache中的所有缓存行都是干净的,无需写回。为保证与本地DRAM数据的一致性,nController会监听来自PHY或nNIC的写请求地址,并使nCache中匹配的缓存行失效。

图8:内存内缓冲区克隆加速
图8:内存内缓冲区克隆加速

内存内缓冲区克隆。为了避免零拷贝驱动的弊端(见第3节),我们设计了一种内存内数据复制加速机制,以在NetDIMM上快速克隆应用缓冲区和DMA缓冲区。我们利用了RowClone【61, RowClone: Fast and EnergyEfficient In-DRAM Bulk Data Copy and Initialization, 2013, MICRO】机制的扩展实现。根据源和目的地址的位置,克隆操作有三种模式:
1. 快速并行模式 (FPM):源和目的页在同一个Bank的子阵列中。克隆可以通过连续两次激活源和目的页完成(图8中绿色箭头)。
2. 流水线串行模式 (PSM):源和目的页在同一个DRAM设备的不同Bank中。克隆通过在DRAM芯片内部总线上流水线复制缓存行来完成(图8中红色箭头)。
3. 通用克隆模式 (GCM):其他情况。NetDIMM将源数据读入缓冲设备,然后以流水线方式写回目的地址(图8中蓝色箭头)。
为了最大化内存内克隆的效益,智能地将源和目的页分配到同一个DRAM子阵列中至关重要。

4.2 NetDIMM 软件架构

软件栈修改概述。为了启用NetDIMM,我们对软件栈进行了必要的修改,同时力求将改动降至最低,以保持应用透明性。修改包括:实现一个新的Linux内存分配API、更改物理内存地址映射、以及实现一个NetDIMM驱动程序。TCP/IP协议层保持不变,仅修改了SKB的分配API。

4.2.1 处理NetDIMM本地内存区域

新的内存区域。我们将NetDIMM的本地DRAM容量暴露给主机处理器,使其成为主机物理内存地址空间的一部分,类似于NUMA系统中的一个内存节点。为了向Linux内核揭示这种内存系统的异构性,我们创建了一个名为NETi的新内存区域(zone),其中i是系统中NetDIMM的编号。

图9:(a) NetDIMM中一个内存rank的配置;(b) 物理内存地址映射;(c) 页面的物理位置示意图
图9:(a) NetDIMM中一个内存rank的配置;(b) 物理内存地址映射;(c) 页面的物理位置示意图

智能内存分配。为了最大化内存内缓冲区克隆的性能,我们需要将DMA和应用程序缓冲区分配在同一个Bank和子阵列上。如图9所示,基于一个典型的DRAM设备【56, Micron DDR4 SDRAM Datasheet, Micron】的组织结构,我们设计了NetDIMM的物理地址映射。通过这种映射,可以轻易判断两个4KB的页是否在物理上位于同一个子阵列(它们在地址空间中间隔128KB)。我们实现了一个新的API __alloc_netdimm_pages(zone, hint),它会尽力在指定的zone(即NETi)中分配一个与hint地址在同一个子阵列的页面。

图10:DDR5 DIMM和NetDIMM混合配置下的内存地址空间和通道交错模式
图10:DDR5 DIMM和NetDIMM混合配置下的内存地址空间和通道交错模式

内存通道交错。多通道内存系统中的地址交错可以提高内存吞吐量。然而,nNIC无法看到全局内存通道,因此NetDIMM的地址空间必须在单通道模式下暴露给主机。我们利用Flex通道交错模式(见2.3节),将物理地址空间划分为两部分:一部分包含所有常规DDR DIMM,工作在多通道模式;另一部分包含NetDIMM的地址空间,工作在单通道模式,如图10所示。

4.2.2 NetDIMM 驱动程序

驱动程序基础。我们以Intel e1000 GbE驱动为基础开发NetDIMM驱动。由于NetDIMM不是PCIe设备,我们使用ioremap() API为其创建一个配置空间,使其可以像传统PCIe NIC一样被配置,从而复用现有驱动的大部分逻辑。

缓冲区分配。在NIC接口初始化时,驱动程序创建的TX和RX描述符环及其对应的DMA缓冲区都必须分配在相应的NetDIMM内存区域(NETi)中。为了支持动态分配并提高性能,驱动程序预先从每个不同的子阵列中分配两个页面,并将它们存储在一个名为allocCache的哈希表中。这个缓存使得驱动程序可以快速地为数据包按需分配位于特定子阵列的DMA缓冲区,而allocCache的填充则在后台并发进行,不影响关键路径的性能。

连接与内存区域关联。为了让应用程序知道应在哪一个NETi区域分配缓冲区,我们在SKB头中增加了一个COPY_NEEDED标志。对于一个新连接的第一个数据包,该标志被设置,驱动程序会执行一次数据拷贝(慢速路径),并将该连接对应的socket结构中的skb_zone字段设置为正确的NETi。之后该连接的所有数据包都将直接在正确的NETi区域分配SKB(快速路径),无需拷贝。

轮询与数据克隆。NetDIMM驱动程序使用一个高分辨率内核定时器实现了一个高效的轮询代理。轮询NetDIMM比轮询PCIe NIC更高效,因为访问NetDIMM上的I/O寄存器速度更快。当轮询驱动检测到数据包到达后,会调用RX处理例程。驱动使用内存刷新(flush)和失效(invalidate)指令来保证处理器缓存和NetDIMM本地内存之间的一致性。netdimmClone(dst, src, size) API被用来触发内存内缓冲区克隆。

// 伪代码: NetDIMM驱动程序中的数据包收发处理

// 发送 (TX) 路径:
// 为txDesc[next]分配DMA缓冲区
if txSKB.COPY_NEEDED is true then  // 慢速路径
    // 将SKB数据拷贝到NetDIMM的DMA缓冲区
    set skb_zone for this socket to NETi
else
    flush txSKB.data to memory // 快速路径
end if
set txDesc[next].size and flags
// 触发硬件开始传输

// 接收 (RX) 路径:
invalidate rxDesc[next] // 确保从NetDIMM获取最新数据
// 分配RX SKB缓冲区
netdimmClone(rxSKB.data, rxDesc[next].dma, rxDesc[next].size) // 触发内存内克隆

// 轮询代理:
// 清理已成功传输的TX缓冲区
if new packet has arrived then
    // 调用RX处理例程
end if

算法1:NetDIMM驱动程序中的数据包收发处理。

4.3 NetDIMM 的物理可行性

功耗与散热考量。将一个功能完备的NIC集成到DIMM的缓冲设备中,其功耗和散热是需要考虑的关键问题。现有的产品和研究表明这是可行的。例如,IBM的Centaur DIMM (CDIMM)【54, The IBM z13 memory subsystem for big data, 2015, IBM Journal of Research and Development】,其缓冲设备在22nm工艺下的TDP为20W。相比之下,一个现代的Intel XXV710以太网控制器(含2x40Gbps端口)的TDP仅为6.5W【39, Intel Ethernet Controller X710/ XXV710/XL710 Datasheet, Intel】。因此,将NIC芯片集成到DIMM缓冲设备中在功耗上是可行的。此外,可以像NVDIMM【13, Micron’s NVDIMM Delivers Persistent Memory, Electronic Design】一样为NetDIMM提供外部电源线和网络接口。

A4 实验

5.1 实验环境

仿真平台。我们使用gem5模拟器【25, The gem5 simulator, 2011, ACM SIGARCH Computer Architecture News】,结合PCIe互连【20, Simulating PCI-Express Interconnect for Future System Exploration, 2018, IISWC】和内存控制器【37, Simulating DRAM controllers for future system architecture exploration, 2014, ISPASS】的分析模型来评估NetDIMM。为了精确测量延迟,我们实现了一套类似于低延迟用户空间驱动的裸机驱动。

表1:系统配置。

表1:系统配置
表1:系统配置

系统配置。如表1所示,模拟的系统配置包括一个2GHz的x86核心,三级缓存层次结构,以及一个三通道的DDR4-2400主内存系统。NetDIMM配置为一个内存通道,拥有16GB本地DDR4-2400 DRAM和一个256KB的nCache。所有NIC的带宽均为40Gbps。

工作负载。我们使用了来自三个Facebook生产集群的网络流量跟踪数据【42, Data Sharing on traffic pattern inside Facebook datacenter network, Facebook Research】,这三个集群分别用于数据库、Web服务器和Hadoop应用,具有不同的数据包大小分布和流量模式。我们还实现了两个典型的网络功能——L3转发(L3F)和深度包检测(DPI),以评估NetDIMM对服务器内存子系统性能的影响。

5.2 实验结果

图11:不同大小数据包在使用PCIe NIC(左)、集成NIC(中)和NetDIMM(右)时的单向网络延迟分解
图11:不同大小数据包在使用PCIe NIC(左)、集成NIC(中)和NetDIMM(右)时的单向网络延迟分解

网络延迟与带宽。图11展示了不同架构下的单向网络延迟分解。与传统的PCIe NIC相比,NetDIMM将64B、256B和1024B数据包的单向延迟分别降低了46.1%、52.3%和49.6%,延迟分别减少了0.97µs、1.33µs和1.54µs。与iNIC相比,NetDIMM通过消除PCIe链路显著减少了I/O寄存器访问开销。虽然NetDIMM引入了缓存刷新(txFlush)和失效(rxInvalidate)的开销(占总延迟的9.7%~15.8%),但其内存内缓冲区克隆带来的巨大优势足以弥补这些开销,并使得NetDIMM的平均延迟比iNIC还要低26.0%。在带宽方面,NetDIMM能够达到与PCIe NIC和iNIC相同的40Gbps带宽,因为单个DDR4通道的带宽(102.4Gbps)远高于此需求。

图12:(a) 不同网络交换延迟下的归一化每包网络延迟;(b) 运行DPI和L3F时,并发应用观察到的归一化内存访问延迟
图12:(a) 不同网络交换延迟下的归一化每包网络延迟;(b) 运行DPI和L3F时,并发应用观察到的归一化内存访问延迟

性能评估。图12(a)展示了在模拟的Facebook集群流量下,NetDIMM相对于PCIe NIC和iNIC的平均每包网络延迟。当交换机延迟从25ns增加到200ns时,NetDIMM相对于PCIe NIC的端到端延迟改善从40.6%下降到25.3%。Web服务器集群从NetDIMM中获益最多,因为其流量中超过90%是小于300字节的小包,而NetDIMM对小包的加速效果最显著。

对并发应用的影响。图12(b)显示了运行网络功能时,并发应用所经历的内存访问延迟。在运行DPI(需要处理整个数据包载荷)时,由于iNIC直接将数据包放入LLC,而NetDIMM需要从本地DRAM获取数据,NetDIMM导致内存访问时间增加了5.7%~15.4%。然而,在运行L3F(仅需处理包头)时,NetDIMM的nCache机制显著减少了对主机内存通道的访问,从而使内存访问延迟改善了9.8%~30.9%。综合来看,在Facebook的混合流量下,NetDIMM平均为数据库、Web服务器和Hadoop集群的并发应用分别带来了9.3%、2.4%和13.6%的内存访问延迟改善。

A7 相关工作

新型网络架构。先前的工作探索了多种减少网络延迟的方法。Kim等人【47, Increasing web server throughput with network interface data caching, 2002, ACM SIGPLAN Notices; 48, Network interface data caching, 2005, IEEE Trans. Comput.】提出在NIC内部缓存数据以减少PCIe流量。Flajslik等人【34, Network Interface Design for Low Latency Request-Response Protocols, 2013, USENIX ATC】的NIQ架构通过嵌入数据包到描述符等技术减少小包延迟。FlexNIC【46, High performance packet processing with flexnic, 2016, ACM SIGARCH Computer Architecture News】允许NIC执行简单的包处理操作。Liao等人【52, A new server I/O architecture for high speed networks, 2011, HPCA】和Larsen等人【50, Platform IO DMA transaction acceleration, 2011, CACHES】通过将DMA描述符管理移至处理器端来减少PCIe事务。Binkert等人【26, Integrated network interfaces for high-bandwidth TCP/IP, 2006, ACM Sigplan Notices】提出的SINIC将一个简单的NIC集成到处理器中。与这些工作相比,NetDIMM通过完全移除PCIe链路、将全功能NIC置于内存附近并实现内存内克隆,从根本上解决了传统网络子系统的所有开销。

内存通道上的网络接口。更接近NetDIMM思想的工作包括MINI【57, The memory-integrated network interface, 1995, IEEE Micro】、MEMONet【66, MEMOnet: Network interface plugged into a memory slot, 2000, CLUSTER】和DIMMNET-2【65, DIMMnet-2: A reconfigurable board connected into a memory slot, 2006, FPL】,它们都尝试将NIC直接连接到内存通道。然而,这些设计通常不共享主机和NIC的地址空间,需要显式地通过主机内存通道复制数据包,且大多只适用于单内存通道系统。NetDIMM则无缝地将其本地内存暴露给主机,最小化了数据移动,并支持多通道内存系统。

新型互连技术。OpenCAPI、CCIX和Gen-Z等新兴互连标准旨在紧密耦合处理器和加速器。然而,CCIX基于PCIe规范,继承了其缺点。尽管这些技术提供了高带宽,但它们作为点对点串行互连,其延迟无法与并行的DDR内存通道相媲美。相比之下,DDR标准已经发展了二十多年,是成熟且低延迟的内存互连技术。

A5 结论

几十年来,横向扩展网络系统的设计重点是优化带宽。然而,随着超低延迟数据中心应用的出现,对低延迟网络的需求日益凸显。本文基于近内存处理概念,并利用NVDIMM-P协议的异步内存访问特性,设计并评估了一种名为NetDIMM的近内存NIC架构。NetDIMM将一个功能完备的NIC集成到支持内存内缓冲区克隆的DIMM缓冲设备中。我们开发了相应的支持逻辑和设备驱动,使近内存NIC可供主机处理器上的应用程序使用。通过为NetDIMM的本地内存空间实现新的内存区域和Linux内核API,我们显著减少了处理网络数据包时的数据移动量。与传统的PCIe NIC相比,NetDIMM在不牺牲网络带宽的情况下,可将网络延迟最多降低52.3%。