导读:随着硬件技术的不断进步,PMEM (Persistent Memory)已经足够成熟,开始进入到数据库加速领域,在 DRAM 和 Flash 之间提供能更强的 IO 层支撑。自 Oracle 20c 开始,持久化内存 PMEM(Persistent Memory )被引入到 Oracle 数据库中。

随着这一特性的引入,持久内存数据库功能(Persistent Memory Database)可以将数据库文件放置在非易失性内存中。 目前,PMEM 技术除了在Oracle的一体机之上,还支持PMEM Filestore上的单实例Oracle数据库。
而从性能上看,Exadata 上的 PMEMCache 则比 Flash Cache 提升 3倍 以上的 IOPS,同时响应时间获得10倍以上的加速:

随之启用的还有直接映射缓冲区( Directly Mapped Buffer Cache ): 直接映射缓冲区缓存是Oracle数据库中的一种机制,可以绕过传统的DRAM Buffer Cache,直接读取持久性存储器上的数据。该机制还可以跟踪数据访问,并自动将频繁读取的数据、更新的数据从PMEM中自动带入DRAM Buffer Cache,以达到更快的访问速度。当数据文件被放置在PMEM文件存储中时,直接映射的缓冲区缓存机制会自动启用。
这一特性的启用,可以通过设置 PMEM_FILESTORE 参数实现:

设置范例如下:
PMEM_FILESTORE=('/var/db/db_1', '/var/db_storage/db1.f’)
PMEM_FILESTORE=('/var/db/db_1', '/var/db_storage/db1.f', '/var/db/db_2', '/var/db_storage/db2.f')
相关的技术要点包括:
其实关于 DAX 的优化,在 Oracle 18c 中就已经流露出来,如果你留意过,告警日志中记录了这样的新记录:
Redo log for group 1, sequence 1 is not located on DAX storage
Redo log for group 3, sequence 12 is not located on DAX storage
也就是数据库检查,Redo 日志没有位于 DAX 存储设备,也就是说,Oracle 支持将 Redo 放置于 Direct Access Storage (DAX) 上,更好的支持 PMEM 等高速存储设备。
初始化参数中, _simulate_dax_storage 可以用于模拟 DAX 存储:
SQL> select ksppinm,ksppdesc from x$ksppi where ksppinm like '%dax%';
KSPPINM
--------------------------------------------------------------------------------
KSPPDESC
----------------------------------------------------------------------------------
_simulate_dax_storage
Simulate log on DAX storage
在 20c 则是增加了一个参数: _force_dax_io_err 其含义为 Force I/O error on online/standby redo log
下图展示了,当 PMEM 引入到数据库的IO栈,通过绕过软件Stack的昂贵内容切换,将会获得的 10倍以上性能提升:

如同前面展示的图示,为什么PMEM和Flash有这么大的区别呢? PMEM 绝不仅仅是闪存面前的简单缓存,它依赖于专用的内存DIMM(Intel Optane)和特定的协议和通道(RDMA,和RoCE)。在使用闪存时,所有的I/O都需要传递到存储服务器栈和数据库服务器的内核部分,这意味着延迟。而在新的技术下,可以直接将数据库与存储服务器的PMEM内存连接起来,从而使得所需要的CPU减少,加快了响应。
在数据库的世界里,随着 PMEM 的加入,一切变得更加生动起来。
