作者:杨德胜,新炬网络高级技术专家。
虽说Linux、Unix类型操作系统相似性较高,但特性总是存在的。有些特性Oracle官方已明确不建议在Oracle数据库环境中使用,但这些特性可能并不被大家所熟知而被忽略,最终可能导致一些奇怪的问题。
Solaris的DISM特性恐怕就是这样一个有趣的特性,大家并不熟悉它,但它却在很多的数据库环境中默默的影响着数据库的运行。
且看下面一个案例。
某省BOSS系统一套核心库swap占用一直较高。物理内存使用情况正常,未出现内存free不足的情况。9月24日2点至4点进行补丁升级后,节点1 swap使用率超过90%引发告警。这套环境中swap大小配置为物理内存的50%。
主机侧swap使用情况监测如下,数据库主机SWAP空间增长变化情况:(时间范围2014年9月22日~9月24日)
从监测图表可以看出,补丁升级过程中数据库的启停操作对swap使用量影响极大,可发现swap的占用与数据库有直接联系。数据库节点2启动后一段时间是处于几乎空载状态,依然会占用大量swap空间,也就是说,似乎与业务连接并没有太大的关系。
经排查,最终定位到这就是DISM的“杰作”,因此套数据库在安装维护过程中配置了MEMORY_TARGET和 MEMORY_MAX_TARGET参数。
DISM到底是什么?此文中并不打算做太多的介绍,有关DISM的信息在Oracle白皮书《Dynamic SGA Tuning of Oracle Database on Oracle Solaris with DISM》中有详尽的说明。我们在这可以讨论下,为什么会用到DISM?它对数据库的运行会产生什么影响?什么样的配置会启用DISM?
为何会用到DISM?Oracle数据库实例原本在Solaris平台默认使用的是ISM内存管理方式。随着Oracle SGA内存管理的升级,SGA内存的大小已能够实现动态调整。比如通过SGA_MAX_SIZE、SGA_TARGET或MEMORY_MAX_TARGET、MEMORY_TARGET等组合进行调整。但是使用ISM存在一个不足,就是应用程序的内存段无法进行动态调整,这显然与SGA内存大小可动态调整的特性不符。于是,在SGA大小可自动调整的情况下,将转而使用DISM内存管理方式。
在使用DISM的情况下,将对数据库产生什么影响?在文档 1606318.1中,对使用DISM特性可能存在的问题有比较详尽的描述:
对数据库可能引发性能问题,节点驱逐问题,IPC延迟相关错误;主机上可能导致CPU 系统占用时间上升,swap使用率高,Kernel Panics的问题。上面所展示的案例,就是一个swap使用率高的例子。
什么样的配置会启用DISM?在文档 552633.1中有一个比较直观的总结:
即在目前常见的10g及以上版本中,设置SGA_MAX_SIZE = SGA_TARGET,在11g版本中还需要确保MEMORY_TARGET 和MEMORY_MAX_TARGET未进行设置,数据库启动时,才不会使用DISM。当然,如果采用的是SGA手工管理方式,也是不会使用到DISM的了。
最后,我们可以看看Oracle官方对Oracle数据库使用DISM的建议。
Oracle官方对于Solaris平台上运行的Oracle数据库建议是:
* 对于基于x86的Solaris,应始终避免使用DISM;
* 对于基于SPARC的Solaris,除非有动态调整SGA大小的需求,否则应避免使用DISM。
这个问题确实比较隐蔽,以至于工作中常常能看到Solaris平台下的Oracle数据库未避免使用DISM。