Oracle中的PGA监控报警分析(r11笔记第97天)

最近接到一个数据库报警,让我颇有些意外,这是一个PGA相关的报警。听起来感觉是应用端的资源调用出了问题。

报警内容大体如下:

报警内容: PGA Alarm on alltest
------------------------------------
报警级别: PROBLEM
------------------------------------
监控项目: PGA:6118.6 这是一个12cR1的环境,是一套测试环境,确切的说是多套环境整合后的一套大的测试环境,里面含有近8个PDB,也就是之前的多个测试环境整合而来。

  所以我就简单进行了排查,首先这个报警是怎么来的,是在Orabbix配置的监控项。

  在Zabbix中查看,可以看到这个报警的相关配置。 

({Template_Oracle_OLTP:pga.last(0)}*100/{Template_Oracle_OLTP:pga_aggregate_target.last(0)})>95  也就意味着PGA的使用率达到了95%以上的时候就触发报警,这里涉及两个监控项pga和pga_aggregate_target。

相关的SQL如下,监控项的SQL在Orabbix中是按照 【监控项】.Query的格式展现的。

pga_aggregate_target.Query=select
to_char(decode( unit,'bytes', value/1024/1024, value),'999999999.9')
value from V$PGASTAT where name in 'aggregate PGA target parameter'
pga.Query=select
to_char(decode( unit,'bytes', value/1024/1024, value),'999999999.9')
c  对于这个问题,查看数据库参数,目前的pga设置是6GSQL> show parameter pga
NAME                TYPE      VALUE
----------------------- ----------- --------
pga_aggregate_limit     big integer 12880M
pga_aggregate_target    big integer 6440M  但是看起来好像有些不大对劲,还有一个生疏的参数pga_aggregate_limit,这个参数是干什么的,其实这是12c中引入的一个参数,对于pga_aggregate_target的补充。怎么理解容易一些呢,pga_aggregate_target是一个基线值,比如设置为6G,如果PGA使用超过了6G还是很难做到管控,就可能导致一些hang,无响应的问题,这个问题在12c中是考虑引进了参数pga_aggregate_limit来完善的,也就是这个参数的值就是一个最终的大小,绝对不能超过。这个参数输出中,目前的limit值默认给设置为了12G,而原本设置的target值为6G.

 目前的报警是PGA使用超过了阈值,那什么样的应用会导致如此的PGA使用情况呢,这个让我有些疑惑。一般来说,单个进程的PGA占用量其实不大,多点也就几十MB而已。当然为了先尽快修复这个问题,我把PGA target的值改为了7G.

 然后我们可以直接这样尝试定位一下问题,看看占用PGA最多的进程是哪个,依次来排除。

SQL>  select max(pga_max_mem/1024/1024) from v$process;
MAX(PGA_MAX_MEM/1024/1024)
--------------------------
7989.28072  结果看到最大进程怎么消耗如此之高,尽管是一个峰值而已。

SQL> select * from
(select
spid,pga_max_mem/1024/1024,pga_alloc_mem/1024/1024,pga_used_mem/1024/1024,program
from v$process order by pga_used_mem desc) where rownum<10;

输出的数据如下:
SPID   PGA_MAX_MEM PGA_ALLOC_MEM PGA_USED_MEM PROGRAM           
--------- --------------------- ----------------------- -----------
941    7989.    7989.4   5061.54467 oracle@teststd.test.com (IMCO)
925    132    39.851   37.1080208 oracle@teststd.test.com (ARC0)
931    116    38.788   37.0642586 oracle@teststd.test.com (ARC3)
937    36.96    33.093    31.872448 oracle@teststd.test.com (W000)
9201   37.28    31.968   31.7101784 oracle@teststd.test.com (W00C)
1491   32.53    32.468   31.6490288 oracle@teststd.test.com (W001)
1327   33.90    31.968   31.6361275 oracle@teststd.test.com (W002)
8181   32.53    31.843   31.5896568 oracle@teststd.test.com (W009)
3510   32.78    32.093   31.5785789 oracle@teststd.test.com (W005)

这一下子让我有些懵,因为最大的进程竟然是IMCO,这是in memory选件的后台进程。

[oracle@teststd ~]$ ps -ef|grep 941
oracle     941     1  0  2016 ?        07:45:21 ora_imco_testdb这样一来问题就有些诡异了。

SQL> show sga
Total System Global Area 2.0267E+10 bytes
Fixed Size                  3721272 bytes
Variable Size            1.1409E+10 bytes
Database Buffers         6643777536 bytes
Redo Buffers               63385600 bytes
In-Memory Area           2147483648 bytes通过SGA的输出可以看出,In-Memory占用了大概2G的内存空间。

而且这个参数比较让人纠结的就是无法动态修改,在实例初始化阶段才可以修改。

SQL> alter system set inmemory_size=1G;
alter system set inmemory_size=1G
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-02095: specified initialization parameter cannot be modified这样一个问题,难道是因为imco的特殊性导致了PGA的占用量大步提升,也被归纳算入了。实际上in memory自启用后就没有正式启用,没有任何表的数据放在IMO里,所以也排除了IMO的一些异常情况。还有一个验证的方式就是通过Data Guard来对比补充,结果查看备库的imco进程情况,压根诶呦发现什么问题。还有一个思路那就是对比其他的12c环境,是否也存在类似的问题,还有一套近期搭建的12cR2的环境,也启用了IMO,但是IMCO进程的PGA占用量很低。这也符合了一个常规的想法,那么这个问题是怎么造成的呢,我的一个直观感受就是一个bug.

  这个想法在MOS上得到了一个基本的印证,可以参考

IMCO Background Process Keeps Growing in Memory Usage over Time (Doc ID 2106806.1)  这里有一个问题需要确认,那就是IMCO的进程占用情况是逐步的增长还是一开始就很高。

   这一点上完全可以通过Zabbix的监控图得到。

查看近一年的PGA变化曲线图,可发现是在逐步增长。

所以和MOS里面的那个bug吻合度很高。

按照官方的解释,有3个途径可以改进这个问题。

1.  Upgrade to 12.2, when available.
2.  Apply the 12.1.0.2.10DBBP patch (or if you apply PSUs instead of DBBPs, apply the 12.1.0.2.160119DBPSU).
3. Apply interim Patch 19159120 for your RDBMS version and OS.目前来看,步骤2已经满足,只有重启一下,或者升级到12c了。

时间: 2024-09-20 06:38:30

Oracle中的PGA监控报警分析(r11笔记第97天)的相关文章

Oracle中的PGA监控报警分析二(r12笔记第87天)

今天又收到了一条报警的信息,看起来很常规,但是后面的故事如果你做了分析就会发现其实本身并不平常,我觉得我得出手了. ZABBIX-监控系统: ------------------------------------报警内容: PGA Alarm on alltest ------------------------------------报警级别: PROBLEM ------------------------------------监控项目: PGA:9723.2 -------------

闪回区报警引发的性能问题分析(r11笔记第11天)

自从有了Zabbix+Orabbix,很多监控都有了一种可控的方式,当然对于报警处理来说,报警是表象,很可能通过表象暴露出来的是一些更深层次的问题.这不又来一个,不看不知道,一看让自己着实吓了一跳. 首先是一个报警信息,可以看到是闪回区超过了报警的阈值,为了尽可能提前发现问题,我把阈值设置为了70%,和Oracle默认的80%有一些差别. ZABBIX-监控系统: ------------------------------------ 报警内容: archive_area_usage ----

MySQL中insert语句没有响应的问题分析(r11笔记第21天)

 今天开发的一个同学问我一个MySQL的问题,说在测试数据库中执行一条Insert语句之后很久没有响应.我一看语句是一个很常规的insert into xxx values形式的语句.看起来有些不太合乎常理啊,我对这类问题立马来了兴趣,准备好好看看到底是什么原因.  向开发同学了解了环境之后,我登录到服务端,首先查看是否可能是磁盘空间不足导致的问题.结果df -h的结果显示,空间还绰绰有余. 使用show proceslist查看线程情况. 可以看到大量的线程是Waiting for table

MySQL和Oracle中的唯一性索引从差别(r12笔记第83天)

   今天在修复MySQL数据的时候,发现一个看起来"奇怪"的问题.   有一个表里存在一个唯一性索引,这个索引包含3个列,这个唯一性索引的意义就是通过这3个列能够定位到具体1行的数据,但是在实际中却发现这个唯一性索引还是有一个地方可能被大家忽略了.  我们先来看看数据的情况.  CREATE TABLE `test_base_data` (   `servertime` datetime DEFAULT NULL COMMENT '时间',   `appkey` varchar(64

oracle中wallet加密的几个测试笔记

oracle wallet使用与维护 从Oracle10gR2开始, 通过使用Oracle Wallet达到任意用户不使用密码登录数据库(非操作系统认证方式),这对于用脚本登录数据库进行操作来说是非常有用的:尤其对于企业安全要求很高,不希望用户名和密码明文存在配置文件中,而且对于密码的维护是极为方便的,比如我把wallet放在指定路径下,当修改密码时,只需统一覆盖wallet即可,对于有大量应用服务器尤为方便. TDE中比较核心部分为wallet,对于这部分进行测试,对钱包加密有更加深刻的理解.

相差数十倍的SQL性能分析(r11笔记第98天)

   今天处理开发同学提交的一个数据查询需求,看起来是一个很常规的SQL,但是有一点不同的是,他们提供了两份文件,一份是一个id列表,大概有3000多个id值,另外一个份是个SQL文件.    之前也处理过几十万,上百万id值的情况,使得我原来开发中对于变动的敏感性依旧存在,所以我采用了另外一种灵活的方式,即外部表,外部表是数据库外的数据存在,在数据库依旧可以读取访问. CREATE TABLE  test_cn       (cn    varchar2(50)        )     OR

MySQL参数对比浅析(r11笔记第97天)

  今天按照计划,决定得总结下MySQL的参数了,说来想来,立即就做. 大体算了下,手头的环境主要还是使用了Percona分支,官方的相对较少,就暂且按照Percona的版本来统计参数的情况,可能和官方的会有一些出入.    数据版本会有一个较大的跨度,从5.0到5.7都有,这也能够间接反映出一个系统的变迁过程.   涉及的数据库版本如下,基本版本就是5.0, 5.5, 5.6, 5.7 5.0.67-percona-highperf-log 5.5.33-31.1-log 5.6.14-rel

百倍性能的PL/SQL优化案例(r11笔记第13天)

我相信你是被百倍性能的字样吸引了,不过我所想侧重的是优化的思路,这个比优化技巧更重要,而结果嘛,其实我不希望说成是百倍提升,""自黑""一下.     有一个真实想法和大家讨论一下,就是一个SQL语句如果原本运行20秒,优化到了1秒,性能提升该说是20倍还是提高了95%.当然还见过一种说法,一条SQL语句每次运行20秒,每天运行100次,优化后每次运行1秒,运行还是100次,那么性能提升是说成优化累计时间为100*20-100=1990秒? 好了,我们来看看PL/S

Oracle 12c中JOB运行失败的简单处理(r11笔记第66天)

在之前简单分析过一个12c中数据字典的小问题. Oracle 12c数据字典的小问题(r11笔记第49天) 最近查看邮件,12c的一个PDB还是存在JOB运行异常的情况,因为是测试环境,不是业务类的JOB,这个问题就给了我一些时间来修复. 首先因为数据字典cdb_scheduler_job_run_details的问题,还不能一下子就查出数据.我们分阶段来完成这个工作,即分成几条SQL语句来查. 首先查看PDB中的JOB执行情况.可以看到con_id=8的PDB存在失败的JOB SQL> sel