Oracle服务器CPU 100%案例分析(转)

本文记录了一次Oracle数据库服务器CPU消耗达到100%的问题排查过程,通过使用ProcessExplorer工具定位到具体消耗CPU的会话及SQL,最终通过杀死会话解决了问题。
  Oracle服务器CPU 100%案例分析  2011-10-18 16:22:39

分类: Linux

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

系统环境:
操作系统:Windows Server 2003 SP2
Oracle:Oracle Enterprise Database 10.2.0.5

开始进行以下检查:
1.查看了告警日志、系统日志都没法发现任何报错,也没有生成有价值的跟踪文件。
2.登录pl/sql查询select * from v$session_wait where wait_class<>'Idle'没有任何结果返回(我靠,居然没有返回值),当然查询select * from v$session 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对应的就是v$process.spid字段,这样就可以非常容易的找出是哪个oracle process在消耗CPU,进而能够查出是哪个会话在消耗CPU,是哪个SQL在消耗CPU。值得高兴的是相关的线程全在v$process中找到,且都是ORACLE.EXE(SHAD)线程,相关的会话也找到了,但是疑惑的是这些会话的V$SESSION.WAIT_CLASS都是Idle(具体的等待事件应该是SQL*Net message from client),但是V$SESSION.STATUS都是ACTIVE。我靠这些SQL居然消耗那么多CPU,都快撑爆了。
        查了下资料V$SESSION.STATUS='ACTIVE'表示当前正在执行的SQL,但为何V$SESSION.WAIT_CLASS='Idle',并且从开发人员的角度来说这些SQL不可能执行那么长时间。这是个疑问啊!!!
       找出来消耗CPU的会话,这些会话都是业务会话,使用ALTER SYSTEM KILL SESSION 'SID,SERIAL#'语句将这些会话KILL掉,CPU立马恢复正常。
       这个问题反映给开发人员,开发人员先检查一下代码再说吧。

本人转自http://blog.itpub.net/23135684/viewspace-709301/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值