Oracle進(jìn)程導(dǎo)致CPU 100%的具體解決步驟
1:檢查系統(tǒng)
sar -u 5 5
2: 看誰(shuí)在用CPU
topas
ps -ef |grep ora #檢查第四列,C的大小(unit,100 per cpu)
3:檢查CPU數(shù)量
/usr/sbin/bindprocessor -q
lsattr El proc0
4:兩種可能:
1: A Background (instance) process
2: An oracle (user) process #此種可能最大。
5: 如果是用戶進(jìn)程:那么高CPU的主要原因有:
Large Queries, Procedure compilation or execution,
Space management and Sorting
5.1 查看每個(gè)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
比較一下哪個(gè)session的CPU使用時(shí)間最多,然后查看該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:查看
得到上述信息后,查看相應(yīng)操作是否有hash joins 和 full table scans。如果有hash joins 和 full table scans那么必須創(chuàng)建相應(yīng)的Index或者檢查Index是否有效。
另外必須檢查是否有并行的查詢存在和同一時(shí)刻有多個(gè)用戶在執(zhí)行相同的SQL語(yǔ)句,如果有必須關(guān)閉并行的查詢和任何類型的并行提示(hints);如果查詢使用intermedia數(shù)據(jù),那么為了減少總的Index大小,必須限制使用Intermedia的Worldlist。(try restricting the wordlist that intermedia uses to help reduce the total indexsize)。
6:注意事項(xiàng)
上述方案只能根據(jù)已經(jīng)運(yùn)行完成的操作,對(duì)于正在執(zhí)行的長(zhǎng)時(shí)間操作只能等操作完成后才能檢測(cè)得到。因此我們可以通過(guò)另外一個(gè)很好的工具來(lái)檢測(cè)正在運(yùn)行的長(zhǎng)時(shí)間操作語(yǔ)句。v$session_longops,這個(gè)視圖顯示那些操作正在被運(yùn)行,或者已經(jīng)完成。每個(gè)process完成后會(huì)刷新本視圖的信息。
7:怎樣尋找集中使用CPU的Process:
很多時(shí)候會(huì)發(fā)現(xiàn)有N個(gè)Process在平均分享著CPU的利用率,這種情況唯一的可能性就是這些Process在執(zhí)行著相同的Package或者Query.
這種情況:建議通過(guò)statspack,在CPU高利用率額時(shí)候運(yùn)行幾個(gè)快照,然后根據(jù)這些快照檢查Statspack報(bào)告,檢查報(bào)告中最TOP的Query。然后使用 sql_trace and tkprof 工具去跟蹤一下。
同時(shí)檢查buffer cache 的命中率是否大雨95%。
同時(shí)在報(bào)告中還需要檢查一下table scans (long tables),看是否在報(bào)告生成期間有存在全表掃描。
8:參數(shù)
另外還有一些不是特別重要的,但是也必須關(guān)心檢查的參數(shù)可能消耗CPU。
parallel query 并行查詢:
并行查詢最好用于數(shù)據(jù)倉(cāng)庫(kù)的環(huán)境下,那種情況任何時(shí)候只有幾個(gè)用戶在同時(shí)使用。在一個(gè)聯(lián)機(jī)事務(wù)處理環(huán)境中,當(dāng)同時(shí)許多用戶去并行查詢一個(gè)數(shù)據(jù)庫(kù)的巨大表時(shí)候,會(huì)導(dǎo)致CPU的爆滿。所以最好在數(shù)據(jù)庫(kù)的級(jí)別關(guān)閉并行查詢:設(shè)置參數(shù)如下:
parallel_min_server = 0 parallel_max_server = 0
parallel_automatic_tuning = false;
在配置上述參數(shù)后,如果SQL語(yǔ)句中使用的并行的提示,那么還是有可能會(huì)出現(xiàn)并行查詢的情況,所以還需要繼續(xù)監(jiān)視相關(guān)的SQL語(yǔ)句,如果有可以直接去除提示。
posted on 2010-11-19 15:57 風(fēng) 閱讀(391) 評(píng)論(0) 編輯 收藏 所屬分類: Oracle