Reexamining Direct Cache Access to Optimize I/O Intensive Applications for Multi-hundred-gigabit Networks

Alireza Farshin, Amir Roozbeh+, Gerald Q. Maguire Jr., Dejan Kostić (KTH Royal Institute of Technology, School of Electrical Engineering and Computer Science (EECS) + Ericsson Research)

目录

  1. 引言:I/O 技术的演进
    1. 传统I/O
    2. 直接缓存访问 (Direct Cache Access, DCA)
    3. 英特尔数据直接I/O技术 (Intel Data Direct I/O, DDIO)
  2. 挑战:高速网络带来的压力
    1. 发展趋势
    2. 趋势带来的压力
    3. DCA的重要性
  3. 实验:高网络速率下的性能表现
    1. 在100 Gbps速率下转发数据包
    2. 在200 Gbps速率下会发生什么?
  4. 深入剖析 DDIO
    1. DDIO的工作原理
    2. DDIO 使用的 LLC Way 与缓存争用分析
  5. DDIO 的性能瓶颈与调优
    1. DDIO的性能表现与问题根源
    2. 减少描述符数量的局限性
    3. 通过 IIO LLC WAYS 寄存器进行调优
    4. 调优 DDIO 的影响
  6. DDIO 调优的局限性与未来展望
    1. 调整 DDIO 是否足够?
    2. 何时应绕过缓存:当前系统的情况
  7. 实践与关键发现
    1. 将知识应用于 200 Gbps 网络
    2. 处理时间对 DDIO 性能的影响
    3. 关键发现
    4. 其他见解
  8. 结论

1. 引言:I/O 技术的演进

1.1. 传统I/O

在传统的I/O模型中,数据处理流程如下:
1. I/O设备通过DMA*(直接内存访问)将数据包传输到主内存。
2. CPU稍后将这些数据包从主内存取回到缓存中进行处理。

这种方法的效率低下,具体表现为:
- 大量访问主内存
- 高昂的访问延迟(>60ns)
- 不必要的内存带宽占用

传统I/O数据流图及其低效性 (Page 3)
传统I/O数据流图及其低效性 (Page 3)

1.2. 直接缓存访问 (Direct Cache Access, DCA)

DCA技术旨在改善传统I/O的延迟问题:
1. I/O设备仍然通过DMA将数据包传输到主内存。
2. DCA利用TPH*(PCIe事务处理提示)将一部分数据包预取到缓存中。
3. CPU稍后可以直接从缓存中获取这些数据包。

然而,DCA仍然存在效率问题:
- 在内存带宽使用方面仍然效率低下,因为数据首先要写入主存。
- 需要操作系统干预和处理器的支持。

*TPH: PCIe Transaction protocol Processing Hint

直接缓存访问(DCA)工作原理及其不足 (Page 5)
直接缓存访问(DCA)工作原理及其不足 (Page 5)

1.3. 英特尔数据直接I/O技术 (Intel Data Direct I/O, DDIO)

为了解决上述问题,英特尔推出了DDIO技术:
- 自Xeon E5处理器起,DDIO已集成在至强处理器中。
- 它允许I/O设备将DMA数据包或描述符直接传入/传出处理器的末级缓存(Last Level Cache, LLC),从而绕过了主内存。

Intel DDIO工作原理 (Page 6)
Intel DDIO工作原理 (Page 6)

2. 挑战:高速网络带来的压力

2.1. 发展趋势

当前的技术趋势是:
- 越来越多的网络内计算(in-network computing)和卸载(offloading)能力。
- 这种趋势将昂贵的计算任务推向网络,而在处理器上执行有状态(stateful)的功能,这使得应用程序的I/O密集程度更高。

2.2. 趋势带来的压力

这些趋势,特别是不断增长的网络链路速度,带来了巨大压力:
- 更快的链路速度:网络速度已达到100G、400G甚至更高。在100 Gbps速率下,每6.72纳秒就有一个新的(64-B数据+20-B开销)数据包到达。
-
结论*:数百吉比特(Multi-hundred-gigabit)的网络无法容忍内存访问的延迟,并且数据包的到达间隔时间持续缩短。

*注:20B = 7B 前导码 + 1B 帧起始符 + 12B 帧间隙。

以太网速率发展趋势 (Page 8)
以太网速率发展趋势 (Page 8)

2.3. DCA的重要性

如果没有DCA(泛指DDIO这类直接缓存访问技术),我们将无法以线速处理I/O,从而在使用数百吉比特网络时导致丢包或延迟增加。

3. 实验:高网络速率下的性能表现

3.1. 在100 Gbps速率下转发数据包

实验设置:使用一个数据包生成器向被测设备(Device under Test)发送流量,被测设备负责转发数据包。
- 被测设备配置
- CPU: Intel Xeon Gold 6140
- NIC: Mellanox ConnectX-5
- 每个NIC放置在PCIe 3.0 16x插槽中
-
实验结果*:
- 在100 Gbps速率下,第99百分位的延迟约为1050微秒。

*一个PCIe 3.0 16x插槽能够提供约125 Gbps的全双工带宽。

100 Gbps转发实验设置与结果 (Page 10)
100 Gbps转发实验设置与结果 (Page 10)

3.2. 在200 Gbps速率下会发生什么?

实验设置扩展为使用两个100 Gbps的NIC,总速率为200 Gbps。
- 实验结果
- 当总速率达到200 Gbps时,为其中一个100 Gbps NIC测得的延迟比其单独工作时高出30%。第99百分位的延迟上升到约1350微秒,这表明存在性能瓶颈或资源竞争。

200 Gbps转发实验设置与结果,显示延迟增加30% (Page 11)
200 Gbps转发实验设置与结果,显示延迟增加30% (Page 11)

4. 深入剖析 DDIO

4.1. DDIO的工作原理

为了深入了解DDIO的行为,研究者设计了一套微基准测试(micro-benchmarks),旨在回答以下关键问题:
- DDIO具体使用哪些缓存路(ways)进行数据分配?
- DDIO如何与其他应用程序交互(是否存在干扰)?
- 通过远程CPU插槽(remote CPU socket)进行的DMA是否会污染本地LLC?

写入数据包/描述符:
- 写命中/更新:如果目标缓存行已存在于LLC的任何路(way)中,DDIO会直接覆写该缓存行。
- 写分配/未命中:否则,DDIO会在LLC的一个有限部分分配一个新的缓存行来存放入站数据。

读取数据包/描述符:
- 读命中:如果目标缓存行已存在于LLC的任何路中,NIC会直接从缓存中读取。
- 读未命中:否则,NIC会从主内存中读取。

DDIO读写机制 (Page 14)
DDIO读写机制 (Page 14)

4.2. DDIO 使用的 LLC Way 与缓存争用分析

本节通过实验探究直接数据I/O(DDIO)技术如何使用末级缓存(LLC),以及其与核心上运行的其他应用之间的缓存争用情况。

实验设置

实验环境包含一个运行I/O应用的核心C0和一个运行缓存敏感型应用的核心C1。逻辑LLC共有11个way。网络接口卡(NIC)通过DDIO收发数据包,这些数据包会被直接写入LLC的特定区域。同时,我们使用英特尔的缓存分配技术(CAT)来限制C1上运行的缓存敏感型应用(来自Splash-3基准测试的water_nsquared)可以使用的LLC way。

实验初始设置,包含I/O应用和缓存敏感型应用。
实验初始设置,包含I/O应用和缓存敏感型应用。

缓存争用分析

通过调整分配给缓存敏感型应用(C1)的LLC way,并观察I/O应用(C0)的缓存未命中(Cache Misses)总数,可以揭示争用情况。

  1. 初始阶段:当为C1分配远离DDIO区域的LLC way时(例如,way 1-2,2-3,3-4),I/O应用的缓存未命中数维持在约300万的较低水平。

  2. 与代码/数据的争用:当分配给C1的LLC way(例如,way 4-5)靠近某个区域时,I/O应用的缓存未命中数显著上升至近600万。这表明,当应用程序的代码/数据占用的缓存区域与I/O应用的工作集发生重叠或冲突时,会导致I/O应用的缓存性能急剧下降。

    Page 22: 当分配给缓存敏感应用的LLC way与I/O应用的代码/数据区域发生争用时,I/O应用的缓存未命中数显著增加。
    Page 22: 当分配给缓存敏感应用的LLC way与I/O应用的代码/数据区域发生争用时,I/O应用的缓存未命中数显著增加。

  3. 中间阶段:当为C1分配中间区域的LLC way时(例如,way 6-7,7-8,8-9),I/O应用的缓存未命中数回落到较低水平,表明此区域的争用较小。

  4. 与I/O数据的争用:当分配给C1的LLC way(例如,way 9-10,10-11)移动到LLC的另一端时,I/O应用的缓存未命中数再次急剧上升,甚至超过了之前的峰值,达到约600万至800万。

    Page 27: 当分配给缓存敏感应用的LLC way与DDIO使用的I/O数据区域发生争用时,I/O应用的缓存未命中数再次显著增加。
    Page 27: 当分配给缓存敏感应用的LLC way与DDIO使用的I/O数据区域发生争用时,I/O应用的缓存未命中数再次显著增加。

结论

实验结果表明,DDIO倾向于使用LLC中特定的一部分way(在此例中为way 10和11)来存放网络数据包。当其他应用程序(无论是其代码/数据还是其自身)被分配到与DDIO区域或I/O应用工作集区域重叠的缓存way时,就会发生严重的性能争用,导致I/O应用的缓存未命中率大幅增加。

Page 28: 实验最终揭示DDIO使用的特定LLC way,并指出与I/O的争用会导致I/O应用的缓存未命中增加。
Page 28: 实验最终揭示DDIO使用的特定LLC way,并指出与I/O的争用会导致I/O应用的缓存未命中增加。

5. DDIO 的性能瓶颈与调优

5.1. DDIO的性能表现与问题根源

研究表明,DDIO并非总能提供预期的性能优势。

  • 根据ResQ [NSDI'18]和英特尔的报告,DDIO可能无法带来预期的好处。
  • 问题根源:采用写分配(Write-allocate)策略的DDIO可能会将尚未处理已经处理过的数据包从LLC中驱逐出去。
  • 这导致CPU需要从主内存而不是LLC中读取数据包,从而增加了延迟。
  • 一种常见的缓解策略:减少接收(RX)描述符的数量,使得数据包缓冲区能够完全容纳在有限的DDIO缓存分区内。

5.2. 减少描述符数量的局限性

然而,仅仅减少描述符数量并不足以解决DDIO的性能问题。

  • 性能瓶颈:实验数据显示,增加RX描述符的数量和数据包的大小会对DDIO的性能(写命中率)产生负面影响。如下图所示,随着RX描述符数量从128增加到4096,所有数据包大小(256-B, 512-B, 1024-B, 1500-B)下的DDIO写命中率都出现了下降,尤其是对于较大的数据包和较多的描述符。
  • 容量限制:DDIO无法有效利用分配给它的全部LLC预留容量。
    • 例如,即使为DDIO分配了2/11的LLC way(相当于4.5 MB),其实际有效使用的容量远小于此(图中高亮处显示有效数据量约375 KB远小于4.5 MB),导致命中率在缓冲区大小远未达到理论上限时就开始下降。

Page 30: DDIO写命中率与RX描述符数量和数据包大小的关系图。
Page 30: DDIO写命中率与RX描述符数量和数据包大小的关系图。

此外,在I/O密集型应用中,增加核心数量并不总能改善PCIe指标。如下图所示,随着核心数量从4个增加到18个,DDIO的写命中率反而下降。这是因为当使用18个核心,每个核心配置256个接收(RX)描述符来转发1500字节的数据包时,总数据量(约6.59 MB)会超过末级缓存(LLC)的容量(例如4.5 MB),导致缓存命中率降低。

因此,一个理想的DDIO实现应该能够在具有大量RX描述符的情况下依然保持良好性能。

图表显示DDIO写命中率随核心数增加而下降。Page 31
图表显示DDIO写命中率随核心数增加而下降。Page 31

5.3. 通过 IIO LLC WAYS 寄存器进行调优

通过调整一个很少被讨论的寄存器——IIO LLC WAYS,可以显著提升DDIO的性能。该寄存器的默认值为0x600

如下图所示,通过在该寄存器中设置更多的比特位(即将值从0x600增加到0x7FF),可以有效提高DDIO的读写命中率。图中展示了逻辑上的末级缓存(Logical LLC)分区,调整该寄存器实质上是为I/O流量分配了更多的缓存路(ways)。

图表显示增加IIO LLC WAYS寄存器的比特位能提升DDIO命中率。Page 32
图表显示增加IIO LLC WAYS寄存器的比特位能提升DDIO命中率。Page 32

5.4. 调优 DDIO 的影响

DDIO对缓存命中率的影响会根据应用的特性,进一步影响到应用层面的性能。

以一个I/O密集型应用为例:使用2个核心在100 Gbps速率下转发1500字节的数据包。实验结果表明,通过在IIO LLC WAYS寄存器中设置更多的比特位(例如从2位增加到8位),可以显著降低应用的99百分位延迟(尾延迟)。如下图所示,当RX描述符数量增加时,设置更多比特位(如图中的6 bits和8 bits)的配置表现出更低且更稳定的延迟。

图表展示了调整DDIO对应用延迟的影响。Page 33
图表展示了调整DDIO对应用延迟的影响。Page 33

进一步分析上图可以发现,设置更多的比特位能够有效降低尾延迟。例如,在RX描述符数量为2048时,将设置的比特数从2位增加到8位,可以带来大约30%的尾延迟降低。

图表高亮显示设置更多比特位可将尾延迟降低30%。Page 34
图表高亮显示设置更多比特位可将尾延迟降低30%。Page 34

6. DDIO 调优的局限性与未来展望

6.1. 调整 DDIO 是否足够?

仅仅调整DDIO并非完美的解决方案,原因如下:
* 缓存竞争:缓存不仅用于I/O数据,还用于存放代码和应用数据。
* 配额限制:每个核心的缓存配额较小。
* 分区粒度:缓存分区是粗粒度的。

为了应对这些挑战,下一代DCA(Direct Cache Access)技术应提供以下功能:
* 细粒度放置 (Fine-grained placement):类似于CacheDirector技术,能够更精确地控制数据在缓存中的位置。
* I/O隔离 (I/O isolation):将现有的CAT+ (Cache Allocation Technology) 和CDP++ (Code/Data Prioritization) 技术扩展到I/O领域。
* 选择性DCA/DMA (Selective DCA/DMA):只将数据包中相关的部分传输到末级缓存(LLC)。

6.2. 何时应绕过缓存:当前系统的情况

如果DMA操作可能导致重要的I/O数据被从缓存中驱逐,那么DMA就不应该直接写入缓存。

在需要性能隔离的多租户或多应用环境中,绕过缓存是有益的。实现这一目标的方法包括:
* 为特定的PCIe端口禁用DDIO。
* 利用远程socket(remote socket)进行数据传输。

7. 实践与关键发现

7.1. 将知识应用于 200 Gbps 网络

实验证明,调整DDIO可以改善200 Gbps网络环境下的数据包处理性能。如下图所示,在一个由多个100 Gbps网卡聚合到200 Gbps速率的测试平台中,与默认配置或禁用DDIO相比,经过调整的DDIO配置(例如设置4个比特位)可以获得更低的99百分位延迟。

这一结果表明,对于数百Gbps级别的网络,必须采用更优的缓存管理策略。

图表展示了在200Gbps速率下,调整DDIO对延迟的改善效果。Page 37
图表展示了在200Gbps速率下,调整DDIO对延迟的改善效果。Page 37

7.2. 处理时间对 DDIO 性能的影响

实验通过在一个测试设备中改变处理时间(通过调用随机数生成器的次数)来观察其对DDIO性能的影响。结果显示,增加处理时间可以提高DDIO的命中率。

图表展示增加处理时间(调用次数)可以提高DDIO的命中率。Page 41
图表展示增加处理时间(调用次数)可以提高DDIO的命中率。Page 41

然而,如下图所示,虽然增加处理时间能提高DDIO命中率,但同时也会导致系统总吞吐量的下降。

这引出一个重要结论:DDIO的性能在应用是I/O密集型时最为关键,而不是在CPU/内存密集型时。 当应用受限于CPU或内存时,I/O路径上的缓存命中率优化带来的整体效益有限。

图表显示增加处理时间会降低吞吐量,说明DDIO对I/O密集型应用更重要。Page 42
图表显示增加处理时间会降低吞吐量,说明DDIO对I/O密集型应用更重要。Page 42

7.3. 关键发现

  • 如果一个应用是I/O密集型的,增加过多的核心可能会降低其性能。
  • 对于I/O密集型应用,调整IIO LLC WAYS这个很少被讨论的寄存器,可以提升性能,其效果有时堪比增加更多核心。
  • 当应用开始变为CPU密集型时,增加核心可以提高吞吐量,但必须平衡核心间的负载以最大化DDIO的效益。
  • 当网络速率接近~100 Gbps时,DDIO可能成为瓶颈。因此,了解何时应绕过缓存以实现性能隔离至关重要。
  • 如果一个应用是真正的CPU/内存密集型,那么调整DDIO的效率会降低,这是因为处理时间的增加虽然提高了命中率,但I/O本身不再是系统瓶颈。

7.4. 其他见解

本研究在不同场景下对DDIO的性能进行了深入分析。更多关于以下问题的详细结果,请参阅我们的论文:
* 接收速率如何影响DDIO性能?
* 处理时间如何影响DDIO性能?
* DDIO是否总是有益的?
* DDIO的扩展性问题。

8. 结论