0%

CXL-SSD(ATC 23)

基于 CXL,探索使用廉价的闪存克服内存墙(在这里应该是指对内存的需求增长远远大于内存容量增长的速度)的可行性。

作者在本文中分析了现有技术的一些限制,并建议进行一些系统级的改变以使得闪存实现近似 DRAM 的性能。

Introduction

数据库,数据分析和机器学习等业务对内存的需求增长远远大于内存容量的增长速度。是否可以使用闪存克服内存墙呢?新兴的互联技术比如 CXL,Gen-Z,CCIX 和 OpenCAPI 允许 PCIe 设备被 CPU 使用 load/store 指令直接访问,并且它们的可扩展性更好(更多的 PCIe 设备可以跨交换机连接,这与用于 DRAM 的 DIMM 不同)。

但是,使用闪存作为 CPU 直接访问的主存仍然有三个挑战。

  1. 内存请求粒度和闪存粒度不匹配;这可能导致流量放大(比如 64B 的缓存行刷新到 CXL-SSD 中,可能需要 16KB 的闪存读,64B 的更新和 16 KB 的写入,但其实后文主要讲的是在请求 64KB 的过程中,LLC 可能会发送接下来的 64B 请求,导致延时命中)。
  2. 闪存比 DRAM 慢几个数量级;
  3. 闪存的耐用性有限;

作者探索一些设计选项,特别是使用缓存和预取来克服以上挑战,以使得 CXL-SSD 可以作为主存来克服内存墙。作者谈到,先前有一些技术已经证明了 CXL-SSD 的可行性,但本文是第一篇开源的对 CXL-SSD 设计选项和使用现有技术进行优化的深度研究(既然如此的话,那么找一个场景、动机,使用 CXL 可以一定程度上解决这个问题,并讲讲如何高效地使用 CXL 解决这个问题,这种行文逻辑就更可行了,而不用太担心创新型)。

进一步,由于虚拟地址到物理地址的转换,影响了现有预取策略的效果,作者对其进行了进一步优化。

Background

CXL 带来的机会

  1. CXL 允许 CPU 和 PCIe 设备之间的一致性内存访问,减少了 CPU 和设备之间传输所需的同步开销;
  2. 很容易扩展 CXL 设备的数量,通过一个 CXL 交换机,可以将一组 CXL 设备连接到 CPU(这一组 CXL 设备应该可以被连接到该交换机的多台服务器访问吧?)

除了 DRAM 和 PMEM 之外,SSD 也可以作为内存扩展设备,并且由于其高容量以及更好的扩展性,SSD 可以有效解决现代内存敏感型应用程序面临的内存墙问题。

CXL-SSD 作为主存的挑战

  1. 内存请求粒度和 SSD 粒度不匹配;

    闪存无法随机访问,数据总是以页面粒度(KB 级)进行读写,(如果是 DRAM 作为内存扩展设备,它的粒度是多少呢?),而又由于 SSD 无法覆盖写,SSD 需要以块粒度读出原有数据,再修改块中的对应页面,然后再将它们重新写入,一个 64B 的缓存行刷新将经历读-改-写过程,导致了流量放大;

  2. 微秒级时延;

    闪存比 DRAM 慢了几个数量级,当闪存作为 CPU 直接访问的内存设备时,微秒级的时延成为了一个挑战;

  3. 有限的寿命;

    闪存的擦除次数有限。

Design

为 CXL-SSD 增加 DRAM Cache

在闪存前面增加一个 DRAM Cache,可以有效降低平均访问延迟,减少闪存后端的流量。

但是,即使有足够大的缓存,平均时延仍然远远大于 DRAM 的时延,这是由于请求到达的时间间隔较短,导致闪存后端无法获取数据(写穿排队?)。

预取

预取可以进一步降低时延。作者进一步实验讨论了预取程度和预取偏移量对时延降低程度的影响。

减少闪存流量

内存访问粒度是 64B,然而闪存后端却是 4KB,因此,DRAM Cache 的 64B 缺失,会导致从闪存提取 4KB 数据,并且即使闪存正在进行中,属于同一 4KB 的后续 64B 缓存缺失也将生成额外的闪存读取请求。

存储领域可能没有这个问题,因为软件栈会将具有重叠地址的块 I/O 合并,然而,对于 CXL-SSD 来说没有软件层,它直接从接收 LLC 的内存事务。作者效仿 CPU Cache 设计,增加一组 MSHRs,记录正在进行的闪存请求,通过单次闪存读取服务多个 64B 内存访问。

这一做法显著减少了尾延时,减少了闪存后端的访问流量。

闪存科技和并行

不同闪存科技的延时性能和寿命不同,ULL 和 SLC 科技,再加上 DRAM Cache,CXL-SSD 可以实现超 4 年的寿命,增加 DRAM Cache 的大小也可以进一步提高寿命。

对于大缓存来说,CXL-SSD 的并行性(channels*ways)不重要,但对于小缓存,闪存的并行性很重要。

总结

单独使用缓存并不足以掩盖闪存的较长时延;此时进一步增加预取策略可以提高缓存命中率,提高时延;

由于内存访问粒度和闪存访问粒度不一致,会导致闪存的重叠访问,放大了闪存后端的流量,此时使用 MSHRs 技术可以通过单次闪存读取服务多个 64B 内存访问;

ULL 和 SLC 闪存科技的性能差异很小,而如果使用 MLC 和 TLC 闪存,即使有足够大的 DRAM Cache,它们的性能和寿命仍然较差。

Evaluation

不同缓存替换策略

测试了不同缓存替换算法,以及不同关联度的情况下,CXL-SSD 的请求延时和写入量。

预取策略

测试了几个预取算法,发现在某些工作负载下,预取器反而会降低性能;

负载强度,读写率,局部性会影响 CXL-SSD 的寿命;

CXL-SSD 的 performance-per-cost 比纯 DRAM 高(加了 小DRAM 做分层…);

预取器的准确度对性能提升很重要;

预取器的准确度低时,造成的缓存污染是性能降低的主要原因;

虚拟地址-物理地址的转换,使得 CXL-SSD 的预取变得困难,具体来说,基于虚拟地址预取的效果比基于物理地址的预取效果好;

内核为设备提供内存访问提示(大致意思是将一些频繁访问的地址发送给 CXL-SSD,由它根据这些地址触发预取操作),通过将延迟命中转换为缓存命中,可以进一步降低时延。