Oracle服务器CPU 100%案例分析

今天收到开发人员的反应,公司一个非常重要的系统,数据库服务器CPU消耗100%,几乎全是oracle.exe占用的,但是系统的速度并没有受到太大影响(或许并非高峰期),而且CPU消耗居高不下,导致系统变得很慢。

系统环境:

操作系统:Windows Server 2003 SP2

Oracle:Oracle Enterprise Database 10.2.0.5

开始进行以下检查:

1.查看了告警日志、系统日志都没法发现任何报错,也没有生成有价值的跟踪文件。

2.登录pl/sql查询select * from vsession_wait where wait_class\<\>'Idle'没有任何结果返回(我靠,居然没有返回值),当然查询select \* from vsession where wait_class<>'Idle'也没有返回值。

3.生成一个最新的AWR报告,发现AWR报告也是正常的,没有消耗CPU高的SQL出现,执行时间最长的都不超过3秒。

系统CPU还是100%,还是oracle.exe进程占用。

4.查询select * from v$process where background is null SQL语句,发现大量的ORACLE.EXE (SHAD),google了一下,shad表示的是shadow,就是服务器进程,但这个视图又不能显示出CPU消耗。

5.想起了Windows平台的ProcessExplorer工具:

这个是microsoft提供的系统工具,可以查看非常详细的进程信息,同样能看到非常详细的线程信息,这个工具简直太好用了。通过它找出了oracle.exe进程包含的哪些线程占用CPU高。上面弹出的窗口中的TID对应的就是vprocess.spid字段,这样就可以非常容易的找出是哪个oracle process在消耗CPU,进而能够查出是哪个会话在消耗CPU,是哪个SQL在消耗CPU。值得高兴的是相关的线程全在vprocess中找到,且都是ORACLE.EXE(SHAD)线程,相关的会话也找到了,但是疑惑的是这些会话的VSESSION.WAIT_CLASS都是Idle(具体的等待事件应该是SQL\*Net message from client),但是VSESSION.STATUS都是ACTIVE。我靠这些SQL居然消耗那么多CPU,都快撑爆了。

查了下资料VSESSION.STATUS='ACTIVE'表示当前正在执行的SQL,但为何VSESSION.WAIT_CLASS='Idle',并且从开发人员的角度来说这些SQL不可能执行那么长时间。这是个疑问啊!!!

找出来消耗CPU的会话,这些会话都是业务会话,使用ALTER SYSTEM KILL SESSION 'SID,SERIAL#'语句将这些会话KILL掉,CPU立马恢复正常。

这个问题反映给开发人员,开发人员先检查一下代码再说吧。

根据这种情况在metalink上找到了两篇好的文章:
How to diagnose the high CPU utilization of ORACLE.EXE in Windows environment [ID 273646.1]
https://support.oracle.com/CSP/main/article?cmd=show&type=NOT&id=273646.1

Troubleshooting: High CPU Utilization [ID 164768.1]
https://support.oracle.com/CSP/main/article?cmd=show&type=NOT&id=164768.1

这里提供了ProcessExplorer和qslice两个工具的下载​编辑ProcessExplorer.zip​编辑qslice_setup.rar

​编辑捕获.JPG

相关推荐
夜泉_ly2 小时前
MySQL -安装与初识
数据库·mysql
qq_529835353 小时前
对计算机中缓存的理解和使用Redis作为缓存
数据库·redis·缓存
勤奋的凯尔森同学5 小时前
webmin配置终端显示样式,模仿UbuntuDesktop终端
linux·运维·服务器·ubuntu·webmin
月光水岸New5 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6755 小时前
数据库基础1
数据库
我爱松子鱼6 小时前
mysql之规则优化器RBO
数据库·mysql
丁卯4046 小时前
Go语言中使用viper绑定结构体和yaml文件信息时,标签的使用
服务器·后端·golang
chengooooooo6 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser7 小时前
【SQL】多表查询案例
数据库·sql
Galeoto7 小时前
how to export a table in sqlite, and import into another
数据库·sqlite