原标题:Oracle数据库重启(内存参数numperm_global相关)故障描述Oracle数据库重启。系统环境AIX6100-07-05-1228Oracle11g故障分析首先请DBA团队分析oracle数据库的日志。经过DBA分析,得知数据库有两个进程控制着数据库资源。20:06,出于数据保护考虑,oracle数据库重启。然后从操作系统层面分析20:06操作系统的资源使用情况。从nmon的数据可以知道,全天CPU使用率很低,低于30%,说明CPU使用率正常。内存数据分析显示,全天内存使用率并不高,基本稳定在80%以内。20:06之前,计算内存有所增加,这与当时处理的业务有关。(注:nmon采样点是每6分钟取一个点,取平均值。)然后分析内存的页变化。从图中可以看出,在20:06发生了大量的页面变化。当瞬间产生大量的页面变化时,意味着某些应用程序在短时间内申请了大量的内存。同时内存不足,启动lrud进程换页。页面变化引起的问题会影响系统的性能。由于nmon采样的粒度比较粗,而oswatcher监控的采样间隔为20秒,所以分析oswatcher数据主要分析vmstat的输出。从vmstat的输出我们可以看到当时有3103118个空闲内存页(每页4KB),也就是12GB内存,此时有746个pi,16989个po。因此可以看出,当有剩余内存时,就会发生换页。下面分析有剩余内存时进行分页的原因。AIX的内存管理机制是将内存划分为多个内存池。这个系统有90GB内存和120个逻辑CPU。AIX按照8个逻辑CPU为一个内存池的划分机制,将内部池划分为多个内存池。也就是说本系统中有15个内存池:为了优化内存管理,在AIX6.1中引入了numperm_global参数。当该参数设置为0时,表示换页时以内存池为单位决定是否换出计算内存,当该参数设置为1时,表示换页时判断是否以全局为单位换出计算内存。在特定版本的AIX(6100-06-sp7/6100-06-sp8/6100-06-sp9/6100-07-sp4/6100-07-sp5)下,将numperm_global参数设置为1会触发操作系统,即当系统PIN的64KB页面达到maxpin%(80%)时,当分页程序换取4KB页面时,即使还有文件系统缓存剩余(大于minperm,是物理内存的3%)默认情况下内存),它只会换出计算内存页面,换出的计算内存页面会对性能产生很大影响,并可能导致应用程序速度变慢或数据库挂起。一般来说,大量PIN64KB内存页的应用并不多,但Oracle数据库出于性能考虑,一般会将SGA和PGAPIN存放在内存中。如果SGA和PGA之和接近maxpin%,那么当numperm_global设置为1时,很有可能会触发上面提到的bug,导致提早分页的问题。经检查,发现参数numperm_global设置为1。因此,当Oracle大量申请64KB页时,64KB页达到maxpin%(80%)。此时即使还有12GB的剩余内存,此时也只会换出计算内存,导致操作系统在20:06左右出现性能问题。故障建议综合以上分析,建议如下:解决方法一:将numperm_global改为0,重启生效。方案二:为了彻底解决早分页的问题,IBM在AIX6.1TL09SP01中发布了补丁IV44998。这种情况建议升级操作系统,开启numperm_global参数,优化内存分配机制。方案三:指定OracleSGA使用的内存为16MB页,避??免64KB页大量被PIN。解决方案4:将Oracle的LOCK_SGA参数更改为FALSE,这样它就不会PIN内存页。
