1. 程式人生 > >Oracle伺服器CPU 100%案例分析(轉)

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 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立馬恢復正常。
       這個問題反映給開發人員,開發人員先檢查一下程式碼再說吧。