如何选择Intel 傲腾持久内存的几种工作模式
Intel 傲腾数据中心持久内存(本文简称PMEM)是我们认为一种开拓性的新硬件。通过同时提供远超内存的容量,和远超SSD磁盘的性能,弥补了现有数据中心服务器体系架构中DRAM和SSD之间的巨大鸿沟。从而为企业不断快速增长的海量实时数据分析和处理需求,提供了全新的解决方案。

图1:基于PMEM的新的数据中心服务器架构
从硬件特性角度来看,PMEM提供了很多优势:
高性能:相比于硬盘,更加接近内存的访问性能,特别是数据访问延迟很低。
持久性:数据在PMEM中掉电不会丢失。
Byte Addressable:数据访问的粒度和CPU cache line对齐。
但是,PMEM并不是说完全即插即用的,在“正确”的使用它之前,有必要了解一下,PMEM支持的几种使用模式,以及他们都有哪些优势和不足,从而选择和自身需求最匹配的模式,来发挥出PMEM最大的能力。
Memory Mode(内存模式)
PMEM的内存模式,顾名思义,就是使PMEM也作为一种内存来工作。这种模式最早也被称作2LM(2 Level Memory),在内存模式下,系统的内存被分成两层,PMEM作为容量层,被操作系统识别为系统内存,正常使用。而DRAM则被作为性能加速缓存,用于加速PMEM的性能。

图2:Memory Mode
这种模式的最大优势是兼容性好,整个的DRAM cache层是在硬件的MMU中实现的,操作系统自身完全不需要知道自己是运行在什么种类的内存之上的,所以所有的应用都不需要任何修改,就可以享受PMEM带来的超大系统容量的好处。
Memory Mode的一个典型应用场景就是Redis内存数据库,因为所有的数据都是驻留在内存中的,所以更大的内存可以使得Redis数据库保存更多的数据,从而对提升Redis cache命中率有很大的帮助。
但是这种模式的缺点也非常明显,就是它完全抛弃了PMEM的持久化特性,所有写入在PMEM的数据,在节点掉电重启后是不可用的。另一个方面,内存模式使用DRAM作为缓存使用,使得整体系统可用的内存只有PMEM的容量,在容量利用率上也是不足的,举一个例子,在一个配置512G DRAM和1.5T PMEM的机型上,使用Memory Mode,操作系统就仅能看到1.5T的内存容量,整个系统的内存容量利用率仅有75%,考虑到内存的价格,这个成本浪费还是偏大的。
所以笔者认为,PMEM的内存模式,在最开始PMEM面世的时候,作为一个过渡方案,提供了百分百的兼容性,使得传统应用可以使用到大内存带来的优势,是很有价值的,但是随着PMEM相关生态的完善,越来越多的应用软件的支持,内存模式的缺点就会越来越明显,从而慢慢的减少使用了。
App Direct Mode(应用模式)
相比于内存模式,APP Direct Mode则可以利用PMEM的持久化特性。但是就需要操作系统和软件的支持了,Linux内核是从4.2版本开始引入了对SNIA NVDIMM的支持,并在后续的版本中不断的进行了完善。在我们目前常用的CentOS 8.x的发行版中,通常来说操作系统可以将PMEM硬件作为两种不同的设备来使用,并且各有优缺点。
一种是fsdax mode,在这种模式下,PMEM被配置成类似一块磁盘设备,用户可以将其格式化成一个文件系统,然后使用。并且如果使用xfs或者ext4文件系统时,还可以在挂载时使用dax参数,激活文件系统的dax mode,使得应用程序可以跳过kernel page cache来直接读写PMEM上的数据。

图3:PMEM作为FSDAX
另一种是devdax mode,在这种模式下,PMEM被驱动为一个字符设备,用户如果想使用它,则必须自行编写程序,或者修改自己原有的应用程序,才能访问到PMEM上面的数据。

图4:PMEM作为DEVDAX
综合这两种模式,他们都可以保存写入PMEM的数据,但是在具体的应用场景上还是有区别的。fsdax模式由于提供的是标准的POSIX文件系统接口,所以他的兼容性更好,应用可以在完全不修改的情况下,把PMEM当作一个非常快速的磁盘来使用。但是这样做,在系统层面上也是有所损失的,因为要使用文件系统的dax模式,也有一系列前置条件,而在没有激活dax的模式下,所有的IO仍旧要通过kernel page cache来缓冲,对于系统内存是很大的一个浪费。同时因为是要模拟磁盘行为,IO的粒度也是512个字节,对于PMEM这样在cache line大小的IO中,能提供的超低延迟特性的硬件来说,IO的粒度仍旧太大了。无法真正发挥出PMEM的全部实力。
笔者认为,只有devdax模式,才是真正的可以完全发挥PMEM所有高性能、可持久化、字节寻址能力的最强模式!但是唯一遗憾的就是要想使用devdax模式,必须重写现有的应用程序,和PMEM设备对接。同时,在非易失性内存上编程,也是和传统编程有较大的区别,需要考虑很多以前不需要处理的问题。所以对于很多现有的应用来说,虽然devdax模式“看上去很美”,但是却没办法采用。
正是看到这个问题,MemVerge创新性的设计并开发了Memory Machine软件解决方案,底层由MemVerge的软件根据PMEM特性,使用devdax模式进行编程,实现一整套内存虚拟化解决方案,通过对应用提供池化的虚拟内存,使得应用无需修改,就可以运行在PMEM上,享受大内存带来的高性能,并且通过热点数据识别和内存分级技术,为不同应用量身订制最优内存配比,同时使用MemVerge ZeroIO Snapshot技术,为应用软件的数据提供持久化保护。

图5 PMEM的使用模式的优缺点,以及和Memory Machine的对比
相信通过这篇文章,大家就可以理解PMEM的各种模式的不同的优缺点,并在未来使用最合适的模式来支持自己的工作。