CentOS7下Oracle19c CPU异常飚高问题排查及解决
提示:CentOS Linux release 7 ,oracle-database-ee-19c-1.0-1.x86_64.rpm:
项目环境配置:华为云4核16G ,CentOS 7.6 ,Oracle19c ,JDK8。
问题描述
线上环境oracle执行部分sql时cpu异常飚高且很长时间不会下降,逐步导致系统卡顿。
例如:如下图所示,通过监控软件可观察到,部分时段会出现CPU异常飚高。且无规律。
排查过程:
第一步先排查导致CPU飚高的大致方向:
线上环境用的是华为云服务器,那么硬件和CentOS7系统本身问题导致CPU高的可能性不大,可以优先排除。那么就从系统上安装的应用程序下手,系统中安装了JAVA程序和oracle数据库。还好应用程序不是很多比较好排查,开始怀疑是java程序中代码导致,于是安装相关监控或者JDK自带命令排查,发现都不是。这里我用了一款运维工具定位到的(finalshell专业版),当然前期排查过程是比较耗时的因为是偶发现象,所以需要先摸清cpu高时都有哪些操作。
第二步找到导致问题的具体原因:
工具定位出问题后,我们继续排查导致的具体原因。通过oracle一些相关sql命令来找出对应执行的sql
看看是不是慢sql导致,结果多次验证发现并不是sql慢查询,而是sql执行时,时快时慢。这么以来就发现导致问题的根本原因了,那么就很肯定的定位是oracle相关缓存或配置的问题。
-----查消耗CPU最高的20条:
select * from (select sql_text,sql_id,cpu_time from v$sqlarea order by cpu_time desc) where rownum<=20 order by rownum asc ;
------ 或者通过pid查找对应sql:
1、
SELECT addr FROM v$process c WHERE c.spid = 1560 ;
2、
SELECT DECODE (sql_hash_value,
0, prev_hash_value,
sql_hash_value
),
DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.paddr = '00000004B08F4DC8';
3、
select a.sql_text,a.sql_id From v$sqltext a where a.hash_value='3838526855 ' and a.address='00000004DBAE9638' order by piece ;
解决方案:
找到导致问题的根本原因后那么解决方案就很容易给出了:这里我们设置下两个oracle参数就行了。
//关闭缓存级别
alter session set “_optimizer_use_feedback”=false;
//关闭基数反馈
alter system set “_optimizer_use_feedback” = false;