当前位置: 首页 > 技术与资源 > 技术分享 > 正文

Solaris的DISM——被忽略的重要特性

2015-12-28 10:33:58

作者:杨德胜新炬网络高级技术专家。


虽说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日)


杨德胜-Solaris的DISM – 被忽略的重要特性

从监测图表可以看出,补丁升级过程中数据库的启停操作对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特性可能存在的问题有比较详尽的描述:


From a Database and/or Clusterware perspective the Symptoms include:
* Overall Poor Performance including login problems
* Processing Delays Resulting in IPC errors
* Instance Evictions
* Node Evictions
From a system perspective the Symptoms include:
* High System Time (often exceeding 50%)
* GUDs will show numerous threads in the ipc_get system call
* Excessive swap usage
* Kernel Panics

对数据库可能引发性能问题,节点驱逐问题,IPC延迟相关错误;主机上可能导致CPU 系统占用时间上升,swap使用率高,Kernel Panics的问题。上面所展示的案例,就是一个swap使用率高的例子。


什么样的配置会启用DISM?在文档 552633.1中有一个比较直观的总结:


To be more precise, when available on the system, DISM is used according to the following rules:
9iR2
If SGA_MAX_SIZE is set
 
10g
If SGA_MAX_SIZE > SGA_TARGET (including when SGA_TARGET = 0)
 
11g
If Automatic Shared Memory Management (ASMM) is used and SGA_MAX_SIZE > SGA_TARGET (including when SGA_TARGET = 0)
If Automatic Memory Management (AMM) is used as and MEMORY_TARGET or MEMORY_MAX_TARGET is set

即在目前常见的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。

上一篇:使用Python一键生成Oracle性能excel曲线图
下一篇:系统高可用技术探讨