导读:随着硬件技术的不断进步,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 初始化参数,指定了Oracle数据库实例启动时将自动挂载的PMEM文件存储。该参数被设置为一对有序的字符串,参数值列表中的第一个字符串是PMEM Filestore挂载的目录。第二个字符串是 backing file 。
- PMEM Filestore 的 backing file 在OS文件系统层次结构中作为一个文件可见,从PMEM DAX的原生操作系统文件中获取存储。在Linux系统中,PMEM Filestore 的 Backing file 应该是在XFS或ext4文件系统中,使用-o dax选项挂载。
设置范例如下:
代码语言:javascript复制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')
相关的技术要点包括:
- PMEM Filestore是一个指针切换(Pointer-Switching)PMEM文件系统,支持数据块的原子更新。PMEM Filestore是用于持久内存数据库的基础文件存储,提供外部接口用于直接在持久性内存中映射和访问数据库。
- 在PMEM Filestore上管理Oracle类似于在本机文件系统上管理,PMEM Filestore实现了用户空间文件系统(FUSE)协议,使Oracle DBA可以执行常规的文件级维护,FUSE允许非特权(非root)用户创建和管理文件系统以及其中包含的目录和文件
- 典型的文件系统使用 Raw Storage 作为其后备存储,而PMEM Filestore从PMEM DAX文件系统中的本机操作系统文件获取存储,该文件称为 Backing file,在操作系统中显示为文件。
- 创建并挂载PMEM文件存储后,可以在用户指定的挂载点下看到本地文件系统。此本地文件系统支持目录和常见的操作系统命令,例如ls和cp。此本地文件系统是PMEM文件存储,可用于存储Oracle数据库文件。请注意,只有在启动Oracle数据库实例时,PMEM文件存储才可见。
- 您可以将PMEM Filestore用于数据库数据文件和控制文件。出于性能原因,Oracle建议您将重做日志文件作为独立文件存储在可识别DAX的文件系统(例如EXT4 / XFS)中。诸如跟踪文件和审核文件之类的管理文件无法存储在PMEM Filestore中。因为可以在SPFILE中指定PMEM Filestore配置参数,SPFILE 无法存储在PMEM Filestore中。
其实关于 DAX 的优化,在 Oracle 18c 中就已经流露出来,如果你留意过,告警日志中记录了这样的新记录:
代码语言:javascript复制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 存储:
代码语言:javascript复制SQL> select ksppinm,ksppdesc from x$ksppi where ksppinm like '�x%';
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 的加入,一切变得更加生动起来。