天天看點

Oracle程序導緻CPU 100%具體解決步驟

1:檢查系統

  sar -u 5 5

  2: 看誰在用CPU

  topas

  ps -ef |grep ora #檢查第四列,C的大小(unit,100 per cpu)

  3:檢查CPU數量

  /usr/sbin/bindprocessor -q

  lsattr El proc0

  4:兩種可能:

  1: A Background (instance) process

  2: An oracle (user) process #此種可能最大。

  5: 如果是使用者程序:那麼高CPU的主要原因有:

  Large Queries, Procedure compilation or execution,

  Space management and Sorting

  5.1 檢視每個Session的CPU利用情況:

  select ss.sid,se.command,ss.value CPU ,se.username,se.program

  from v$sesstat ss, v$session se

  where ss.statistic# in

  (select statistic#

  from v$statname

  where name = 'CPU used by this session')

  and se.sid=ss.sid

  and ss.sid>6

  order by ss.sid

  5.2: 比較上述Session

  比較一下哪個session的CPU使用時間最多,然後檢視該Session的具體情況:

  select s.sid, event, wait_time, w.seq#, q.sql_text

  from v$session_wait w, v$session s, v$process p, v$sqlarea q

  where s.paddr=p.addr and

  s.sid=&p and

  s.sql_address=q.address;

  5.3:檢視

  得到上述資訊後,檢視相應操作是否有hash joins 和 full table scans。如果有hash joins 和 full table scans那麼必須建立相應的Index或者檢查Index是否有效。

  另外必須檢查是否有并行的查詢存在和同一時刻有多個使用者在執行相同的SQL語句,如果有必須關閉并行的查詢和任何類型的并行提示(hints);如果查詢使用intermedia資料,那麼為了減少總的Index大小,必須限制使用Intermedia的Worldlist。(try restricting the wordlist that intermedia uses to help reduce the total indexsize)。

  6:注意事項

  上述方案隻能根據已經運作完成的操作,對于正在執行的長時間操作隻能等操作完成後才能檢測得到。是以我們可以通過另外一個很好的工具來檢測正在運作的長時間操作語句。v$session_longops,這個視圖顯示那些操作正在被運作,或者已經完成。每個process完成後會重新整理本視圖的資訊。

  7:怎樣尋找集中使用CPU的Process:

  很多時候會發現有N個Process在平均分享着CPU的使用率,這種情況唯一的可能性就是這些Process在執行着相同的Package或者Query.

  這種情況:建議通過statspack,在CPU高使用率額時候運作幾個快照,然後根據這些快照檢查Statspack報告,檢查報告中最TOP的Query。然後使用 sql_trace and tkprof 工具去跟蹤一下。

  同時檢查buffer cache 的命中率是否大雨95%。

  同時在報告中還需要檢查一下table scans (long tables),看是否在報告生成期間有存在全表掃描。

  8:參數

  另外還有一些不是特别重要的,但是也必須關心檢查的參數可能消耗CPU。

  parallel query 并行查詢:

  并行查詢最好用于資料倉庫的環境下,那種情況任何時候隻有幾個使用者在同時使用。在一個聯機事務處理環境中,當同時許多使用者去并行查詢一個資料庫的巨大表時候,會導緻CPU的爆滿。是以最好在資料庫的級别關閉并行查詢:設定參數如下:

  parallel_min_server = 0  parallel_max_server = 0

  parallel_automatic_tuning = false;

  在配置上述參數後,如果SQL語句中使用的并行的提示,那麼還是有可能會出現并行查詢的情況,是以還需要繼續監視相關的SQL語句,如果有可以直接去除提示。