暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle共享池分析的常用方法与注意事项

白鳝的洞穴 2020-03-05
1902
这些年硬件资源丰富了,内存也便宜了,特别是X86化后,动则1TB的物理内存,所以共享池相关的问题出的也少了。不过即使是在这样的情况下,偶尔还是会出现共享池问题的。如果共享池出了问题,会有哪些表现呢?一般来说,latch free等待可能会比较严重,特别是library cache,row cache、cursor mutex等方面的各种等待会出现在TOP等待事件里。系统性能可能会下降,部分会话可能会报各种错误而中断(很多情况会报ORA-600/ORA-7445),甚至更严重的情况会出现数据库实例宕机。
一旦我们发现共享池出现问题,那么我们就需要对共享池进行分析。今天老白给大家分享几个比较常用的脚本,用于各种共享池问题的分析。
1、检查共享池中的Chunks数和每个Free List中的Free Space量,这个脚本在共享池出现较为严重的争用或者不足的时候可以用来分析共享池空闲的CHUNK的情况,根据CHUNK的大小和数量判断共享池碎片化的程度。如果过于碎片化了,找空闲的时段刷新下共享池是十分必要的。

select

  decode(sign(ksmchsiz - 80), -1, 0, trunc(1/log(ksmchsiz - 15, 2)) - 5)

    bucket,

  sum(ksmchsiz)  free_space,

  count(*)  free_chunks,

  trunc(avg(ksmchsiz))  average_size,

  max(ksmchsiz)  biggest

from

  sys.x$ksmsp

where

  inst_id = userenv('Instance') and

  ksmchcls = 'free'

group by

  decode(sign(ksmchsiz - 80), -1, 0, trunc(1/log(ksmchsiz - 15, 2)) - 5);

上面的数据里,共享池是十分正常的。

2、分析共享池整体情况的脚本,可以看出每个子池的情况,包括是否出现过ORA-4031

column indx heading "indx|indx num"

column kghlurcr heading "RECURRENT|CHUNKS"

column kghlutrn heading "TRANSIENT|CHUNKS"

column kghlufsh heading "FLUSHED|CHUNKS"

column kghluops heading "PINS AND|RELEASES"

column kghlunfu heading "ORA-4031|ERRORS"

column kghlunfs heading "LAST ERROR|SIZE"

select

  indx,

  kghlurcr,

  kghlutrn,

  kghlufsh,

  kghluops,

  kghlunfu,

  kghlunfs

from

  sys.x$kghlu

where

  inst_id = userenv('Instance')

/

3、下面这个脚本是在经常出现ORA-4031的系统中进行监控的十分好的脚本,如果PERM部分的内存在持续增长,说明系统存在内存泄漏或者其他方面的问题,如果FREE和RECR部分的内存越来越少,则随着实例启动时间推移,共享池风险越来越大
recr:可重新创建的内存
freeable:可快速释放的内存
PERM:固定的,不释放的内存
带R-开头的都是保留池的数据

col "avg size" format a30 truncate;

col siz format 999999999999

SELECT KSMCHCLS CLASS, COUNT(KSMCHCLS) NUM, SUM(KSMCHSIZ) SIZ,

To_char( ((SUM(KSMCHSIZ)/COUNT(KSMCHCLS)/1024)),'999,999.00')||'k' "AVG SIZE"

FROM X$KSMSP GROUP BY KSMCHCLS; 

虽然我们可以用很多脚本去分析与诊断共享池,不过很多对共享池的诊断脚本实际上都是需要遍历共享池内存才能获得结果的。我们看到的视图实际上不是真正的表,而是Oracle的内存的一个统计数据而已,很多统计是你访问这些视图时才去做的,因此这些操作都存在一定的风险。在一个已经病态的系统上,在业务比较高峰时候去做这些查询可能会导致系统HANG住。因此我们并不建议使用这些脚本常态化自动监控共享池,而是尽可能在有人值守的时候做这些操作。一旦出现了系统HANG死的情况,尽快杀掉执行这些操作的会话。

老白这些年也遇到过很多做运维自动化的人把这些脚本放在定时任务中,每隔几分钟就去做一次,这是十分有风险的操作,监控系统把数据库搞死也不是很难的事情。因此如果日常要对共享池进行监控的话,不能采用扫描共享池内存的方式,而是要从其他方面来进行迂回。从一些其他的风险比较小的现象侧面体现共享池的健康状态,这样才能避免运维自动化系统变成杀手系统。在大师问诊系统中,我们通过监控共享池相关的等待事件与系统METRIC是否异常来判断共享池是否存在隐患,而不是去扫描这些视图。

最后修改时间:2020-03-05 16:36:29
文章转载自 白鳝的洞穴,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论