2019年4月2日,英特尔Optane永久内存成为第一款商用的存储类内存(SCM)产品。与SSD一样,该内存是持久的,并且与DRAM一样,它位于内存总线上。早在商业发布之前,系统架构师就在思考SCM如何准确地适应存储层次结构,现在是执行具体测量的机会了。我们想要回答的一个问题是,位于内存总线上的存储设备是否可以提供比位于PCI-e上的同等存储设备更好的吞吐量。
访问单片机有两种方式:字节接口和块接口。字节接口允许使用加载和存储指令,就像使用DRAM一样。数据块接口将SCM公开为数据块设备,也可以选择在顶部放置一个文件系统:这样就可以像访问传统SSD一样访问它。加载/存储API得到了简化,因为应用程序和硬件之间没有任何障碍,但使用起来也很棘手,因为它没有像文件系统API通常那样提供崩溃一致性之类的功能。通过数据块或文件系统API访问SCM会带来操作系统开销,但不需要重写应用程序。
我们在本文中评估的MongoDB存储引擎WiredTiger使用相当大的块(通常为4KB或更大)从存储读写数据。除了是当今传统存储硬件的必需品外,使用块API还有其他实际优势。例如,客户梦寐以求的压缩和加密功能已针对块进行了优化。类似地,保护数据免受损坏的校验和是在数据块上计算的。此外,WiredTiger将数据块缓存在其DRAM驻留缓存中,这与操作系统缓冲区缓存一起提高了性能。
块导向和对缓存的依赖使WiredTiger与许多其他存储引擎一样,可以有效地隐藏慢速存储设备的延迟。因此,我们的实验表明,SCM相对于同等技术的SSD提供的适度延迟优势并不能转化为实际工作负载的性能优势。存储引擎有效地掩盖了这些延迟差异。当SCM用于无法通过批处理和缓存隐藏的延迟敏感型操作(如日志记录)时,它将大放异彩。在本文的其余部分中,我们将详细介绍导致我们得出这一结论的实验结果。
我们使用两种存储设备进行了实验:英特尔Optane直流永久内存(PM)和英特尔Optane P4800X固态硬盘。两者均采用Intel Optane 3D XPoint非易失性内存构建,但前者是位于内存总线上的SCM,而后者是连接PCIe的固态硬盘。
首先,我们使用使用8KB块读取或写入32 GB文件的微基准来测量原始设备带宽。我们改变同时访问文件的线程数量,每个线程都有自己的块。可以通过系统调用(读/写)或mmap访问文件;后一种方法的开销通常较小。
根据规格,我们的P48000X驱动器能够提供高达2.5 GB/s的顺序读取带宽和高达2.2 GB/s的顺序写入带宽。下面是我们通过Ubuntu Linux(5.3内核)原始设备API观察到的数字,这意味着数据绕过了操作系统缓冲区缓存。
只要我们使用至少两个线程,读取带宽就会根据规范运行。使用多个线程时,写入带宽意外超出其指定的上限。我们怀疑这可能是由于在操作系统或设备上缓冲写入造成的。
Optane P4800X固态硬盘在撰写本文时比典型的固态硬盘速度更快,但还没有达到无与伦比的地步。Optane固态硬盘提供高达2.5 GB/s的顺序读取带宽,而典型的NAND固态硬盘(例如英特尔SSD Pro 6000p系列)提供高达1.8 GB/s的带宽。写入方面的差异更为明显。Optane驱动器最高可提供2.2 Gb/s,而NAND驱动器不能超过0.56 Gb/s。
Optane SSD上的随机读取和写入并不比顺序读取和写入差多少。我们能够通过读取实现接近峰值的顺序吞吐量(使用mmap),而写入的顺序吞吐量仅比峰值低10%。顺序访问和随机访问的近乎相同的性能是这些驱动器的已知特征。
现在让我们来看一下SCM的原始性能。支持Optane PM的英特尔系统最多可容纳六个DIMM,而我们的实验系统只有两个。我们测量了单个DIMM和一起使用的两个DIMM的吞吐量,以推断随着DIMM数量的增加而进行的扩展。我们还依靠其他研究人员的数据来证实我们的推断。
有两种方法可以直接访问PM:(1)devdax--PM模块公开为字符设备;(2)fsdax--在这种情况下,我们在伪装成块设备的PM模块之上有一个文件系统,但是文件访问通过直接访问(DAX)模式绕过了缓冲区缓存。在我们的实验中,我们使用ext4文件系统。
下表显示了通过这些访问方法获得的顺序读取和写入的吞吐量。在所有情况下,我们都使用mmap,因为这是devdax唯一支持的方法。
单个PM模块的顺序读取带宽达到6.4 Gb/s左右,与其他研究人员的观察结果相符。随机访问的行为与顺序访问几乎相同,因此我们省略了图表。
写实验讲述了一个不同的故事。单模块写入吞吐量仅达到0.6 Gb/s。这一测量结果与UCSD研究人员在单个设备上观察到的约2.3 Gb/s写入带宽的数据不一致。进一步的调查使我们相信这是由于硬件版本的不同造成的。也就是说,我们的观察显示,单个PM模块实现的写入吞吐量仅可与NAND SSD相媲美。
接下来,让我们看一下跨两个设备的扩展。下图显示了使用fsdax上的mmap进行顺序读取和写入的度量。我们使用Linux条带设备映射器将负载分散到两个DIMM上。对于读取,使用两个DIMM几乎可以将峰值读取带宽提高一倍,从使用一个DIMM的6.4 GB/s提高到使用两个DIMM的12.4 GB/s。同样,加州大学圣迭戈分校的研究人员观察到六个DIMM之间几乎呈线性扩展。
对于写入,我们使用两个DIMM实现了近1 Gb/s的写入吞吐量,而使用一个DIMM实现了0.6 Gb/s的写入吞吐量,但如果我们可以从单个数据点推断,扩展能力就不是线性的。USCD的研究人员观察到,与使用单个DIMM相比,使用6个DIMM的带宽提高了5.6倍,这与我们的观察结果一致。从这些数据点推断,如果我们的系统有6个DIMM,我们将观察到大约3.4 GB/s的峰值写入带宽,这比Optane SSD高出约50%。
总而言之,使用裸设备访问时,Optane固态硬盘上的峰值读取带宽约为2.5 GB/s,单个Optane PM模块上的峰值读取带宽约为6.4 GB/s。如果使用6个模块,吞吐量将约为38 GB/s。单个PM模块的写入吞吐量仅为0.6 GB/s,如果使用6个模块,预计将达到3.4 GB/s,而Optane SSD可达到2.2 GB/s的写入带宽。
Optane SCM在读取方面明显优于固态硬盘,在写入方面略有优势,前提是您负担得起6个PM模块;否则,固态硬盘将提供更高的写入吞吐量。
虽然SCM比传统存储介质更接近DRAM的速度,但DRAM仍然更快,因此DRAM缓存的优势难以忽视。下面的图表显示,在打开缓冲区缓存的情况下(这里我使用的是不带DAX选项的ext4),无论我们是进行读取还是写入、随机访问还是顺序访问,所有设备的性能都大致相同。这些实验是使用热缓冲区缓存进行的,也就是说,在我开始实验之前,文件就已经在缓冲区缓存中了,所以在这里我们测量的是纯DRAM性能。由于访问数据花费的时间更少,软件开销变得更加明显,这就是为什么如果我们使用8个或更多线程,mmap比系统调用要快得多。
如果我们从冷缓冲区缓存开始每个实验,设备之间的差异仍然很明显,但不如完全绕过缓冲区缓存那么明显。使用冷缓冲区缓存时,在读取路径上,操作系统必须将数据从存储设备复制到缓冲区缓存中,然后才能供应用程序使用(因此需要额外的软件开销)。此外,在打开缓冲区缓存的情况下,操作系统不会使用大型页面。这些因素削弱了SCM的原始读取优势。
对于写入,SCM过去提供的带宽比使用原始访问的SSD低,但现在SCM的带宽超过了SSD,这可能是因为缓冲区高速缓存吸收并批处理了其中的一些写入,而不是立即将每个写入刷新到设备。
与大多数存储引擎一样,WiredTiger的设计和调优都是为了利用DRAM缓存。WiredTiger内部缓存和操作系统缓冲区缓存对于我们测量的所有工作负载的性能都至关重要。在我们的实验中,在没有操作系统缓冲区缓存(fsdax模式)的情况下运行WiredTiger会使其性能降低多达30倍;因此,我们没有使用直接访问模式。
我们运行WiredTiger的wtperf基准测试套件,该套件旨在强调系统的各个部分,并模拟在实践中观察到的典型工作负载。在各个基准测试中,WiredTiger内部缓存的大小从几GB到100 GB不等,并且大多数基准测试至少使用十几个线程。(可在此处查看所有基准的详细配置参数。)。WiredTiger在公共路径上没有锁定,因此线程级并发通常会转化为高CPU利用率和并发I/O。正如我们在上一篇博客中所描述的那样,我们向WiredTiger添加了一个特性,以便使用mmap进行I/O而不是系统调用。
下表显示了wtperf套件在英特尔Optane SCM(一个模块和两个模块)和Optane SSD上的性能。我们发现SCM和SSD之间没有明显的性能差异。除了一个写密集型基准evict-btree-1(在SSD上速度更快)外,这两个基准之间在统计上没有显著差异。与单模块SCM相比,使用双模块SCM也不会带来性能优势。
虽然SCM比同等技术的SSD具有更高的带宽,但优势在一个数量级之内,而事实证明,有效的DRAM缓存掩盖了这种差异。
SCM的亮点在于延迟,而不是带宽。与带宽相比,从Optane PM读取数据块的延迟比从Optane SSD读取数据块的延迟短两个数量级:1微秒对100-200微秒。在存储引擎中,延迟可能成为瓶颈的最明显的地方是日志记录,学术文献中使用Optane PM进行日志记录的成功例子已经成熟。同时,请继续关注我们的下一篇关于探索持久内存的报道。