oracle cpu占用率高
Oracle CPU 占用率高可能由多種原因?qū)е拢绱罅颗判颉⒋罅?SQL 解析、全表掃描等。以下是一般的排查和解決步驟:
排查思路:找到占用 CPU 較高的進(jìn)程或線程 ID,進(jìn)而找到對(duì)應(yīng)的 SQL 語(yǔ)句,以分析問題的原因。
處理步驟(以 Windows 系統(tǒng)為例):
- 下載 process explorer 工具,用于查看 Windows 環(huán)境下的進(jìn)程和線程信息。
- 雙擊 oracle.exe 進(jìn)程,查看 oracle 的線程信息,按照 CPU 使用率倒序排序,找到占用 CPU 較高的 tid。(如果是 Unix 或 Linux 系統(tǒng),可以使用 top 命令獲得占用 CPU 較高的進(jìn)程 id,然后使用進(jìn)程 id 在數(shù)據(jù)庫(kù)中查找對(duì)應(yīng)信息。)
- 使用找到的 tid 代入以下的 SQL 查詢對(duì)應(yīng)的 SQL 語(yǔ)句或會(huì)話信息:
select sql_text from v$sqltexta where (a.hash_value,a.address) in (select decode(sql_hash_value,0,prev_hash_value,sql_hash_value),decode(sql_hash_value,0,prev_sql_addr,sql_address) from v$session b where b.paddr=(select addr from v$process c where c.spid='&pid')) order by piece asc;select id,serial#,username,osuser,machine,program,process,to_char(logon_time,'yyyy-mm-dd hh24:mi:ss') logon from v$session where paddrin (select addr from v$process where spid in ('&pid'));
- 根據(jù)查出的會(huì)話,記錄 SQL 語(yǔ)句以待后續(xù)分析,并考慮 kill 掉查出的會(huì)話。
優(yōu)化方法:
- 分析找到的 SQL 語(yǔ)句,查看其執(zhí)行計(jì)劃,確定是否存在全表掃描等問題,如有必要,進(jìn)行優(yōu)化,例如創(chuàng)建適當(dāng)?shù)乃饕约铀俨樵儭?/li>
- 檢查數(shù)據(jù)庫(kù)中的查詢和存儲(chǔ)過程,看是否存在可以優(yōu)化的邏輯。
- 調(diào)整數(shù)據(jù)庫(kù)參數(shù),如優(yōu)化內(nèi)存使用等,但需謹(jǐn)慎操作,確保了解參數(shù)的具體作用。
- 檢查硬件問題,確保服務(wù)器硬件滿足數(shù)據(jù)庫(kù)的要求,如有需要,考慮升級(jí)硬件。
如果問題仍然存在,可能需要更深入地分析數(shù)據(jù)庫(kù)的活動(dòng),例如查看等待事件、檢查是否存在死鎖等。另外,不同的數(shù)據(jù)庫(kù)環(huán)境和具體情況可能需要不同的解決方法,上述步驟僅提供了一般的指導(dǎo)。如果可能,也可以參考 Oracle 官方文檔或咨詢專業(yè)的數(shù)據(jù)庫(kù)管理員以獲取更準(zhǔn)確的解決方案。
如果你需要針對(duì)特定場(chǎng)景的更詳細(xì)的解決方法,或者在排查過程中遇到了具體的問題,可以提供更多信息,以便我能更好地幫助你解決 Oracle CPU 占用率高的問題。
同時(shí),也有一些網(wǎng)友分享了他們處理 Oracle CPU 占用率高的經(jīng)驗(yàn),供你參考:
博主 “癲狂編程” 在一次公司網(wǎng)絡(luò)中斷恢復(fù)后,遇到了數(shù)據(jù)庫(kù) CPU 占用率百分百的情況。他使用 Linux 系統(tǒng)的 “top 命令 ->p” 查出占用 CPU 最高的進(jìn)程 pid,然后在 sqlplus 中執(zhí)行以下 SQL 語(yǔ)句找到占用 CPU 最多的 SQL:
收起

sql
復(fù)制
sql_text v$sqltexta ahash_valueaaddress decodesql_hash_valueprev_hash_valuesql_hash_valuedecodesql_hash_valueprev_sql_addrsql_address v$sessionb bpaddr addr v$processc cspid piece
其中&pid是使用 top 查看系統(tǒng)中進(jìn)程占用 CPU 極高的 pid。博主發(fā)現(xiàn)問題是查詢的 where 條件字段沒有在索引里面,導(dǎo)致查詢慢。經(jīng)過重建并增加相關(guān)字段到索引解決。
博主 “拜托拜托” 由于公司沒有 DBA,遇到數(shù)據(jù)庫(kù)問題只能自己排查。他首先查詢是否存在死鎖,殺掉死鎖后發(fā)現(xiàn) CPU 沒有降下來;然后借助 PLSQL 查詢定時(shí) JOB 和 session,kill 了所有 session 后 CPU 得到緩解,但根本原因未查到,隔幾分鐘又反復(fù)了;最后查詢數(shù)據(jù)庫(kù)中的等待事件,發(fā)現(xiàn)存在等待事件,分析待執(zhí)行的 SQL 發(fā)現(xiàn)存在多表(百萬數(shù)據(jù))全量關(guān)聯(lián)查詢,于是對(duì)數(shù)據(jù)以及 SQL 進(jìn)行了相應(yīng)優(yōu)化,CPU 占用較高問題得到根本解決。
博主 “蔣健” 在處理 CPU 使用率頻頻 100% 又沒有明顯 TOP SQL 的問題時(shí),先進(jìn)行應(yīng)急處理,殺掉一批沒有事務(wù)的會(huì)話以保證業(yè)務(wù);然后分析 AWR 報(bào)告,但沒有找到明顯的 TOP SQL;接著判斷是否是硬解析導(dǎo)致 TOP SQL 不明顯,發(fā)現(xiàn)即使強(qiáng)制綁定變量后,TOP SQL 也不突出;再換個(gè)角度從對(duì)象層面進(jìn)行突破,發(fā)現(xiàn) top1 只占 16%,說明想優(yōu)化兩三個(gè) SQL 解決問題不太現(xiàn)實(shí);最后通過查看 top5 等待事件,發(fā)現(xiàn)問題可能出在存儲(chǔ)上,但由于logfileparallelwrite的高延遲在 CPU 使用率高時(shí)并不準(zhǔn)確,更多信息需參考 Oracle support 的文檔。最終選擇從優(yōu)化物理讀消耗多的 SQL 入手,定位到 top segment 后,在三張表上建立四條索引,解決了 CPU 過高的問題。
如果你使用的是 Windows 系統(tǒng),還可以參考博主 “jijm123” 的方法。他使用 qslice 工具來分析進(jìn)程的 CPU 占用率。具體步驟為:進(jìn)入 qslice 后打開 oracle 進(jìn)程,雙擊進(jìn)入并最大化彈出的窗口,觀察幾分鐘揪出頻繁出現(xiàn)的 tid;然后使用該 tid 進(jìn)行查詢問題 SQL,語(yǔ)句如下:
收起
sql
復(fù)制
sql_text v$sqltexta ahash_valueaaddress decodesql_hash_valueprev_hash_valuesql_hash_valuedecodesql_hash_valueprev_sql_addrsql_address v$sessionb bpaddr addr v$processc cspidto_number piece
不過 qslice 已無法從微軟官網(wǎng)下載,你可以從博主提供的鏈接(https://files.cnblogs.com/files/pcsky/qslice.rar)下載。
