网站首页 > 技术文章 正文
最近接到一个数据库报警,让我颇有些意外,这是一个PGA相关的报警。听起来感觉是应用端的资源调用出了问题。
报警内容大体如下:
报警内容: PGA Alarm on alltest
这是一个12cR1的环境,是一套测试环境,确切的说是多套环境整合后的一套大的测试环境,里面含有近8个PDB,也就是之前的多个测试环境整合而来。
------------------------------------
报警级别: PROBLEM
------------------------------------
监控项目: PGA:6118.6
所以我就简单进行了排查,首先这个报警是怎么来的,是在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设置是6G
pga.Query=select to_char(decode( unit,'bytes', value/1024/1024, value),'999999999.9') cSQL> show parameter pga
但是看起来好像有些不大对劲,还有一个生疏的参数pga_aggregate_limit,这个参数是干什么的,其实这是12c中引入的一个参数,对于pga_aggregate_target的补充。怎么理解容易一些呢,pga_aggregate_target是一个基线值,比如设置为6G,如果PGA使用超过了6G还是很难做到管控,就可能导致一些hang,无响应的问题,这个问题在12c中是考虑引进了参数pga_aggregate_limit来完善的,也就是这个参数的值就是一个最终的大小,绝对不能超过。这个参数输出中,目前的limit值默认给设置为了12G,而原本设置的target值为6G.
NAME TYPE VALUE
----------------------- ----------- --------
pga_aggregate_limit big integer 12880M
pga_aggregate_target big integer 6440M
目前的报警是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
通过SGA的输出可以看出,In-Memory占用了大概2G的内存空间。
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
而且这个参数比较让人纠结的就是无法动态修改,在实例初始化阶段才可以修改。
SQL> alter system set inmemory_size=1G;
这样一个问题,难道是因为imco的特殊性导致了PGA的占用量大步提升,也被归纳算入了。实际上in memory自启用后就没有正式启用,没有任何表的数据放在IMO里,所以也排除了IMO的一些异常情况。还有一个验证的方式就是通过Data Guard来对比补充,结果查看备库的imco进程情况,压根诶呦发现什么问题。还有一个思路那就是对比其他的12c环境,是否也存在类似的问题,还有一套近期搭建的12cR2的环境,也启用了IMO,但是IMCO进程的PGA占用量很低。这也符合了一个常规的想法,那么这个问题是怎么造成的呢,我的一个直观感受就是一个bug.
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
这个想法在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已经满足,只有重启一下,或者升级到12c了。
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.
猜你喜欢
- 2024-11-02 云呐统一运维一体机,IBM Informix数据库性能可视化监控
- 2024-11-02 一款基于java开发的开源监控平台 java监控软件
- 2024-11-02 利用云呐数据库专家监控盒子实时监测数据库性能
- 2024-11-02 一款基于springboot的可视化开源监控平台,用起来简直不要太香
- 2024-11-02 基于SpringBoot的运维监控系统 springboot服务监控
- 2024-11-02 MYSQL监控工具(mytop) mysql官方监控工具
- 2024-11-02 Zabbix监控达梦数据库表空间 达梦查看表空间
- 2024-11-02 基于centos7系统安装部署lepus天兔数据库监控系统--第一部分
- 2024-11-02 泽众P-One性能测试平台在测试场景快速启动如何查看监控信息
- 2024-11-02 给你推荐一款真的好用的开源数据库监控系统LEPUS
你 发表评论:
欢迎- 627℃几个Oracle空值处理函数 oracle处理null值的函数
- 621℃Oracle分析函数之Lag和Lead()使用
- 610℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 604℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 601℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 593℃【数据统计分析】详解Oracle分组函数之CUBE
- 584℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 567℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- oracle 19cOCM认证有哪些内容(oracle认证ocm月薪)
- Oracle新出AI课程认证,转型要持续学习
- oracle 表的查询join顺序,可能会影响查询效率
- Oracle DatabaseAmazon Web Services正式可用,Oracle数据库上云更容易了
- Oracle 19.28 RU 升级最佳实践指南
- 汉得信息:发布EBS系统安装启用JWS的高效解决方案
- 如何主导设计一个亿级高并发系统架构-数据存储架构(三)
- Java 后端开发必看!工厂设计模式轻松拿捏
- ORA-00600 「25027」 「x」报错(抱错孩子电视剧 爸爸是武术 另一个爸爸是画家)
- 新项目终于用上了jdk24(jdk新建项目)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)